汇编阶段:
ensure svc mode
and irqs disabled
@76确保cpu运行与svc模式,中断关闭
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 验证内核标记列表,r2指向内核标记列表是否4字节对齐,是否以ATAG_CORE开始
bl __create_page_tables
创建临时页表
ldr r13, =__mmap_switched
把__mmap_switched地址放到r13,在mmu开启后调用他搬运数据
1: b __enable_mmu –> __turn_mmu_on
开启mmu
mov r3, r3
mov r3, r13
mov pc, r3
执行数据搬运,清除BSS段调用start_kernel
c语言阶段:
init/man.c
smp_setup_processor_id();
用于处理对称多处理器
lockdep_init();
debug_objects_early_init();
初始化锁的状态跟踪模块
boot_init_stack_canary();
cgroup_init_early();
控制组早期初始化,控制组会分配不同进程的资源
local_irq_disable();
early_boot_irqs_disabled = true;
关闭中断
tick_init();
初始化时钟事件管理
boot_cpu_init();
激活第一个处理器,设置当前的cpu为可用状态
page_address_init();
初始化高端内存的映射表
printk(KERN_NOTICE “%s”, linux_banner);
打印版本信息,编译主机
setup_arch(&command_line);
对体系构架进行初始化,获取uboot传入的参数
setup_command_line(command_line);
保存传入的参数
setup_nr_cpu_ids();
给nr_cpu_ids赋值,表示可能的cpu数量
smp_prepare_boot_cpu
smp引导(多cpu)
build_all_zonelists(NULL);
page_alloc_init();
初始化所有内存管理节点,设置内存页分配通知器
printk(KERN_NOTICE “Kernel command line: %s\n”, boot_command_line); //499
parse_early_param();
parse_args
打印传入的参数并解析
sort_main_extable();
排序异常表
trap_init();
对异常进行初始化
mm_init();
开启内存配置器
sched_init();
设置调度程序
idr_init_cache();
创建 IDR机制的高速缓存对象
rcu_init();
读-复制-跟新机制初始化
early_irq_init();
init_IRQ();
init_timers();
初始化引导cpuu的定时器相关的数据结构注册定时器,设置软中断
hrtimers_init();
初始化高精度定时器
softirq_init();
软中断初始化
timekeeping_init();
初始化系统时钟计时器 资源和共同的变量
profile_init();
分配 内核性能统计保存变量的内存
console_init();
串口初始化
lockdep_info();
打印锁的依赖信息(默认关闭)
locking_selftest();@570
当irq 被开启时,要测试 锁 是否正常
setup_per_cpu_pageset();
分配并设置每个CPU页面集
pidmap_init();
cred_init();
初始化凭证
fork_init(totalram_pages);
“fork()” 是用來產生 child process 的 system call,當 parent process 想要執行外部程式時,會先 fork child process,接著 child process 再利用 exec system call 自己的空間取代為外部程式。
vfs_caches_init(totalram_pages);
初始化虚拟文件系统的缓存
signals_init();
page_writeback_init();
文件系统可能会需要page-writeback
cpuset_init();
初始化CPU集合的内存分配变量,限制进程允许分配的内存大小
cpuset_init(); @614
初始化top_cpuset和CPUSET内部文件系统
taskstats_init_early();
初始化任务状态相关的缓存、队列和信号量
delayacct_init();
初始化任务延迟机制
acpi_early_init();
初始化ACPI电源管理
ftrace_init();
内核跟踪模块
rest_init();
创建并运行内核初始化线程init
后续我会更新reset_init();里的流程,和板级初始化函数的调用流程