linux - 当操作系统为 "on its own"时,内核是否停止运行 "fully loaded"?

标签 linux operating-system kernel cpu interrupt

让我解释一下我认为内核是如何工作的:

  • 当电脑开机后,内核就会开始运行(BIOS会运行boot loader,我认为boot loader会运行内核)。

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

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

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

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

最佳答案

以上说法都不完全正确:

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

但是:

内核在它的内存空间中产生了很多它自己的线程(你可以在 Linux 中很容易地看到,例如,使用 ps -ef 并寻找 2 的 PPID,或者 ps aux 寻找 RSS/VSIZE 的0), 而在较新版本的 ps 中, [ ] 标记。 Darwin (MacOS/iOS) 无法使用内置工具显示内核线程,除非使用专门的系统调用(目前,#491,stack_snapshot_with_config)。

其中一个内核线程(具体取决于操作系统)“萌芽”并成为用户模式 ​​PID 1 - init(在较新的 Linux systemd 上现在是“systemd”)或 launchd (Darwin)。这不是一些廉价的无限循环。它的盘子已经够多了,采用孤儿进程(收获它们并防止僵尸),启动任务,以及一般的内务处理。 PID 1 本身大部分时间都会阻塞,不要与空闲任务(实际上是内核线程)混淆。 PID 1 也是不朽的(不能用 -9 杀死)并且如果它可怕地死去(由于某些异常),内核通常会出现 panic 。

解释 #2 (334403) 更准确,但内核线程继续在后台执行。例如Linux kswapd 可以响应某些页面错误进行交换。或计划刷新页面/缓冲区( Darwin :统一)缓存。也就是说,其他到内核模式的转换通常确实是在系统调用(自愿)或中断/异常(非自愿​​)时进行的。也就是说,除非其中一个内核线程唤醒并需要做某事。

关于linux - 当操作系统为 "on its own"时,内核是否停止运行 "fully loaded"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43819072/

相关文章:

python - Linux 上的 Django MySQLClient pip 编译失败

c++ - 如何将文件从一个文件夹复制到另一个文件夹

linux - LINUX中CLASSPATH的确定和安装

php - 如何授予apache对所有文件的写权限

c - 当我将相同的代码放在一个函数中与将它内联写入 C 中时,结果不同

linux - 一些适用于具有 4GB RAM 的 AMD E-1800 APU 笔记本电脑的轻量级 Linux 发行版

c++ - 同一二进制文件中的可执行文件和 DLL/共享库

linux - 使用分支预测器了解 Spectre 漏洞

operating-system - 内存映射 IO - 它是如何完成的?

linux - 在内核模块中创建指向文件的符号链接(symbolic link)