start_kernel() 是 Linux kernel "正式的"進入點,但是 start_kernel() 通常不是在核心被載入後就立刻被執行,在它開始執行之前還有些準備工作要先完成。 在核心被載入後,通常最開始被執行的是的放在 Linux kernel image 最開頭的 bootstrap code, 負責關閉中斷,記憶體設定等硬體初始化準備工作,甚至還包含將壓縮的內核解壓縮。 這些 bootstrap code 是屬於平台架構相依的,它通常是位於 arch/xxx/boot/ 之下的 assembly code (xxx 可以是 x86 或是 arm 等)。
reset_init() 會creat 一個kernel thread:kernel_init繼續其它的initialization
PID 1 的kernel thread: kernel_init()
Trace Kernel Startup原因是在Kernel Driver中加了一些Code後竟然發生Error而且Kernel Panic.仔細看是在unpack root file system到DDR中發生問題!
在做unpack_to_rootfs()時error, 加入一些pintk message 看看到底是甚麼問題!
發現root file system 放完的位置與Linux Kernel的載入起始位置overlap
Source Code修改Kernel Load Address=80380000
Makefile也要修改為80380000,Makefile其時最主要修改最上乘層的那一個即OK,但為一致性兩個都改! Linux Kernel整個重新build
重新reboot後成功載入rootfs!
do_initcalls 的原理 http://huenlil.pixnet.net/blog/post/26661972-%5B%E8%BD%89%5Ddo_initcalls-%E7%9A%84%E5%8E%9F%E7%90%86
platform_get_resource http://www.techbulo.com/2146.html
留言列表