Saturday, May 8, 2010

S3C2440 - Kernel - Booting from zImage

最近開始陸陸續續 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: