文章目录
- 1、进入第一条指令 _text
- 2、start_kernel
- 3、总结(内核启动流程描述)
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中进行驱动的初始化、驱动模块初始化、运行第一个应用程序







![[C++]异常](https://img-blog.csdnimg.cn/direct/1471b8b8b1ff4dd1b6e7ae296065979d.png)











