Linux---内核初始化
内核初始化
引导加载程序(BootLoader)
计算机首先加载引导(GRUB)。引导加载程序的任务是从存储介质(硬盘、光盘等)加载操作系统内核到内存中,并跳转到内核的启动位置。
设置堆栈和切换到保护模式
内核初始开始时,计算机可能仍让处于实模式。内核会设置堆栈,切换到保护模式或长模式(64位系统),以获得更高的内存访问和保护机制。
源码位置init/main.c中的start_kernel()。
建立内存管理(mm_init())
内核需要建立内存管理单元(Memory Management Unit,MMU)以启用虚拟内存。这里包括初始化页表、启用分页机制、配置内存保护等。
初始化中断和异常处理(trap_init())
内核会初始化中断描述符(Interrupt Descriptor Table,IDT)和中断服务例程,以便能够处理硬件中断和异常。这里包括设置中断处理程序的地址、启用和配置中断控制器等。
初始进程管理0进程 INIT_TASK(init_task)
内核会创建第一个进程(通常时init进程或systemd),这是用户空间的第一个进程。进程管理的初始化还包括建立进程控制块(Process Control Block,PCB)和设置调度器(sched_init())。
初始化文件系统(register_filesystem())
如果支持文件系统,内核会初始化文件系统相关的数据结构,挂载根文件系统,并为文件操作做好准备。这里包括虚拟文件系统(VFS)、超级快和安装文件系统驱动程序。
设备驱动初始化(platform_device_register())
内核会初始化系统调用接口,这是用户空间程序与内核交互的方式。系统调用表会被设置,以便用户程序可以请求内核提供的服务。
启动用户空间
一旦内核初始化完毕,它会启动用户空间,执行第一个用户空间进程,该进程通常是init/systemd。用户空间进程将接管系统管理任务。
进入正常运行
此时,操作系统已经初始化完毕,可以接受用户程序的执行。操作系统将处理进程调度、文件管理、内存管理、网络通信等任务,以确保系统正常运行。