核心在上面處理完關閉中斷,並且確認進入系統模式後,就需要解決第乙個問題:解決自己到底在那裡執行的問題。這個問題,就好比乙個人在大海浬航行而沒有指南針,根本找不到北在那裡,急切地想知道方向在那裡。如果在白天還可以靠大陽就知道了方向,在晚上可以靠北斗星,在核心裡是否也有這樣的大自然的指示呢?在核心裡沒有天然的指示,但可以有人為的,下面就來看看核心到底是怎麼新增自己的太陽,自己的北斗星呢。核心在那裡執行,在編譯時就已經決定了,如果還不了解,可以看前面編譯的文章。如果執行位址與編譯時的不一致,就會導致很嚴重的問題產生,核心直接死掉,或者剛執行一段,就不再往下跑了,又或者執行的資料亂七八
糟,導致i/
o口亂輸出,很有可能燒掉硬體,導致裝入此軟體控制的汽車失控的危險
。其實軟體的重定位技術發展得很快,以前編譯出來的軟體,都是只能載入到固定的位置執行,不能隨便載入執行,因而不適應不同的晶元,不同的位址設計,從而導致不能固定到某個實體地址上執行。現在有了重定位技術,就解決這個問題。雖然增加了複雜性,但適應性更強了。下面就來學習這段**,如下:
.text
adr r0,lc0
ldmia r0,
subs r0,r0, r1 @ calculate the delta offset
@if delta is zero, we are
beq not_relocated @running at the address we
@were linked at.
這段**的第一行text
,先宣告還是**段。接著使用adr指令獲取lc0的位址,並儲存到r0,然後把lc0的內容載入到r1-r6,ip,sp等暫存器。通過減法指令subs來計算lc0的位址與lc0編譯儲存的位址是否一致,如果一致就跳到標號not_relocated
處執行;如果不一致就繼續執行下面的重定位**。
Android培訓班 96 核心解壓過程9
前面已經把定位的資料通重載入 lc0結構來載入到暫存器裡,已經具備了定位的條件。那麼核心進行重定位主要做些什麼事情呢?要了解整個過程,當然要學習編譯原理,因為進行重定位之後,主要是為了建立 c語言的執行環境的需求。由於 c語言是基於棧式的語言,又有全域性變數,說明記憶體結構至少有兩個,乙個是全域性資...
Android培訓班 97 核心解壓過程10
經過上面開啟 mmu 之後,就進入了另乙個主要環節,就是把壓縮的核心 解壓出來,變換回原來可執行 的模樣,這樣才可以讓 cpu理解並執行相應的指令。由於載入壓縮的核心就占用了一定的記憶體空間,如果這個壓縮的核心比較大,而物理記憶體比較小,那麼解壓後的核心就會把未解壓部份的核心資料覆蓋,否則就可以採用...
Android培訓班 100 核心解壓過程13
有了檔案的格式,就可以按圖索驥,也就是根據檔案的格式來分析壓縮資料了。但檔案格式只是一種儲存的格式,還需要演算法才可以把資料解壓出來,下面就來理解gzip的壓縮演算法。gzip使用deflate的壓縮演算法來進行壓縮資料,這是一種無損的壓縮演算法,主要組合lz77和huffman的壓縮演算法。lz7...