- 2025-01-20
-
加入了学习《自己动手写嵌入式操作系统》,观看 自己动手写操作系统
- 2025-01-19
-
发表了主题帖:
《Linux内核深度解析》初见 - 第一章 内核引导和初始化
本帖最后由 大壮嘎嘎壮 于 2025-1-19 17:26 编辑
.globl _start
_start:
岁聿云暮,一元复始,最近终于得空抽出时间来阅读这本《Linux内核深度解析》。
一、Boot阶段
在嵌入式系统中,BOOT(引导加载程序)扮演着至关重要的角色,它负责初始化硬件、加载操作系统内核或其他应用程序,并为系统的正常运行做好准备。
本文介绍的是嵌入式设备常用的U-Boot引导程序,U-Boot分为SPL和正常的U-Boot程序两部分。SPL(Secondary Program Loader)意为第二段程序加载器,明明作为引导程序首先出场的角色为什么要叫第二段呢,这个第二段是相对于固化在芯片内部的bootrom来说的。处理器启动时首先执行的是芯片内部固化的程序,固化程序加载SPL,SPL加载正常的U-Boot程序。由于芯片内部寸土寸金,片上内存比较小,所以才采用这种方式进行初始化内存和储存设备及一些外设,为内核的加载或者固件的更新下载做准备。Uboot最后调用boot_Jump_linux函数,跳转到linux内核。至此,uboot使命结束,CPU控制权交给内核。
二、Kernel阶段
1.初始化
内核初始化分为汇编语言和C语言部分。
汇编语言中主要执行了以下几个函数进行了一些基本的初始化流程:
(1)el2-setup:配置执行内核的异常级别。
(2)__create_page_tables:页表映射
(3)__primary_switch:开MMU
(4)__primary_switched:栈、异常向量表。数据段等初始化,调用start_kernel函数
内核初始化的C语言的入口函数是start_kernel函数,start_kernel函数的主要职责如下:
(1)设置页表和内存管理:
初始化页表,确保内核能够正确地管理内存。设置内存管理单元(MMU)的配置。
(2)初始化硬件:
初始化处理器和硬件架构相关的设置。设置中断和异常处理。
(3)内核数据结构初始化:
初始化各种内核数据结构,如调度器、进程控制块(task_struct)、内存管理等。
(4)设备驱动初始化:
初始化设备驱动框架,为内核支持的设备做好准备。
(5)文件系统初始化:
初始化虚拟文件系统(VFS)和根文件系统。
(6)启动内核线程:
启动内核守护进程和必要的内核线程,如 kswapd(内存回收守护进程)、kworker(工作线程)等。
(7)用户空间启动:
挂载根文件系统。启动第一个用户空间进程(通常是 init 进程)。
2.init进程
init进程是用户空间的第一个进程,主要有以下作用:
(1)启动系统服务:
init进程负责启动各种系统服务,如网络服务、打印服务等。这些服务通常通过运行级别(run levels)来管理,不同的运行级别对应不同的系统状态和服务组合。
(2)管理用户登录:
init进程还负责启动getty进程,用于用户登录。在系统完全启动后,init会为每个用户已退出的终端重启getty,以便下一个用户可以登录。
(3)处理孤儿进程:
当一个进程启动了一个子进程并且在子进程之前终止时,这个子进程会成为孤儿进程。init进程会接管这些孤儿进程,确保它们不会成为僵尸进程(zombie process)。
(4)系统初始化:
init进程还承担挂载文件系统、初始化属性系统和Klog、selinux的初始化等重要任务。它通过解析init.rc脚本来初始化系统daemon服务进程。
- 2024-12-11
-
回复了主题帖:
读书入围名单: 《Linux内核深度解析》
确认,可以完成阅读分享计划
- 2024-11-28
-
加入了学习《基于Arduino玩转pico RP2040》,观看 基于Arduino玩转pico RP2040