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开始,逐步启动其他服务。

阅读剩余
THE END