最近開始陸陸續續 trace Linux Kernel. 從最早的 boot loader 開始, 到現在的 kernel. 也正因為如此開始找了 simulator, 因為我本來的一台 pc 掛點了, 所幸 cygwin 強大的幫忙之下, 終於可以在 windows 上面 build 出可以相容的 linux kernel 了. 可是目前 debug 和 simulator 還是有點問題. 所以就一邊作一邊 trace code 了.
kernel 的起始點有分兩種, 一種是沒有壓縮過的 vmlinux, 另外一種就是 zImage 了. 兩者差別在於是否有經過 gunzip 壓縮了. 以下會介紹 zImage 的 booting 方式.
起始點在 linux/arch/arm/boot/compressed/head.S ( 結尾是大寫的 S, 差異性這裡就不多說了 ). 因為是 assembly code, 所以有些指令常常需要翻來翻去才能理解.
這隻 head.S 大致上要作的事情就是檢查傳進來的參數, 檢查是否要作 reloactor 動作 ( 因為要為了跨平台 ), 把 cache 打開作解壓縮動作. 最後關掉 Cache / MMU 跳到 kernel 進入點也就是第一種做法的進入點.
說的倒是很簡單, 可是暫存器精簡到不行, 建議還是拿simulator 實際跑跑看才會比較知道為何要設定這些 register. 或是拿張紙筆紀錄一下也是一種方法.
No comments:
Post a Comment