当操作系统“满载”时,内核是否“自行”运行?

时间:2017-05-06 09:57:11

标签: linux operating-system kernel cpu interrupt

让我解释一下我认为内核的工作原理:

  • 当计算机开机时,内核将开始运行(BIOS将运行引导加载程序,我认为引导加载程序将运行内核)。

  • 现在内核会做一些工作(例如:初始化 中断描述符表,为用户创建必要的流程以便能够与操作系统交互等。)

  • 一旦内核完成它必须做的事情(当操作系统“完全加载”以便用户开始与之交互时),内核将“自行”停止运行。

  • 现在内核仍然会运行但不是“独立”,而是响应中断(例如:系统调用,硬件定时器间隔到期,鼠标移动,键盘按下等),所以当我们现在说内核正在运行,我们只是说正在执行中断处理程序。

我的理解是正确的,还是即使在“完全加载”操作系统之后,内核将继续像其他任何进程一样运行?

2 个答案:

答案 0 :(得分:0)

您的描述偏离了标记。

内核不是一个进程。您在前两个步骤中描述了引导程序加载过程。引导过程设置内核但不是内核。一旦加载了操作系统,引导过程就会有效消失。

在大多数系统中,没有内核进程。引导完成后,内核仅通过异常或中断调用,这些异常或中断将分派给处理程序(由引导过程设置)。这些异常和中断处理程序在导致中断的进程的上下文中运行,或者在发生中断时正在运行。

答案 1 :(得分:0)

以上两者都不是完全正确的:

  • True:内核有点类似于共享库。但是有区别。内核实际上是一个程序,有自己的参数(从引导加载程序传递),虽然不是传统意义上的过程。所述程序负责初始化特权内存和执行空间(Intel:Ring 0,ARM:SVC或EL1),其中它具有对硬件的完全访问权限并可初始化子系统,包括内存管理(通过它创建隔离的虚拟内存容器)我们调用"进程"),调度(对于在进程内运行的线程)文件系统等等。

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:统一)缓存。也就是说,其他转换到内核模式通常确实在系统调用(自愿)或中断/异常(非自愿​​)。也就是说,除非其中一个内核线程醒来并需要做某事。