据我了解,操作系统内核有权执行一些其他程序无法执行的低级操作,例如一些低级中断或处理多个内核。
是否有某种特殊说明可以实现这一点?
这只是部分答案。
主要的权限分离与地址空间有关:当以“管理员模式”运行时,CPU 可以访问所有地址空间。操作系统内核在此模式下运行。用户进程没有。
这就是为什么,例如,32 位 Linux 主机上的用户进程只有 3 GB 的地址空间可供使用,而理论上可用的地址空间是 2^32 = 4 GB:“搁浅的”千兆字节只能由内核访问,内核将其数据结构映射到这个千兆字节。尝试访问该地址空间的用户进程将看到 SIGBUS。这个边界也存在于 64 位机器上,但非常遥远。
在管理员模式下,运行代码(内核)还可以修改地址空间的布局:例如,它可以渲染您的视频卡的 PCI 地址空间,或您设备的 DMA 地址空间,串口等在非监督模式下对其他运行代码(进程)完全不可见。
内核可以通过系统调用授予对低级操作(例如磁盘写入)的访问权限。当系统调用被触发时,内核代表调用它的进程在主管模式下执行系统调用。当系统调用完成或中断时,进程恢复执行,并拥有自己的权限。
当今处理器中所有这些逻辑的一个核心部分是 MMU(内存管理单元),因为这是允许重写地址空间的组件——这就是为什么你可以拥有超过 4 GB RAM 的 32 位机器,这是不可能的事情如果 MMU 不可用。
因为操作系统在引导和硬件初始化时将自己设置为最高权限所有者。操作系统在 MMU 硬件的帮助下做到这一点。例如,在基于 x86 的处理器中,硬件提供了两种保护机制
分割:
分段使您的内存看起来像段,并且您可以为这些段分配从 0 到 3 的特权级别(PL),0 是最高特权。在启动和初始化 h/w 时,您可以分配内核代码段 0 PL ,一旦它开始执行用户进程,内核就会为其分配 PL 3 。如果用户代码尝试跳转到更高权限的内核代码 h/w 将产生 General Protection(GP) Fault (interrupt #13) ,它将执行内核代码,然后它可以选择杀死用户进程。类似的,有些指令lidt
只能lgdt
在 0 PL 中执行,如果用户代码尝试执行它们会产生 GP Fault。分割还解决了以下问题:
分页:
分页将内存分成大小(4KB/2MB/4MB/1GB)的页面,h/w 的分页支持解决了以下问题:
如果用户代码试图违反操作系统设置的任何分页规则,h/w 会生成页面错误,该页面错误会执行内核代码(因为操作系统在中断/错误/异常处理程序的初始化期间设置了它),这样内核可以决定做什么与用户进程。
分割和分页都是涉及更多的主题,但这个答案仅在您的问题的上下文中。
理论上:是的,通过大量注入甚至黑客攻击,您甚至可以使用低级指令集,但实际上这是不可能的,因为有太多资源有时会锁定某些区域。
使用标准语言和标准库,您很可能无法访问 100% 的硬件,因为这就是它们的设计方式 - 消除关键和可能危险的决定是使复杂(和强大)框架成为可能的原因。使用 OSS 操作系统,您可能能够获得完全控制权,但最终您将面临同样的问题:内核操作与您自己的操作相交,如果不大量修改内核,您将无法获得完全控制权每时每刻。
如果您想 100.0% 控制您的硬件,您将被迫编写自己的引导加载程序、内核和操作系统——通过操作码级别的硬件指令,您几乎可以操纵一切;使用任何编程语言(甚至 ASM)都会限制您。