【问题标题】:How exactly does OS protect kernel操作系统究竟是如何保护内核的
【发布时间】:2011-04-20 01:05:35
【问题描述】:

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

据我发现,基本上有两种模式内核和用户。并且内存段中应该有一些位可以判断内存段是内核还是用户空间段。但是这些比特的来源在哪里?编译器中是否有一些“开关”将程序标记为内核程序?例如,如果驱动程序处于内核模式,操作系统如何管理其与系统的集成,从而不会添加恶意软件作为驱动程序?

如果有人能在这个问题上启发我,我将不胜感激,谢谢

【问题讨论】:

    标签: operating-system


    【解决方案1】:

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

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

    该程序称为分页器,由内核提供,MMU 中的特殊标志可防止该程序被覆盖。

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

    如果该地址是“特殊”地址,例如内存映射文件,则内核将文件的相应部分提取到缓存中并让程序随之运行。

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

    因为地址是逻辑地址,而不是物理地址,不同的用户程序可能使用相同的逻辑地址来表示不同的物理地址,内核分页程序和MMU使这一切变得透明和自动化。

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

    【讨论】:

    • 您的意思是 MMU 而不是 VMU,而没有 MMU 的 ARM CPU 通常有一个 MPU,可以让您设置一些内存区域(ARM946E-S 中为 8 个)以及对用户/内核的访问权限。跨度>
    【解决方案2】:

    “开关”实际上在处理器本身中。某些指令仅在内核模式下可用(在 i386 上也称为 ring 0)。从内核模式切换到用户模式很容易。但是,切换回内核模式的方法并不多。您可以:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        1. Linux 内核:驱动程序代码可能非常强大。保护级别如下:

        a) 允许驱动程序访问内核中有限数量的符号,使用 EXPORT_SYMBOL 指定。导出的符号通常是函数。但是没有什么能阻止驱动程序使用野指针破坏内核。并且使用 EXPORT_SYMBOL 的安全性是名义上的。

        b) 驱动程序只能由具有 root 权限的特权用户加载。所以只要不破坏root权限,系统就是安全的。

        1. QNX 等微内核:操作系统向用户导出足够多的接口,以便驱动程序可以作为用户空间程序实现。因此,司机至少不能轻易破坏系统。

        【讨论】:

          猜你喜欢
          • 2013-12-01
          • 2015-04-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-03-01
          • 2016-10-21
          • 2012-10-24
          • 1970-01-01
          相关资源
          最近更新 更多