内核启动流程—走马观花

汇编阶段:

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();
用于处理对称多处理器

扫描二维码关注公众号,回复: 1892594 查看本文章

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();里的流程,和板级初始化函数的调用流程

转于http://lornyin.top/?p=104

猜你喜欢

转载自blog.csdn.net/a1171936767/article/details/76149152