1、进入第一条指令 _text
编译内核后,打开System.map文件,找到对应的_text
和start_kernel
ffffff8008080000 T _text //第一条指令
ffffff80096007f4 T start_kernel //内核初始化
查找地址对应的文件位置
aarch64-linux-gnu-addr2line ffffff8008080000 -e vmlinux -f
访问内核目录下的arch/arm64/kernel/head.S
程序
2、start_kernel
板子上电,输入dmesg打印内核启动日志
3、总结(内核启动流程描述)
一阶段
:内核首先通过找到第一条指令_text
的函数入口地址,进入head.S
文件并跳转到stext处,保存uboot传入参数、异常级别设置、CPU的初始化,跳转到primary_switch
中,使能MMU、内核重定位、初始化内核任务、设置异常向量表后
跳转到start_kernel
(c语言部分)
二阶段
: 在init/main.c的start_kernel
函数中(对应demsg日志)打印版本信息、体系结构安装、设备树解析、安装命令行参数、系统调用初始化、内存管理初始化、中断时钟定时器初始化、控制台进程信号初始化后跳转到rest_init()
三阶段
:rest_init()
中,创建内核线程,1号进程init和2号守护进程,在1号进程kernel_init中进行驱动的初始化、驱动模块初始化、运行第一个应用程序