Operating system 一个关于操作系统保护边界的真实示例?

Operating system 一个关于操作系统保护边界的真实示例?,operating-system,Operating System,我试图理解用户/内核边界在操作系统中是如何工作的 我一直在读关于它的文章,似乎如果用户级别的某些东西试图执行禁止的操作,硬件会触发陷阱并将控制发送回内核级别的操作系统,内核会处理这种情况 这怎么可能呢?有些东西怎么能直接从用户级转到硬件级,不是所有的交互都是通过系统调用(在内核级)完成的吗?然后内核将预测该操作是否非法 我有点困惑,我想一个关于这个流程如何工作的真实示例(使用用户级应用程序+操作系统,如linux)可能会帮助我理解,如果有人能做到,我会非常感激 有些东西怎么能直接从用户级转到硬件

我试图理解用户/内核边界在操作系统中是如何工作的

我一直在读关于它的文章,似乎如果用户级别的某些东西试图执行禁止的操作,硬件会触发陷阱并将控制发送回内核级别的操作系统,内核会处理这种情况

这怎么可能呢?有些东西怎么能直接从用户级转到硬件级,不是所有的交互都是通过系统调用(在内核级)完成的吗?然后内核将预测该操作是否非法

我有点困惑,我想一个关于这个流程如何工作的真实示例(使用用户级应用程序+操作系统,如linux)可能会帮助我理解,如果有人能做到,我会非常感激

有些东西怎么能直接从用户级转到硬件级,不是所有的交互都是通过系统调用(在内核级)完成的吗

许多交互不是通过系统调用进行的。作为一个实际例子;在80x86上,可能导致从用户切换到内核的因素有:

a) 任何中断,包括:

  • 任何异常(调试异常、分割异常、无效操作码异常、常规保护故障、页面故障、机器检查异常等)。这些表示编程错误(例如,被零除),或硬件故障(机器检查异常),或内核扩展功能的机会(例如,页面错误表示内核需要从交换空间获取数据,因为内核正在扩展程序可以使用的“内存”量,等等)

  • 任何IRQ(来自请求注意的设备)

  • 从一个CPU发送到另一个CPU的任何中断(运行在该CPU上的软件/内核)

  • 软件中断(来自同一CPU)

b) 某些特殊指令(通常用于内核API入口点):

  • SYSCALL,syscenter

  • 涉及调用门或任务门的“call far”或“jmp far”

  • 软件中断(来自同一CPU)。两次提到,因为它适合这两个类别

请注意,由于各种原因,内核可能会提供多个入口点(例如,一个用于64位进程,另一个用于32位进程,或者一个用于所有进程,另一个仅可由特殊/可信进程使用,或者一个用于频繁执行的代码,速度快但较大,另一个用于减少不常执行的代码中的代码大小,速度小但较慢,或者……);并且可以使用中断(例如,异常-我以前使用过“断点异常”来代替或补充内核API的特殊指令

所有这些东西都有两个特殊的特征——它们都会导致/允许“用户级和内核之间的边界”被跨越;控制传递到的代码的位置由内核而不是调用方(用户级代码)决定,因此内核可以保护/保护其所有入口点

还请注意,在某些情况下(IRQ,机器检查异常),硬件负责,而非软件。这对于确保硬件及时受到关注(例如恶意“拒绝服务”)非常重要/必要进程不能只是执行无限循环来阻止内核使用CPU,如果系统调用是跨越用户/内核边界的唯一方法,那么就会得到CPU)

最后,几乎所有用于通用目的的CPU(不包括一些嵌入在微波炉等设备中的微型微处理器)都具有与80x86类似的功能(通常只是实现方式的较低级别细节有所不同)


例如,当(用户)进程运行时可能发生的情况;程序可能会执行一些代码(然后尝试访问一些实际上不在RAM中的数据,从而导致页面错误,内核从内存映射文件中获取程序想要访问的数据),然后程序可能会执行更多的代码(触发无效操作码异常,其中内核模拟当前/旧CPU上实际上不支持的较新指令),然后程序可能会执行更多代码(但会被网卡的IRQ中断,其中内核/设备驱动程序安排发送/接收更多TCP/IP包),然后程序可能会执行更多的代码(但会被一个计时器中断,该计时器会导致内核执行一些任务切换,以允许其他进程有一些CPU时间),然后程序可能会执行更多的代码(并被CPU告知内核正在变热,内核可能会将进程迁移到另一个较冷的CPU而中断);而程序本身也不会意识到这些事情发生了(并且会认为它一直在使用CPU,而事实并非如此)。

伙计,我必须承认,我花了一段时间才理解整个答案(不得不用谷歌搜索你提到的一些事情),但我想我终于明白了。谢谢你,这是一个非常好的回答/解释,我可以清楚地看到你花了多少时间和耐心来仔细解释,我真的很感激你所做的:)非常感谢!