經過上面開啟
mmu**之後,就進入了另乙個主要環節,就是把壓縮的核心**解壓出來,變換回原來可執行**的模樣,這樣才可以讓
cpu理解並執行相應的指令。由於載入壓縮的核心就占用了一定的記憶體空間,如果這個壓縮的核心比較大,而物理記憶體比較小,那麼解壓後的核心就會把未解壓部份的核心資料覆蓋,否則就可以採用更簡單的方法來解壓了,直接寫入相應的位置就行了。下面這段**裡,
r4是解壓核心的開始位址,
r5是未解壓正在執行的核心檔案開始位置,
r2是未解壓正在執行的核心檔案堆疊位置偏移
64k的位置。當
r4大於等於
r2時,就是意味著解壓後的核心在目前執行檔案後面,因此直接寫入就可以,不用考慮覆蓋的問題,跳到
wont_overwrite
標號執行。當
r4加上解壓後核心的長度小於
r5時,就是意味著解壓後的核心永遠在當前執行核心的前面,因此也直接寫入就可以,不用考慮覆蓋的問題,跳到
wont_overwrite
標號執行。其它情況,就需要先考慮把核心解壓出來,放到乙個臨時地方,並不能直接放到
r4直接開始位置了,然後再通過解壓後的一段**把臨時地方的核心進行重定位操作,才可以再執行。從一段簡單的核心**,就可以看到考慮的條件要面面俱到,否則就會很容易出錯的。
/**check to see if we will overwrite ourselves.
* r4 = final kernel address
* r5 = start of this image
* r2 = end of malloc space (and therefore this image)
*we basically want:
* r4 >= r2 -> ok
* r4 + image length <= r5 -> ok
*/cmp r4,r2
bhs wont_overwrite
sub r3,sp, r5 @ > compressed kernel size
add r0,r4, r3, lsl #2 @ allow for 4x expansion
cmp r0,r5
bls wont_overwrite
mov r5,r2 @ decompress after malloc space
mov r0,r5
mov r3,r7
bl decompress_kernel
add r0,r0, #127 + 128 @ alignment + stack
bic r0,r0, #127 @ align the kernel length
Android培訓班 95 核心解壓過程8
核心在上面處理完關閉中斷,並且確認進入系統模式後,就需要解決第乙個問題 解決自己到底在那裡執行的問題。這個問題,就好比乙個人在大海浬航行而沒有指南針,根本找不到北在那裡,急切地想知道方向在那裡。如果在白天還可以靠大陽就知道了方向,在晚上可以靠北斗星,在核心裡是否也有這樣的大自然的指示呢?在核心裡沒有...
Android培訓班 96 核心解壓過程9
前面已經把定位的資料通重載入 lc0結構來載入到暫存器裡,已經具備了定位的條件。那麼核心進行重定位主要做些什麼事情呢?要了解整個過程,當然要學習編譯原理,因為進行重定位之後,主要是為了建立 c語言的執行環境的需求。由於 c語言是基於棧式的語言,又有全域性變數,說明記憶體結構至少有兩個,乙個是全域性資...
Android培訓班 100 核心解壓過程13
有了檔案的格式,就可以按圖索驥,也就是根據檔案的格式來分析壓縮資料了。但檔案格式只是一種儲存的格式,還需要演算法才可以把資料解壓出來,下面就來理解gzip的壓縮演算法。gzip使用deflate的壓縮演算法來進行壓縮資料,這是一種無損的壓縮演算法,主要組合lz77和huffman的壓縮演算法。lz7...