Arm linux 啟動流程

2021-06-19 19:32:11 字數 1636 閱讀 1184

了解完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 核心檔案位置 ...