title: 操作系统笔记之内核初始化
date: 2021-08-22 17:24:57
category: 操作系统
tags:
- CPU
- 内核态
- 用户态
- OS
内核的初始化
内核初始化,就是我们操作系统的内核初始化。那么操作系统初始化需要初始化哪些东西?是按照什么步骤进行的?带着孜孜不倦的态度去探索了…
先来个大概的印象:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wdMbrpdO-1631605844326)(操作系统笔记之内核初始化/内核初始化内容.png)]
从中可以知道初始化的内容包含进程初始化(0、1、2)、中断处理初始化、内存管理初始化、调度管理初始化。
进程初始化
首先,OS的目的是为了处理各种进程,但是OS本身也可以看做是一个跟CPU等硬件打交道的进程,因此在操作系统中必须先有一个进程:0号进程。这是OS创建的第一个进程,也是进程列表中的第一个进程。通过指令set_task_end_magic(&init_task)
来创建。OS中我们知道创建进程都是通过fork或者kernel_thread产生进程,但这个进程却不是,它也是唯一一个不是的。而进程列表(Process List)可以看做一个管理进程的工具,里面存放着所有的进程。
中断初始化
在有了进程之后,我们如果有进程进行了中断或者其他处理,那么就需要进程系统调用,而系统调用也是通过发送中断的方式进行的。这就需要进行中断的初始化,通过函数trap_init()
进行初始化,里面设置好了很多中断门。
内存初始化
同样,进程的运行离不开内存(各种代码啊数据啊等等等),所以需要内存的初始化。通过函数mm_init()
来初始化内存管理。
调度初始化
进程在运行中可能会需要切换,这时候就需要对进程进行调度了,通过函数sched_init()
来初始化调度管理模块。
文件系统初始化
我们需要存取的数据太多的时候,不可能全部都放入在内存中,这时候就需要一个存放这些数据的地方:文件。通过vfs_caches_init()
来初始化基于内存的文件系统rootfs
。
最后就是OS调用rest_init()初始化其他方面了。
1号进程初始化
在OS调用rest_init()的时候,首先第一个需要干的大事就是调用kernel_thread(kernel_init, NULL, CLONE_FS)
创建系统第二个进程,这个进程就是1号进程。
我们都知道OS是分为用户态