我的问题是操作系统究竟是如何保护它的内核部分的。
从我发现的内核和用户基本上有两种模式。如果内存段是内核或用户空间段,则内存段中应该有一些位。但那些位的起源在哪里?编译器中是否有一些“开关”将程序标记为内核程序?例如,如果驱动程序处于内核模式,那么操作系统如何管理其与系统的集成,以便没有添加恶意软件作为驱动程序?
如果有人能在这个问题上给我启发,我将非常感激,谢谢
答案 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)
例如,如果驱动程序处于内核模式,操作系统如何管理其与系统的集成,以便没有添加恶意软件作为驱动程序?
实际上取决于操作系统架构。我将举两个例子:
a)允许驱动程序访问内核中有限数量的符号,使用EXPORT_SYMBOL指定。导出的符号通常是函数。但没有什么能阻止驱动程序使用野指针破坏内核。使用EXPORT_SYMBOL的安全性是名义上的。
b)驱动程序只能由对该框具有root权限的特权用户加载。因此,只要不违反root权限,系统就是安全的。