您好,登錄后才能下訂單哦!
秉心識本源,於事少凝滯。-- 《信行遠修水筒》
要想完全的了解一個系統唯一的方法就是去閱讀這個系統的源代碼實現!這個原則對于一個iOS程序員也是如此。很幸運的是我們現在處于一個開源代碼迸發的美好時代(這里要感謝理查·馬修·斯托曼以及他的GNU計劃),很多優秀的庫都以源代碼的形式呈現給大家,甚至連iOS這種封閉的系統也迫于某種壓力開放了部分源代碼(雖然開放的部分并不一定和真實的相同),這也已經足以給了我們很多熱情去窺探其內部的一些實現機制。目前網絡上也有非常多的基于蘋果的開源而介紹OC2.0的runtime原理以及runloop實現機制以及類的+load方法執行時機等等方面的文章。
當我們希望走更遠時就會發現有一座大山阻擋著我們的去路。因為系統的閉源特性使得我們無法閱讀到其中所有的源代碼以及核心實現。那么是否我們就只能裹足不前了呢?
回答是NO!
源代碼有高級形式的源代碼也有低級形式的源代碼。當我們被高級形式的源代碼所阻時,低級形式的源代碼卻依舊為我們敞開著大門,就看你愿不愿意去找那把鑰匙并打開它。低級形式的源代碼是什么呢? 答案就是機器指令!!
我們知道凡是滿足某個操作系統ABI規則的應用程序源代碼最終都會編譯和鏈接為某種特定格式的一條條機器指令并在CPU上執行。如果說程序的高級語言實現對于一個程序員來說是它的源代碼的話,那么對于CPU來說一個程序的機器指令序列就是它的源代碼。只不過機器語言對于很多人來說異常的晦澀難懂而已。
很高興的一件事情就是雖然機器語言晦澀,我們的前輩們發明出了一種所謂機器語言的助記語言:匯編語言
匯編語言中的每條命令雖然幾乎和每條機器指令一一對應,但是卻增強了程序的可讀性,使得我們面臨的不再是一串干巴巴的二進制數字了。君不見目前很多的反編譯工具以及即使是XCODE上我們都能看到匯編語言的場景。正是因為匯編語言的出現使得我們在閱讀和分析源代碼上就進了一大步!
當你精通匯編語言時!你看到的所有代碼都將是源代碼!
有人說匯編語言相對于高級語言來說依然晦澀難懂,但這其實并不是絕對的。曾記得中國第一代程序員的求伯君以及雷軍這些前輩們最早接觸的就是匯編語言,而且他們也都是用匯編語言進行程序編寫的。就因為匯編語言離機器語言太近了,所以大家都會有一種望而生畏的感覺。誠然這些低級語言并沒有像我們使用的高級語言那樣更加符合自然語義和語法規則,但是它的優點就是非常的直接和單純。當你深入的應用它時就會發現匯編其實并沒有那么的復雜。在一個程序的機器指令中,大部分的指令代碼所做的事情除了計算外就是將數據在寄存器與寄存器之間以及寄存器與內存之間進行移動。在高級語言中我們可以定義非常個性化的變量以及無限制的變量,而在低級語言中我們則只能使用那幾個有限的寄存器來作為臨時變量,以及像訪問數組那樣去訪問內存地址。
下面的一張圖可以看到實現一個累加功能代碼片段的機器語言和匯編語言以及高級語言之間的差別:
看上面的代碼時也許你對高級語言所表達的意義一目了然,而對于匯編語言的表達也許仔細多讀幾遍就能了解其意義,而對于機器語言則可能是一頭霧水了。
說了這么多,也許有人會問匯編語言和我想要深入iOS系統底層有什么關系!
好問題! 答案就是iOS系統的封閉性,使得我們無法窺探到很多系統的底層實現, 并且當我們被某種問題或者某個實現原理所困擾卻不得其法時,就可以通過對系統進行反編譯而得到匯編語言來了解和閱讀其實現原理;當我們面臨突如其來的運行時崩潰時,就可以通過閱讀匯編語言來了解其產生的原因;當我們的crash并沒有上下文時,就可以通過匯編語言來定位和解決問題;當我們想解決某個問題而想做動態下發補丁時我們也可以借助匯編語言來完成;當我們想在越獄的機器上hook住某些應用時我們可以通過匯編語言來完成功能;當我們想最大的優化我們的系統以及某些關鍵部分的代碼的性能時我們可以借助匯編語言;當我們想當一個***時我們可以借助匯編語言...,我們能借助匯編語言做的事情實在是太多太多了。 現在的應用編程語言都是越來越向高級語言發展,而呈現出簡單化、智能化從而導致進入的門檻越來越低。越高級的語言因為其封裝性就越離底層實現原理越遠,你所能窺探的東西就越少,因此低級語言還是非常具有頑強的生命力和存在必要性的。君不見iOS所開源的runtime的源代碼里面關于objc_msgSend函數的實現就是用匯編語言來編寫的!這樣的目的就是讓這個函數的性能得到最大的優化。
所以說掌握和了解匯編語言知識不僅是進入iOS系統底層并且也是進入所有系統底層的一把鑰匙,當你精通或者了解一些基礎的匯編語言知識和技巧時,你就打開了通往一切都是源代碼的大門。值得一提的就是我并不打算詳細的去介紹關于匯編的一切,其實我們只要了解一些基礎的匯編知識就能非常方便的幫助我們解決很多的事情。
敬請期待下一篇:深入iOS系統底層之指令集介紹
一直想寫一些關于系統底層方面的知識點,并且醞釀了很久。后來也跟其他人交流,你為何不出一個系列呢? 不必要一次性把所有的東西都寫完后才發表。我聽說后覺得非常的有道理,因此我想在這里分享一些介紹iOS系統底層的一系列文章。這是第一篇開頭的引子,雖然自己的水平也很一般,但是想想自己還是有一些積累的,即使是有問題或者是有錯誤也可以發表出來供大家評論和指責嗎。最終的目的是大家共同進步,只要達到了這一點我也就滿足了。后續的日子我將會爭取每周在這個系列中對iOS系統底層進行一系列的展開,先列出一個大概的綱要,當然也許后續會有變化:
目錄
1.深入iOS系統底層之匯編語言
2.深入iOS系統底層之指令集介紹
3.深入iOS系統底層之XCODE對匯編的支持介紹
4.深入iOS系統底層之CPU寄存器介紹
5.深入iOS系統底層之機器指令介紹
6.深入iOS系統底層之賦值指令介紹
7.深入iOS系統底層之函數調用介紹
8.深入iOS系統底層之其他常用指令介紹
9.深入iOS系統底層之函數棧介紹
10.深入iOS系統底層之函數棧(二)介紹
11.深入iOS系統底層之不定參數函數實現原理介紹
12.深入iOS系統底層之在高級語言中嵌入匯編語言介紹
13.深入iOS系統底層之常見的匯編代碼片段介紹
14.深入iOS系統底層之OC中的各種屬性以及修飾的實現介紹
15.深入iOS系統底層之ABI介紹
16.深入iOS系統底層之編譯鏈接過程介紹
17.深入iOS系統底層之可執行文件結構介紹
18.深入iOS系統底層之MACH-O文件格式介紹
19.深入iOS系統底層之映像文件操作API介紹
20.深入iOS系統底層之知名load command結構介紹
21.深入iOS系統底層之程序加載過程介紹
22.深入iOS系統底層之靜態庫介紹
23.深入iOS系統底層之動態庫介紹
24.深入iOS系統底層之framework介紹
25.深入iOS系統底層之基地址介紹
26.深入iOS系統底層之模塊內函數調用介紹
27.深入iOS系統底層之模塊間函數調用介紹
28.深入iOS系統底層之機器指令動態構造介紹
29.深入iOS系統底層之crash問題解決方法
30.深入iOS系統底層之無上下文crash解決方法
31.深入iOS系統底層之常用工具和命令的實現原理介紹
32.深入iOS系統底層之真實的OC類內存結構介紹
歡迎大家訪問我的github地址和簡書地址
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。