这里有一个和我类似的问题:https://stackoverflow.com/questions/43819072/does-the-kernel-stop-running-on-its-own-when-the-os-is-complete-loaded,但它的答案相互矛盾(所以请不要将此问题标记为重复)。
回到我的问题。我知道,当计算机加电时,BIOS开始运行,BIOS会运行引导加载程序,引导加载程序会运行内核。
现在内核开始作为普通程序运行(我所说的“普通程序”是指内核不仅仅是其他程序调用的一组函数,而且它也是一个独立运行的程序)。现在内核将执行以下任务:
- 初始化硬件以及内核数据结构。
- 切换到保护模式。
- 初始化中断描述符表。
- 等等(这个文章列出了内核执行的更多任务)。
内核完成这些任务后,操作系统就会被加载,用户就可以开始使用它了。
我的问题是:现在操作系统已加载,内核是否继续作为正常程序运行,还是会以这种方式停止运行,仅在发生中断时运行?
答案1
任何内核几乎都与“正常程序”完全相反。尽管微内核人员可能喜欢操作系统服务作为与用户应用程序处于同一级别的进程运行的想法,但内核是总是必须包括一些不是的部分。如果不出意外的话,操作系统中必须有某个部分来处理进程之间的调度和切换以及进程之间的通信。
特别地,在Linux上,内核被映射到所有进程的地址空间,位于地址空间的上部。从某种意义上说,它是每个进程的一部分,因为某些进程可能正在运行内核代码,而同时其他一些进程可能正在运行用户空间代码。
我不会说内核作为普通程序运行,但它也不会“仅”在中断时运行,因为用户空间代码也可以调用内核例程:这就是系统调用。围绕“仅”的引号,由于中断根本不是例外,因此某种常规计时器滴答声很常见。
答案2
在单处理系统上,处理器一次只能运行一个程序,因此操作系统或另一个程序在给定时间运行。
操作系统并不作为普通程序运行,因为它是负责调度这些程序运行的实体。当程序运行时,操作系统不做任何事情,一旦发生中断、系统调用或超时,操作系统就会被回调。然后它可以决定为自己工作,或者运行它负责的另一个程序。
我不明白为什么你所说的答案会相互冲突:操作系统运行的某些进程可以是内核组件,具有更高级别的特权。