Linux内核简单启动流程以及功能描述教程
/arch/arm/kernel/head.S
svc mode irqs disabled
get processor id
/arch/arm/kernel/head-common.S
\arch\arm\include\asm\procinfo.h
\arch\arm\kernel\asm-offsets.c
\_\_lookup\_processor\_type CPU信息的定义都放到.proc.info.init段中
CONFIG\_XIP\_KERNEL 是否片内执行
\arch\arm\kernel\head-common.S
\_\_vet\_atags验证atags或设备树(dtb)的合法性。
\_\_create\_page\_tables 建立一个临时的page table mmu
ldr r13, =\_\_mmap\_switched
\_\_enable\_mmu
跳转到\_\_mmap\_switched
b start\_kernel
\init\main.c
asmlinkage void \_\_init start\_kernel(void)
smp\_setup\_processor\_id();获取当前正在执行初始化的处理器ID。
lockdep\_init()锁的初始化
debug\_objects\_early\_init()初始化obj\_hash、obj\_static\_pool这2个全局变量,这2个全局变量会在调试的时候用到
boot\_init\_stack\_canary()初始化一些除錯相關的功能
cgroup\_init\_early()控制组进行早期的初始化
local\_irq\_disable()
tick\_init()调用 clockevents\_register\_notifier 函数向 clockevents\_chain 通知链注册元素
boot\_cpu\_init()
page\_address\_init()初始化页地址,当然对于arm这里是个空函数
setup\_arch(&command\_line)系结构相关的内核初始化过程
mm\_init\_owner(&init\_mm, &init\_task)初始化内存管理
setup\_command\_line(command\_line)处理启动命令,这里就是设置的cmd\_line
setup\_nr\_cpu\_ids()这个在定义了SMP的时候有作用
setup\_per\_cpu\_areas()CONFIG\_SMP宏,每个CPU分配内存
smp\_prepare\_boot\_cpu()则设置boot CPU的一些数据。在引导过程中使用的CPU称为boot CPU
build\_all\_zonelists(NULL)内存管理
page\_alloc\_init()初始化page allocation相关结构
parse\_early\_param()解析内核参数
pidhash\_init()初始化hash表,以便于从进程的PID获得对应的进程描述指针,按照实际的物理内存初始化pid hash
vfs\_caches\_init\_early()初始化VFS的两个重要数据结构dcache和inode的缓存
sort\_main\_extable()把编译期间,kbuild设置的异常表,也就是\_\_start\_\_\_ex\_table和\_\_stop\_\_\_ex\_table之中的所有元素进行排序
trap\_init()初始化中断向量表
mm\_init()memory map初始化
sched\_init()核心进程调度器初始化
preempt\_disable()抢占计数器加1
idr\_init\_cache()idr在linux内核中指的就是整数ID管理机制
perf\_event\_init()
rcu\_init()
radix\_tree\_init()
early\_irq\_init()中断
init\_IRQ()
prio\_tree\_init()
init\_timers()
hrtimers\_init()
softirq\_init()
timekeeping\_init()
time\_init()
profile\_init()
kmem\_cache\_init\_late()内存管理初始化
console\_init()调试
lockdep\_info()同步互斥
locking\_selftest()
page\_cgroup\_init()页面初始化
enable\_debug\_pagealloc()页面分配debug启用
debug\_objects\_mem\_init()在kmem\_caches之后表示建立一个高速缓冲池
kmemleak\_init()内存管理初始化
setup\_per\_cpu\_pageset()CPU初始化
numa\_policy\_init()内存管理初始化
sched\_clock\_init()进程管理
calibrate\_delay()CPU初始化
pidmap\_init()进程管理
anon\_vma\_init()内存管理初始化
thread\_info\_cache\_init()文件系统
cred\_init()
fork\_init(totalram\_pages)进程管理
proc\_caches\_init()
buffer\_init()
key\_init()
security\_init()
dbg\_late\_init()调试
vfs\_caches\_init(totalram\_pages)为VFS创建各种SLAB分配器缓存
signals\_init()创建信号队列
page\_writeback\_init()回写相关的初始化
cgroup\_init()在proc的根目录下创建了一个名为cgroups的文件.用来从用户空间观察cgroup的状态
cpuset\_init()
taskstats\_init\_early()进程状态初始化,实际上就是分配了一个存储线程状态的高速缓存
delayacct\_init()
check\_bugs()测试CPU的各种缺陷,记录检测到的缺陷,以便于内核的其他部分以后可以使用他们工作
acpi\_early\_init()电源相关的初始化
sfi\_init\_late()
ftrace\_init()
rest\_init()创建1号进程,详细分析之