我的问题是操作系统究竟如何保护它的内核部分。
从我发现的情况来看,内核和用户基本上有两种模式。并且内存段中应该有一些位,用于指示内存段是内核还是用户空间段。但这些比特的来源在哪里?编译器中是否有一些“开关”将程序标记为内核程序?例如,如果驱动程序处于内核模式,操作系统如何管理其与系统的集成,从而不会将恶意软件添加为驱动程序?
如果有人能在这个问题上启发我,我将不胜感激,谢谢
最佳答案
通常的技术是使用大多数现代 CPU 中存在的虚拟内存管理器的功能。
硬件的工作方式是在缓存中保存一个内存片段列表,以及它们对应的地址列表。当程序尝试读取该缓存中不存在的某些内存时,MMU 不会只是从主内存中获取内存,因为缓存中的地址只是“逻辑”地址。相反,它调用另一个程序来解释地址并从它应该在的任何地方获取该内存。
该程序称为分页程序,由内核提供,MMU 中的特殊标志可防止该程序被覆盖。
如果该程序确定该地址对应于进程应该使用的内存,它会向 MMU 提供主内存中与用户程序请求的逻辑地址相对应的物理地址,MMU 将其提取到其缓存中,然后继续运行用户程序。
如果该地址是“特殊”地址,例如内存映射文件,则内核会将文件的相应部分提取到缓存中,并让程序随之运行。
如果地址在属于内核的范围内,或者程序尚未将地址分配给自己,则分页器会引发 SEGFAULT,从而终止程序。
因为地址是逻辑地址,而不是物理地址,不同的用户程序可能使用相同的逻辑地址来表示不同的物理地址,内核分页程序和MMU使这一切都是透明和自动的。
这种级别的保护在较旧的 CPU(如 80286 cpu)和一些非常低功耗的设备(如 ARM CortexM3 或 Attiny CPU)上不可用,因为没有 MMU,这些系统上的所有地址都是物理地址,一一对应内存和地址空间之间
关于operating-system - 操作系统究竟如何保护内核,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3842574/