operating-system - 操作系统究竟如何保护内核

标签 operating-system

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

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

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

最佳答案

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

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

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

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

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

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

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

这种级别的保护在较旧的 CPU(如 80286 cpu)和一些非常低功耗的设备(如 ARM CortexM3 或 Attiny CPU)上不可用,因为没有 MMU,这些系统上的所有地址都是物理地址,一一对应内存和地址空间之间

关于operating-system - 操作系统究竟如何保护内核,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3842574/

相关文章:

windows - OS线程调度与cpu使用关系

java - 有没有支持并行读取的磁盘?

python - 如何顺序查找文件并保存?

java - Java 中的条件如何知道要触发哪个线程?

assembly - (汇编 x86 实模式)数据在程序结束时得到 "cut off"?

linux - 如何估算文件系统中的查找速度

c - 如何只包含来自不同 C 文件的一个函数

assembly - 目标代码与机器代码

python - 不能用pythonw调用qwinsta

python Popen.wait() 在多个管道上死锁 - 为什么?