有关OS保护边界的真实示例?

问题描述 投票:0回答:1

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

我一直在阅读它,并且似乎如果用户级别的某项尝试执行禁止的操作,则硬件将触发陷阱并将控件发送回内核级别的操作系统,并且内核将处理这种情况。

这怎么可能?如何将某些事情直接从用户级别转到硬件级别,难道不是所有通过系统调用(在内核级别)进行的交互吗?然后,内核将预计该操作是否非法。

我有点困惑,我认为一个真实的示例(使用用户级应用程序+操作系统,例如linux)可能会帮助我理解,如果有人能够做到,我将非常感谢。

operating-system
1个回答
0
投票

如何从用户级别直接转到硬件,不是所有通过系统调用(在内核级别)进行的交互?

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

a)任何中断,包括:

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

  • 任何IRQ(从设备上引起注意)

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

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

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

  • SYSCALL,SYSENTER

  • 涉及呼叫门或任务门的“远距离呼叫”或“ jmp远距离”

  • 软件中断(来自同一CPU)。提及两次,因为它同时适用于两个类别。

请注意,内核可能出于各种原因而提供多个入口点(例如,一个用于64位进程,另一个用于32位进程,或者可能一个用于所有进程,而另一个只能由特殊/受信任的进程使用,或者一个对于快速执行的代码来说速度快但很大,而对于减小不频繁执行的代码的大小来说又小又慢,或者...);可能会使用中断(例如,异常-我之前使用过“断点异常”)来代替内核API的特殊指令,或者除了此以外,还使用了内核API的特殊指令。

[所有这些都具有2个特殊特征-它们都导致/允许跨越“用户级和内核之间的边界”;并且控制权传递给的代码的位置由内核而不是调用方(用户级别代码)确定,以便内核可以保护/保护其所有入口点。

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

最后;几乎所有用于通用用途的CPU(不包括您发现嵌入在微波炉中的一些微型微处理器)都具有与80x86相似的功能

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

© www.soinside.com 2019 - 2024. All rights reserved.