Kernel 操作系统内核如何享有特权来做一些低级的事情?

Kernel 操作系统内核如何享有特权来做一些低级的事情?,kernel,Kernel,据我所知,操作系统内核有特权执行一些其他程序无法执行的低级操作,如一些低级中断或处理多个内核 是否有某种特殊说明可以实现这一点?这只是部分答案 主要的权限分离与地址空间有关:在监控模式下运行时,CPU可以访问所有地址空间。操作系统内核在此模式下运行。一个用户进程没有 这就是为什么,例如,32位Linux主机上的用户进程只能使用3 GB的地址空间,而理论上可用的地址空间是2^32=4 GB:搁浅的GB只能由内核访问,内核将其数据结构映射到这个GB。试图访问该地址空间的用户进程将看到SIGBUS。这

据我所知,操作系统内核有特权执行一些其他程序无法执行的低级操作,如一些低级中断或处理多个内核


是否有某种特殊说明可以实现这一点?

这只是部分答案

主要的权限分离与地址空间有关:在监控模式下运行时,CPU可以访问所有地址空间。操作系统内核在此模式下运行。一个用户进程没有

这就是为什么,例如,32位Linux主机上的用户进程只能使用3 GB的地址空间,而理论上可用的地址空间是2^32=4 GB:搁浅的GB只能由内核访问,内核将其数据结构映射到这个GB。试图访问该地址空间的用户进程将看到SIGBUS。这一前沿也存在于64位机器上,但非常遥远

在监控模式下,运行的代码内核还可以修改地址空间的布局:例如,这意味着它可以使视频卡的PCI地址空间、设备的DMA地址空间、串行端口等在非监控模式下对其他运行的代码进程完全不可见

内核可以通过系统调用授予对低级操作(如磁盘写入)的访问权。当系统调用被触发时,内核将代表调用它的进程在监控模式下执行系统调用。当系统调用完成或中断时,进程将以自己的权限恢复执行


在今天的处理器中,所有这些逻辑的一个核心部分是MMU内存管理单元,因为它是允许地址空间重写的组件——这就是为什么您可以拥有32位机器,其内存超过4 GB,如果没有MMU,这是不可能的事。

理论上:是的,通过大量的注入甚至黑客攻击,你甚至可以使用低级的指令集,但实际上这是不可能的,因为有太多的资源在某个时候锁定了某些领域

有了标准语言和标准库,您很可能无法访问100%的硬件,因为这些硬件就是这样设计的——除去关键的、可能是危险的决策,才有可能实现复杂而强大的框架。使用OSS操作系统,您可能能够获得完全控制权,但最终您将面临相同的问题:内核操作与您自己的操作交叉,如果不大量修改内核,您将无法始终获得完全控制权


如果你想100.0%控制你的硬件,你将被迫编写你自己的引导加载程序、内核和操作系统——通过操作码级别的硬件指令,你几乎可以操纵一切;使用任何编程语言,即使是ASM,也会对您造成限制。

因为在引导和h/w初始化时,操作系统将自己设置为最高权限所有者。操作系统在MMU硬件的帮助下完成这项工作。例如,在基于x86的处理器中,h/w提供了两种保护机制

分段:

分段使您的内存看起来像段,对于这些段,您可以将权限级别PL从0分配到3,0是最高权限。在启动和初始化h/w时,您可以分配内核代码段0PL,一旦它开始执行用户进程,内核就分配给它PL3。若用户代码试图跳转到更具特权的内核代码,h/w将生成通用ProtectionGP故障中断13,它将执行内核代码,然后可以选择终止用户进程。类似地,也有像lidt、lgdt等指令,它们只能在0PL中执行,如果用户代码试图执行它们,它将生成GP错误。分段还解决了以下问题:

如何表示只包含可执行代码的内存区域? 如何表示只包含数据的内存区域? 寻呼:

分页将内存划分为大小为4KB/2MB/4MB/1GB的页面,h/w的分页支持解决了以下问题:

如果您想说某个页面属于用户或内核,该怎么办? 如果您想将页面设置为只读或只读,或者同时设置为读写,该怎么办? 如果用户代码试图违反OS设置的任何分页规则,h/w会生成page fault,它会执行内核代码,因为OS在中断/故障/异常处理程序初始化期间设置了page fault,这样内核就可以决定如何处理用户进程


分段和分页都是更复杂的主题,但是这个答案只在您的问题的上下文中给出

StackOverflow用于特定的编程问题,而不是一般的操作系统设计问题。