加载操作系统后,内核是否继续作为正常程序运行?

Jos*_*eph 5 linux linux-kernel

这里有一个类似的问题:https : //stackoverflow.com/questions/43819072/does-the-kernel-stop-running-on-its-own-when-the-os-is-fully-loaded,但是它有相互矛盾的答案(所以请不要将此问题标记为重复)。


回到我的问题。我知道当计算机开机时,BIOS 开始运行,BIOS 会运行引导加载程序,引导加载程序将运行内核。

现在内核开始作为一个普通程序运行(“普通程序”我的意思是内核不仅仅是一组其他程序调用的函数,而是一个独立运行的程序)。现在内核将执行以下任务:

  • 初始化硬件以及内核数据结构。
  • 切换到保护模式。
  • 初始化中断描述符表。
  • 等等(本文列出了内核执行的更多任务)。

内核完成这些任务后,操作系统就会加载完毕,用户就可以开始使用它了。

我的问题是:既然已经加载了操作系统,内核是否会继续作为正常程序运行,还是会停止以这种方式运行并仅在发生中断时运行?

ilk*_*chu 6

任何内核几乎都与“普通程序”完全相反。尽管微内核人员可能喜欢操作系统服务作为与用户应用程序处于同一级别的进程运行的想法,但内核总是必须包含一些不包含的部分。如果不出意外,操作系统的某些部分必须处理进程之间的调度和切换,以及它们之间的通信。

特别是在 Linux 上,内核被映射到所有进程的地址空间,在地址空间的上半部分。从某种意义上说,它是每个进程的一部分,因为一些进程可能正在运行内核代码,而同时一些其他进程可能正在运行用户空间代码。

我不会说内核作为普通程序运行,但它也不会“仅”在中断时运行,因为用户空间代码也可以调用内核例程:这就是系统调用。引用“仅”,因为中断根本不是例外,所以某种定期计时器滴答是很常见的。

  • @Joseph,是的,有通过软件中断调用系统调用的旧方法,但这在概念上与硬件中断有点不同。这也不是进行系统调用的唯一方法,还有“SYSCALL”和“SYSENTER”指令,我认为它们更现代。 (2认同)

mul*_*tun 4

在单处理系统上,处理器一次只能运行一个程序,因此操作系统或另一个程序在给定时间运行。

操作系统并不作为普通程序运行,因为它是负责调度这些程序运行的实体。当程序运行时,操作系统不做任何事情,一旦发生中断、系统调用或超时,操作系统就会被回调。然后它可以决定为自己工作,或者运行它负责的另一个程序。

我不明白为什么你所说的答案会相互冲突:操作系统运行的某些进程可以是内核组件,具有更高级别的特权。

  • 将脏内存页写入磁盘后刷新、各种异步驱动程序任务(即,在系统调用中未同步处理的内容)、跨内核重新平衡任务以及许多其他内容。如果您知道内核在启动后会做什么(即存在哪些系统设施),那么很容易看出其中哪些不仅仅是中断处理程序和系统调用。 (2认同)