arm linux内核启动流程?linux内核分为哪三个部分
这篇文章给大家聊聊关于arm linux内核启动流程,以及linux内核分为哪三个部分对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。
Cortex-M/R 内核启动过程 / 程序启动流程(基于ARMCC、Keil)
ARM Cortex-M/R内核启动过程不同于其他大多数 CPU,主要特点是其复位启动过程从特定地址开始,而非从 0x00000000处。在启动过程中,ARM Cortex-M/R内核中断向量表的位置默认位于特定地址,但这一位置可以改变。启动流程通常包括以下关键步骤:
1.**内核初始化**:在用户定义的 main()函数启动之前,需要进行一系列初始化操作,称为启动代码或启动代码。这包括调用 C库中的预编译和预组装代码段,以及链接器根据应用程序从 C库中包含必要的代码,以便为应用程序创建自定义启动代码。
2.**堆栈和堆初始化**:在 main()函数调用之前,`__rt_entry`调用 `__rt_lib_init`函数来初始化 C库子系统,包括堆栈和堆。堆栈和堆的初始化取决于用户指定的方法,可以是通过特定函数或自动设置。
3.**执行 main()**:初始化完成后,main()函数被调用,开始应用程序的执行。main()函数接收参数,并在返回时,其返回值将被传递给 `exit()`函数,从而退出应用程序。
启动实例分析部分展示了 STM32F407VG片子在 Keil5中调试时的汇编代码,重点查看中断向量表部分,以及如何进行初始化和执行 main()函数。
启动文件方面,大多数 MCU厂商提供了通用的启动文件,编程者也可根据需要自定义。以 STM32启动文件 startup_stm32f407xx.s为例,该文件包含了内核初始化、中断处理以及 main()函数调用等关键部分。
文章最后的参考资料部分包括 Linux内核源码分析学习资源和一个学习交流群链接。注意,群链接已删除。文章中提到的资源链接和群交流机会对学习 ARM库分析、Cortex-M/R内核启动过程以及相关技术知识非常有帮助。
qemu调试kernel启动(从第一行汇编开始)
在深入理解Linux启动流程时,关注的焦点通常在于start_kernel之后的内核初始化,但在正式调试之前,先要知道从第一行汇编代码开始的调试方法。关键步骤在于正确加载symbols到物理或虚拟地址,这取决于MMU的状态。
在使用qemu进行调试时,启动时添加-S选项会显示物理地址,如0x0000000040000000,但需注意不同qemu版本可能有所不同,以Ubuntu 22.04自带的6.2.0版本为例,kernel的物理起始地址是0x40200000。而在vmlinux中,_text段的虚拟地址为0xffff800080000000。
为了将物理地址和vmlinux中的地址对齐,需要查看qemu源码中的hw/arm/boot.c部分,确认哪些段需要映射。例如,通过add-symbol-file命令,指定如下地址映射关系:.head.text到0x40200000,.text到0x40210000等。设置断点在_text处,如b _text,即可开始单步调试。
总结来说,不论是哪种调试器,首要任务是将elf文件的执行地址与目标执行地址(物理或虚拟)对齐,这是调试入口的关键。理解并掌握这一原则,能让你更有效地进行内核调试工作。
Linux启动过程与级别,以ARM-RK3566开发板系统为例
Linux启动过程与级别详解,以ARM-RK3566开发板系统为例。
Linux启动流程分为三个关键步骤:BootLoader-> kernel-> RootFilesystem。系统启动后,BootLoader执行内核加载,随后内核初始化硬件与驱动,调用init程序。init程序根据/etc/inittab文件决定默认运行级别,执行/etc/init.d/rc脚本,按顺序启动指定级别下的服务。
系统级别的对应如下:
runlevel 0:系统停机状态,运行级别不能设为0,否则不能正常启动。
runlevel 1:单用户工作模式,root权限,用于系统维护,禁止远程登录。
runlevel 2:多用户工作模式(但不支持NFS),命令行模式登陆。
runlevel 3:完全多用户工作模式(有NFS),命令行模式登陆。
runlevel 4:未使用的系统模式,保留。
runlevel 5: X11图形模式,登陆后进入图形GUI模式。
runlevel 6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动。
内核启动过程包含以下步骤:
1.初始化硬件与驱动。
2.调用init程序。
3. init程序读取/etc/inittab文件决定运行级别。
4.执行/etc/init.d/rc脚本,参数为运行级别。
5.按顺序执行对应级别的服务脚本。
重启或关机时,系统根据指令切换运行级别,执行对应脚本关闭服务。
传统Init启动系统采用SysV init进程处理启动过程,被认为效率较低。systemd系统启动方式旨在减少引导时间和计算开销,提供更高效的服务控制。
使用ln命令设置运行级别,创建链接文件到默认target。systemd启动默认启动graphical.target或multi-user.target,启动顺序遵循依赖规则。
通过查看default.target配置,了解启动服务的描述、文档位置、依赖关系等信息。允许isolate命令切换到指定服务,实现更精细的启动控制。
systemd启动流程为:启动默认target,递归处理依赖关系,从multi-user.target开始,逐步启动其他服务。