行號 | 說明 |
01 | 宣告後面內容為程式碼區段,。 |
02 | 已重定址的符號,程式執行到此表示已經完成重定址,這是在重定址後的新執行位址。 |
03 | 清除 eax 為 0,。 |
04 | 將 _bss(%ebx) 的值存入 edi,這是 bss 的開始位址。 |
05 | 將 _ebss(%ebx) 的值存入 ecx,這是 bss 的結束位址。 |
06 | ecx=ecx-edi,這是 bss 的體積,單位為雙字組。 |
07 | 將 ecx 轉換成位元組為單位,即 ecx=ecx*4。 |
08 | 複製資料,。 |
09 | 將 _got(%ebx) 的值存入 edi,這是 got 的開始位址。 |
10 | 將 _egot(%ebx) 的值存入 ecx,這是 got 的結束位址。 |
11~15 | 當 _got 等於 _egot,表示 got 不存在。此時重新計算 _got 的位址值,再回到判斷式,重新比較一次,應該會過關。 |
16 | 取得解壓縮的負偏移位址,存入 ebp。此值應該是 -0x50D000。 |
17 | 將解壓縮的負偏移位址(ebp)存入堆疊,這是解壓縮函式的第五個參數。 |
18 | 將解壓縮長度 4769350 存入堆疊,這是解壓縮函式的第四個參數。 |
19~20 | 取得輸入資料的位址,就是壓縮核心 vmlinux.bin.gz 的起始位址,存入堆疊,這是解壓縮函式的第三個參數。 |
21~22 | 取得 boot_heap 位址值,存入堆疊,這是解壓縮函式的第二個參數。這是 HEAP 位址值。 |
23 | 將 esi 存入堆疊,esi 指向 setup.bin 的 boot_params 的位址,這是解壓縮函式的第一個參數。 |
24 | 呼叫解壓縮函式,進行核心解壓縮程序。 |
25 | 回復堆疊到解壓縮參數存入之前的位址,即前面五個參數之前的堆疊位址。 |
26 | 取得解壓縮後的映像體積值的變數位址,此變數值是 9996376,定義在 linux/arch/x86/boot/compressed/piggy.S。 |
27 | 把 ebp 的值設定給 ebx,此時的 ebp 為 -0x50D000??。 |
28~29 | 當 ebx 是 0x100000,解壓縮後的核心不需要重定址,可以直接啟動核心。LOAD_PHYSICAL_ADDR 定義在 linux/arch/x86/include/asm/boot.h。 |
30 | 將位址減四,指向 z_output_len ??,9996372。 |
31 | 將 z_output_len 9996372 存入 ecx。?? |
32~33 | 當 ecx 的值為 0,跳躍到下一個標籤 "2:"。 |
34 | ???。看不懂,再查一下。感覺是要把核心位址(ebx)透過分頁功能調整到 0x100000??。 |
35 | 跳回上一個標籤 "1:",即第 30 行,繼續執行重定址程序。 |
37 | 清除 ebx 的值。 |
38 | 跳躍到 ebp 所指向的位址,即解壓縮後的 LINUX 核心起始位址。這是執行 LINUX 核心前的最後一個指令。核心啟動參數怎麼傳進到 LINUX 核心??。 |
39 | 宣告為 bss 區段。 |
40 | 設定對齊 16 位元組的邊界,。 |
41~42 | HEAP區段的體積值為 BOOT_HEAP_SIZE。 |
43~44 | 堆疊區域體積為 BOOT_STACK_SIZE。 |
45 | 堆疊頂端符號 boot_stack_end。 |