让我解释一下我认为内核的工作原理:
当计算机开机时,内核将开始运行(BIOS将运行引导加载程序,我认为引导加载程序将运行内核)。
现在内核会做一些工作(例如:初始化 中断描述符表,为用户创建必要的流程以便能够与操作系统交互等。)
一旦内核完成它必须做的事情(当操作系统“完全加载”以便用户开始与之交互时),内核将“自行”停止运行。
现在内核仍然会运行但不是“独立”,而是响应中断(例如:系统调用,硬件定时器间隔到期,鼠标移动,键盘按下等),所以当我们现在说内核正在运行,我们只是说正在执行中断处理程序。
我的理解是正确的,还是即使在“完全加载”操作系统之后,内核将继续像其他任何进程一样运行?
答案 0 :(得分:0)
您的描述偏离了标记。
内核不是一个进程。您在前两个步骤中描述了引导程序加载过程。引导过程设置内核但不是内核。一旦加载了操作系统,引导过程就会有效消失。
在大多数系统中,没有内核进程。引导完成后,内核仅通过异常或中断调用,这些异常或中断将分派给处理程序(由引导过程设置)。这些异常和中断处理程序在导致中断的进程的上下文中运行,或者在发生中断时正在运行。
答案 1 :(得分:0)
以上两者都不是完全正确的:
BUT:
内核在其内存空间中产生了很多自己的线程(你可以在Linux中轻松看到它,例如,使用ps -ef并查找PPID为2,或者ps aux寻找RSS / VSIZE 0),以及更新版本的ps,[]标记。 Darwin(MacOS / iOS)无法使用内置工具显示内核线程,除非使用专门的sys调用(目前为#491,stack_snapshot_with_config)。
一个内核线程(确切地说,取决于操作系统),"萌芽"并成为用户模式PID 1 - init(现在" systemd"在较新的Linux systemd上)或launchd(达尔文)。与downvoter相反(并且不要对此投票),这不是一些廉价的无限循环。它有足够的功能,采用孤儿进程(收获它们并防止僵尸),启动任务,一般是家务。 PID 1本身在大多数情况下都会阻塞,并且不要与空闲任务(实际上是内核线程)混淆。 PID 1也是不朽的(不能用-9杀死)并且它应该可怕地死掉(通过一些例外),内核通常会发生恐慌。
解释#2(334403)更多的是标记,但内核线程继续在后台执行。例如Linux kswapd可能会响应某些页面错误进行交换。或者预定刷新页面/缓冲区(Darwin:统一)缓存。也就是说,其他转换到内核模式通常确实在系统调用(自愿)或中断/异常(非自愿)。也就是说,除非其中一个内核线程醒来并需要做某事。