close

Linux_kernel_000.png

start_kernel() 是 Linux kernel "正式的"進入點,但是 start_kernel() 通常不是在核心被載入後就立刻被執行,在它開始執行之前還有些準備工作要先完成。 在核心被載入後,通常最開始被執行的是的放在 Linux kernel image 最開頭的 bootstrap code, 負責關閉中斷,記憶體設定等硬體初始化準備工作,甚至還包含將壓縮的內核解壓縮。 這些 bootstrap code 是屬於平台架構相依的,它通常是位於 arch/xxx/boot/ 之下的 assembly code (xxx 可以是 x86 或是 arm 等)。

 

Linux_kernel_000_1.png

reset_init() 會creat 一個kernel thread:kernel_init繼續其它的initialization

 

 

Linux_kernel_001.png

PID 1 的kernel thread: kernel_init()

 

Linux_kernel_008_do_initcalls.png

 

 

Linux_kernel_002_error.png

Trace Kernel Startup原因是在Kernel Driver中加了一些Code後竟然發生Error而且Kernel Panic.仔細看是在unpack root file system到DDR中發生問題!

 

Linux_kernel_003_error.png

在做unpack_to_rootfs()時error, 加入一些pintk message 看看到底是甚麼問題!

 

Linux_kernel_004_error.png

發現root file system 放完的位置與Linux Kernel的載入起始位置overlap

 

Linux_kernel_005_kernel_load_address.png

Source Code修改Kernel Load Address=80380000

 

Linux_kernel_006_kernel_load_address.png

Makefile也要修改為80380000,Makefile其時最主要修改最上乘層的那一個即OK,但為一致性兩個都改! Linux Kernel整個重新build

 

Linux_kernel_007_kernel_load_address_change.png

重新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

 

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 peter27863043 的頭像
    peter27863043

    檸檬傻斌-無料

    peter27863043 發表在 痞客邦 留言(0) 人氣()