操作系统如何保护内核

时间:2010-10-01 19:52:20

标签: operating-system

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

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

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

4 个答案:

答案 0 :(得分:5)

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

  • 向处理器发送中断
  • 进行系统调用。

在任何一种情况下,该操作都会产生将控制转移到某些受信任的内核代码的副作用。

答案 1 :(得分:5)

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

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

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

如果该程序确定地址对应于进程应该使用的内存,则它为MMU提供主内存中与用户程序要求的逻辑地址对应的物理地址,MMU将其提取到其缓存中,并继续运行用户程序。

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

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

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

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

答案 2 :(得分:0)

当计算机启动时,它会从一个众所周知的位置开始运行代码。该代码最终最终将一些OS内核加载到内存并将控制传递给它。然后,OS内核通过某种特定于CPU的方法设置CPU内存映射。

答案 3 :(得分:0)

  
    
      

例如,如果驱动程序处于内核模式,操作系统如何管理其与系统的集成,以便没有添加恶意软件作为驱动程序?

    
  

实际上取决于操作系统架构。我将举两个例子:

  1. Linux内核:驱动程序代码非常强大。保护程度如下:
  2. a)允许驱动程序访问内核中有限数量的符号,使用EXPORT_SYMBOL指定。导出的符号通常是函数。但没有什么能阻止驱动程序使用野指针破坏内核。使用EXPORT_SYMBOL的安全性是名义上的。

    b)驱动程序只能由对该框具有root权限的特权用户加载。因此,只要不违反root权限,系统就是安全的。

    1. 像QNX这样的微内核:操作系统向用户输出足够的接口,以便可以将驱动程序实现为用户空间程序。因此,驾驶员至少不能轻易捣毁系统。