操作系统如何保护内核

Jar*_*rek 5 operating-system

我的问题是操作系统究竟是如何保护它的内核部分的.

从我发现的内核和用户基本上有2种模式.如果内存段是内核或用户空间段,则内存段中应该有一些位.但那些位的起源在哪里?编译器中是否有一些"开关"将程序标记为内核程序?例如,如果驱动程序处于内核模式,那么操作系统如何管理其与系统的集成,以便没有添加恶意软件作为驱动程序?

如果有人能在这个问题上给我启发,我将非常感激,谢谢

Sin*_*ion 6

通常的技术是使用大多数现代cpu中存在的虚拟内存管理器的功能.

这块硬件的工作方式是它保存一个缓存中的内存片段列表,以及它们对应的地址列表.当程序试图读取该缓存中不存在的某些内存时,MMU不只是从主ram中获取内存,因为cacher中的地址只是"逻辑"地址.相反,它调用另一个程序来解释地址并从任何地方获取该内存.

该程序称为寻呼机,由内核提供,MMU中的特殊标志阻止该程序被覆盖.

如果该程序确定该地址对应于该进程应该使用的内存,则它向MMU提供主存储器中的物理地址,该物理地址对应于用户程序要求的逻辑地址,MMU将其提取到其缓存中,并恢复运行用户程序.

如果该地址是一个"特殊"地址,就像内存映射文件一样,那么内核会将文件的相应部分提取到缓存中,并让程序随之运行.

如果地址在属于内核的范围内,或者程序尚未将该地址分配给自身,则寻呼机会引发SEGFAULT,从而终止该程序.

因为地址是逻辑地址而不是物理地址,所以不同的用户程序可以使用相同的逻辑地址来表示不同的物理地址,内核寻呼机程序和MMU使这一切都是透明和自动的.

旧CPU(如80286 cpu)和一些超低功耗设备(如ARM CortexM3或Attiny CPU)不提供此级别的保护,因为没有MMU,这些系统上的所有地址都是物理地址,具有1对1的对应关系ram和地址空间之间


Edg*_*net 5

"开关"实际上在处理器本身.某些指令仅在内核模式下可用(在i386上也称为ring 0).从内核模式切换到用户模式很容易.但是,没有太多方法可以切换回内核模式.你可以:

  • 向处理器发送中断
  • 打个电话.

在任何一种情况下,该操作都具有将控制转移到某些可信内核代码的副作用.