了解完kernel啟動以前的彙編之後我們來看看正式的c語言啟動**,也就是我們的start_kernel函式了。start_kernel相當大,裡面每乙個呼叫到的函式都足夠我們傷腦筋了,我這裡只是淺嘗輒止的描述一下函式的功能,從而對kernel啟動的過程有乙個比較直觀的了解。很多函式真正理解需要對linux相關體系有很深的了解,暫時沒有時間深入,留待以後了。
說實話啟動的**看到現在唯一的感覺就是kernel的全域性變數實在太多了,要了解乙個過程跟蹤乙個變數的值的變化相當痛苦啊,不過耐心看下來,收穫還是比較豐富的,對很多概念都有了乙個比較直觀的理解。閒話就不多說了,直接來上**~~
smp_setup_processor_id();
//這個函式現在是空的;
lockdep_init();
//runtime locking correctness validator, see documentation/lockdep_design.txt
debug_objects_early_init();
cgroup_init_early();
//control group, read documentation/cgroup.txt
local_irq_disable();
//使用arm cpsid i指令來禁止irq
early_boot_irqs_off();
early_init_irq_lock_class();
lock_kernel();
tick_init();
//和時鐘相關的初始化,好像是註冊notify事件,沒有仔細研究過
boot_cpu_init();
//這個實際上是在smp環境下選擇cpu,這裡直接cpuid選擇的是0號cpu
page_address_init();
//初始化high memory,在arm環境下實際上這個函式是空的,也就是說arm不支援high memory
printk(kern_notice);
printk(linux_banner);
//這裡的ker_notice是字串<5>,不太明白它的意思。。。後面的linux_banner定義在kernel/init/version.c裡面,這裡的printk是門高深的學問,以後看console的時候會仔細分析
setup_arch(&command_line);
request_standard_resources(&meminfo, mdesc);
這個函式用來申請一些應該是記憶體資源,具體的內容沒有仔細研究,看不大懂。。
cpu_init();
初始化cpu,這裡主要是對arm暫存器cpsr的操作
init_arch_irq = mdesc->init_irq;
system_timer = mdesc->timer;
init_machine = mdesc->init_machine;
這裡將體系結構相關的幾個函式,中斷,初始化,定時器之類的賦值給kernel全域性變數;
conswitchp = &vga_con;
這裡設定了關於console的乙個變數,具體不知道怎麼用的,以後看console的時候再仔細分析
early_trap_init();
不知道這個函式具體做什麼用的。。。 */
Arm linux啟動流程
linux啟動 分為以下三部分 彙編編寫的體系結構相關的部分 c語言編譯的體系結構相關的部分 c語言編譯的體系結構無關的部分 核心映象的生成 核心啟動流程 1.彙編部分 核心啟動入口 核心編譯連線後生成的elf映像檔案是vmlinux,從核心源 頂層目錄的makefile中可以找到vmlinux的生...
arm linux 啟動流程分析
arm linux啟動總體過程 bootloader kernel rootfs.bootloader 一般的soc中一般會有一塊sdram 又叫墊腳石 當soc上電時,soc中固化的 會根據啟動方式從nand,emmc等不同儲存上,載入bootloader到sdram,進而執行。也就是說soc上電...
ARM linux 啟動流程 整理
基本的初始化工作 關閉看門狗,設定ddr nand flash 啟動核心 kernel初始化步驟 進入kernel階段,系統會先探測可識別的所有硬體裝置 隨後系統會載入裝置驅動程式,並生成乙個臨時唯讀的rootfs系統 在執行了rootfs後,系統將開始執行第乙個初始化程式 init 核心檔案位置 ...