Android培訓班 97 核心解壓過程10

2021-08-26 19:49:17 字數 1335 閱讀 7887

經過上面開啟

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...