2013-01-22 14 views

回答

2

这只是一个部分答案。

主要特权分离与地址空间有关:当在“超级用户模式”下运行时,CPU可以访问所有的地址空间。 OS内核以此模式运行。用户进程没有。

这就是为什么,例如,32位Linux主机上的用户进程只有3 GB的地址空间供其处理,而理论上可用的地址空间为2^32 = 4 GB:“搁浅”的GB只是内核可访问,内核将其数据结构映射到这个千兆字节。尝试访问该地址空间的用户进程将看到一个SIGBUS。这个边界也存在于64位机器上,但是非常遥远。

在超级用户模式下,运行代码(内核)也具有修改地址空间布局的可用性:例如,它意味着它可以渲染视频卡的PCI地址空间或DMA地址您的设备空间,串口等在非监督模式下对其他运行代码(进程)完全不可见。

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

当今处理器中所有这些逻辑的一个中心部分是MMU(内存管理单元),因为这是允许地址空间重写的组件 - 这就是为什么你可以拥有超过4 GB RAM的32位机器如果MMU不可用,这是不可能的事情。

-2

从理论上讲:是的,加载注入甚至黑客,你甚至可以使用低级指令集,但实际上这是不可能的,因为有太多的资源锁定某些区域。

使用标准语言和标准库,您很可能无法获得100%的硬件,因为这些设计的方式 - 取消关键性和可能危险的决策,甚至可能使复杂(和强大)框架成为可能。使用OSS操作系统,您可以获得完全控制权,但最终还是会出现相同的问题:内核操作与您自己的操作相交,并且不会严重修改内核,您将无法获得全程控制。

如果您希望100%控制您的硬件,您将被迫通过Opcode级别的硬件指令编写您自己的引导加载程序,内核和操作系统,您几乎可以操纵任何内容;使用任何编程语言(甚至ASM)都会对您施加限制。

0

由于OS在引导和h/w初始化时将自己设置为最高特权所有者。 OS在MMU硬件的帮助下执行此操作。例如,在基于x86处理器有其H/W提供保护

  1. 分割两种机制:

    分割,使你的记忆像段,并且这些片段可以分配权限级别( PL)从0到3,0是最高特权。在启动&初始化h/w时,您可以分配内核代码段0 PL,并且一旦它开始执行用户进程,内核将为其分配PL 3。如果用户代码尝试跳转到更多特权的内核代码,则会生成一般保护(GP)错误(中断#13),这将执行内核代码,然后可以选择终止用户进程。同样,有像lidt,lgdt等指令,只能在0 PL中执行,如果用户代码试图执行它们,将会产生GP故障。分割也解决了以下问题:

    1. 如何表示仅包含可执行代码的内存区域?
    2. 如何表示仅包含数据的内存区域?
  2. 寻呼

    分页内存划分为大小的页面(4KB/2MB/4MB/1GB),寻呼从H/W解决了支持以下几个问题:

    1. 如果什么你想说一个页面属于用户或内核?
    2. 如果你想说页面是只读还是只写或者都是读写?

    如果用户代码试图破坏由OS寻呼规则设置,H/W生成页面错误,它执行内核代码(因为OS中断/故障/异常处理程序的初始化过程中设置一个上),这样一来内核可以决定如何处理用户进程。

分段和分页都涉及更多的主题,但这个答案只在你的问题的上下文中。

相关问题