首页 > 解决方案 > 在没有系统调用的情况下写入磁盘

问题描述

我试图了解 ring 3 到 ring 0 的传输如何在操作系统中工作。

我想我了解系统调用的工作原理。

我的理解是,当用户模式程序想要进行系统调用时,它会设置调用参数并发送一个 INT,它将控制权转移到操作系统,然后操作系统将读取参数,完成这项工作,然后将控制权返回给用户程序。还有更优化的系统进入武器系统退出变体。

如果用户自愿调用系统调用,这一切对我来说都是有意义的。

然而,为了保证安全,操作系统不能假设调用者会使用系统调用来访问资源。

我的问题是——如果用户程序直接尝试访问资源(磁盘)而不涉及操作系统会发生什么。

操作系统如何拦截它?

标签: linux-kerneloperating-system

解决方案


任何 I/O 硬件,例如磁盘控制器,将(设计者的选择)要么响应 I/O 端口地址或内存空间地址,要么可能同时响应两者。没有其他方法可以与硬件对话。硬件坐在一些公共汽车上。程序代码必须读/写一些 I/O 端口或必须读/写一些“内存”地址,这实际上是设备而不是实际的 RAM。

在 x86 上,由于内核控制对两者的访问:

  • I/O 端口,通过设置或不设置 I/O 端口权限,防止环 3 访问

  • 物理内存空间地址(通过控制虚拟到物理地址的映射)

那么它绝对可以从用户模式中删除访问权限。

因此,没有用户模式可以执行的指令来寻址设备。这是任何硬件上内核/用户分离的基本方面:内核可以控制用户模式可以做什么。

要接受@sawdust 的评论 - 一旦内核设置了上述限制,然后:

  • 尝试发出 I/O 端口指令将陷入内核,因为未授予访问权限。

  • 访问内存空间设备地址简直无法表达;没有用户空间虚拟地址等同于所需的特定物理地址。


推荐阅读