【发布时间】:2011-04-20 01:05:35
【问题描述】:
我的问题是操作系统究竟如何保护它的内核部分。
据我发现,基本上有两种模式内核和用户。并且内存段中应该有一些位可以判断内存段是内核还是用户空间段。但是这些比特的来源在哪里?编译器中是否有一些“开关”将程序标记为内核程序?例如,如果驱动程序处于内核模式,操作系统如何管理其与系统的集成,从而不会添加恶意软件作为驱动程序?
如果有人能在这个问题上启发我,我将不胜感激,谢谢
【问题讨论】:
标签: operating-system
我的问题是操作系统究竟如何保护它的内核部分。
据我发现,基本上有两种模式内核和用户。并且内存段中应该有一些位可以判断内存段是内核还是用户空间段。但是这些比特的来源在哪里?编译器中是否有一些“开关”将程序标记为内核程序?例如,如果驱动程序处于内核模式,操作系统如何管理其与系统的集成,从而不会添加恶意软件作为驱动程序?
如果有人能在这个问题上启发我,我将不胜感激,谢谢
【问题讨论】:
标签: operating-system
通常的技术是使用大多数现代 cpu 中存在的虚拟内存管理器的功能。
硬件的工作方式是在缓存中保存内存片段列表,以及它们对应的地址列表。当程序尝试读取该缓存中不存在的一些内存时,MMU 不只是从主 ram 中获取内存,因为缓存器中的地址只是“逻辑”地址。相反,它调用另一个程序来解释地址并从它应该在的任何地方获取该内存。
该程序称为分页器,由内核提供,MMU 中的特殊标志可防止该程序被覆盖。
如果该程序确定该地址对应于进程应该使用的内存,它会向 MMU 提供与用户程序请求的逻辑地址相对应的主内存中的物理地址,MMU 将其提取到它的缓存中,并继续运行用户程序。
如果该地址是“特殊”地址,例如内存映射文件,则内核将文件的相应部分提取到缓存中并让程序随之运行。
如果地址在属于内核的范围内,或者程序尚未将该地址分配给自己,则分页器会引发 SEGFAULT,从而终止程序。
因为地址是逻辑地址,而不是物理地址,不同的用户程序可能使用相同的逻辑地址来表示不同的物理地址,内核分页程序和MMU使这一切变得透明和自动化。
这种保护级别不适用于较旧的 CPU(如 80286 cpus)和一些非常低功耗的设备(如 ARM CortexM3 或 Attiny CPU),因为没有 MMU,这些系统上的所有地址都是物理地址,带有 1 ram和地址空间的1个对应关系
【讨论】:
“开关”实际上在处理器本身中。某些指令仅在内核模式下可用(在 i386 上也称为 ring 0)。从内核模式切换到用户模式很容易。但是,切换回内核模式的方法并不多。您可以:
在任何一种情况下,操作都会产生将控制权转移到一些受信任的内核代码的副作用。
【讨论】:
当计算机启动时,它会从某个众所周知的位置开始运行代码。该代码最终将一些操作系统内核加载到内存并将控制权传递给它。然后操作系统内核通过一些特定于 CPU 的方法设置 CPU 内存映射。
【讨论】:
例如,如果驱动程序处于内核模式,操作系统如何管理其与系统的集成,从而不会添加恶意软件作为驱动程序?
这实际上取决于操作系统架构。我举两个例子:
a) 允许驱动程序访问内核中有限数量的符号,使用 EXPORT_SYMBOL 指定。导出的符号通常是函数。但是没有什么能阻止驱动程序使用野指针破坏内核。并且使用 EXPORT_SYMBOL 的安全性是名义上的。
b) 驱动程序只能由具有 root 权限的特权用户加载。所以只要不破坏root权限,系统就是安全的。
【讨论】: