内核启动流程—走马观花
匯編階段:
ensure svc mode
and irqs disabled
@76確保cpu運行與svc模式,中斷關(guān)閉
get processor id
@78獲取cpu id
r5=procinfo r9=cpuid
invalid processor (r5=0)?
@79 和__proc_info lists 里比較,不能找到id就 r5 = 0
bl __vet_atags
@97 驗證內(nèi)核標(biāo)記列表,r2指向內(nèi)核標(biāo)記列表是否4字節(jié)對齊,是否以ATAG_CORE開始
bl __create_page_tables
創(chuàng)建臨時頁表
ldr r13, =__mmap_switched
把__mmap_switched地址放到r13,在mmu開啟后調(diào)用他搬運數(shù)據(jù)
1: b __enable_mmu –> __turn_mmu_on
開啟mmu
執(zhí)行數(shù)據(jù)搬運,清除BSS段調(diào)用start_kernel
c語言階段:
init/man.c
smp_setup_processor_id();
用于處理對稱多處理器
lockdep_init();
debug_objects_early_init();
初始化鎖的狀態(tài)跟蹤模塊
boot_init_stack_canary();
cgroup_init_early();
控制組早期初始化,控制組會分配不同進程的資源
local_irq_disable();
early_boot_irqs_disabled = true;
關(guān)閉中斷
tick_init();
初始化時鐘事件管理
boot_cpu_init();
激活第一個處理器,設(shè)置當(dāng)前的cpu為可用狀態(tài)
page_address_init();
初始化高端內(nèi)存的映射表
printk(KERN_NOTICE “%s”, linux_banner);
打印版本信息,編譯主機
setup_arch(&command_line);
對體系構(gòu)架進行初始化,獲取uboot傳入的參數(shù)
setup_command_line(command_line);
保存?zhèn)魅氲膮?shù)
setup_nr_cpu_ids();
給nr_cpu_ids賦值,表示可能的cpu數(shù)量
smp_prepare_boot_cpu
smp引導(dǎo)(多cpu)
build_all_zonelists(NULL);
page_alloc_init();
初始化所有內(nèi)存管理節(jié)點,設(shè)置內(nèi)存頁分配通知器
printk(KERN_NOTICE “Kernel command line: %s\n”, boot_command_line); //499
parse_early_param();
parse_args
打印傳入的參數(shù)并解析
sort_main_extable();
排序異常表
trap_init();
對異常進行初始化
mm_init();
開啟內(nèi)存配置器
sched_init();
設(shè)置調(diào)度程序
idr_init_cache();
創(chuàng)建 IDR機制的高速緩存對象
rcu_init();
讀-復(fù)制-跟新機制初始化
early_irq_init();
init_IRQ();
init_timers();
初始化引導(dǎo)cpuu的定時器相關(guān)的數(shù)據(jù)結(jié)構(gòu)注冊定時器,設(shè)置軟中斷
hrtimers_init();
初始化高精度定時器
softirq_init();
軟中斷初始化
timekeeping_init();
初始化系統(tǒng)時鐘計時器 資源和共同的變量
profile_init();
分配 內(nèi)核性能統(tǒng)計保存變量的內(nèi)存
console_init();
串口初始化
lockdep_info();
打印鎖的依賴信息(默認關(guān)閉)
locking_selftest();@570
當(dāng)irq 被開啟時,要測試 鎖 是否正常
setup_per_cpu_pageset();
分配并設(shè)置每個CPU頁面集
pidmap_init();
cred_init();
初始化憑證
fork_init(totalram_pages);
“fork()” 是用來產(chǎn)生 child process 的 system call,當(dāng) parent process 想要執(zhí)行外部程式時,會先 fork child process,接著 child process 再利用 exec system call 自己的空間取代為外部程式。
vfs_caches_init(totalram_pages);
初始化虛擬文件系統(tǒng)的緩存
signals_init();
page_writeback_init();
文件系統(tǒng)可能會需要page-writeback
cpuset_init();
初始化CPU集合的內(nèi)存分配變量,限制進程允許分配的內(nèi)存大小
cpuset_init(); @614
初始化top_cpuset和CPUSET內(nèi)部文件系統(tǒng)
taskstats_init_early();
初始化任務(wù)狀態(tài)相關(guān)的緩存、隊列和信號量
delayacct_init();
初始化任務(wù)延遲機制
acpi_early_init();
初始化ACPI電源管理
ftrace_init();
內(nèi)核跟蹤模塊
rest_init();
創(chuàng)建并運行內(nèi)核初始化線程init
后續(xù)我會更新reset_init();里的流程,和板級初始化函數(shù)的調(diào)用流程
轉(zhuǎn)于http://lornyin.top/?p=104
總結(jié)
以上是生活随笔為你收集整理的内核启动流程—走马观花的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS 集成银联支付
- 下一篇: 木棒,POJ(1011)