如果我们可以将内核程序加载到地址空间

时间:2015-09-22 03:55:06

标签: operating-system

这听起来很愚蠢,但是可以将任何内核程序作为应用程序加载到已经运行的操作系统(而不是虚拟机)上。

就像我们将程序加载到进程地址空间并运行它一样。

1 个答案:

答案 0 :(得分:1)

  

[..]可以将任何内核程序作为已经运行的OS上的应用程序加载[..]

不,因为内核通常包含管理系统资源的代码,但主机内核已经在管理这些资源。所以这或者导致灾难性的失败,或者 - 因为我们有内存保护和特权级别等 - 来访问违规行为:

作为一个小例子:可能所有内核都需要配置底层硬件的interrupt service配置(例如,获取计时器标记)。

在x86上,这是通过创建中断描述符表并使用lidt指令加载该表的地址来完成的。在应用程序进程(主机内核将在ring 3中运行,最低权限级别)发出时,处理器将拒绝执行该指令,因为它可能仅在环0中发出,而是生成<强>一般保护错误。将调用主机内核来处理这种情况(因为当 内核启动时,它会为这个目的注册一个中断描述符表)。主机内核对此情况作出反应的唯一方法是中止导致访问冲突的进程,否则会危及系统稳定性和完整性。

在处理分段,分页,访问内存映射设备和访问外围设备时,会出现类似的问题。

也就是说,可以创建一个可以作为用户空间进程运行的内核,我个人使用的一个例子是RODOS,它可以作为Linux进程运行。为了实现这一点,有必要从独立代码(如调度,进程间通信......)中拆分硬件相关的东西(这是很大一部分),并提供重用主机操作系统功能的存根来模拟某种类型的硬件。 (当然,如果为这种用途进行编译,这样准备好的内核只能在主机系统上运行。你不能使用与在原始硬件上使用相同的二进制文件。)