【问题标题】:Writing to a disk without syscall在没有系统调用的情况下写入磁盘
【发布时间】:2021-02-15 01:00:14
【问题描述】:

我正在尝试了解 ring 3 到 ring 0 传输在操作系统中的工作原理。

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

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

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

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

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

操作系统如何拦截它?

【问题讨论】:

  • 你会如何假设用户程序“直接尝试访问磁盘”?怎么表达?
  • 我假设设备驱动程序只是在执行一些 CPU 指令来写入磁盘或向磁盘发出信号,如果用户程序直接执行该指令会怎样?操作系统如何保证安全?
  • 在 x86 上,I/O 端口可以限制在 ring 0,并且 I/O 地址空间不需要包含在 ring 3 地址空间中。因此,没有用户模式可以执行的指令来寻址设备。这是任何硬件上内核/用户分离的基本方面:内核可以控制用户模式可以做什么。
  • 谢谢!我只是碰巧阅读了Linux设备驱动程序书中关于IO端口的章节,所以我理解你的说法。但是,我有一个问题——什么要求用户程序使用 IO 端口来写入设备?为什么用户程序不能只通过 OS 和 IO 端口,在用户空间程序本身实现 IO 端口功能的逻辑?另外,难道不能同时使用 DMA 并绕过 OS 和 CPU 吗?
  • 任何 I/O 硬件,例如磁盘控制器,都将(设计者选择)响应 I/O 端口地址或内存空间地址。没有其他方法可以与硬件对话。由于内核控制对 I/O 端口和物理内存空间地址的访问,它绝对可以从用户模式中删除访问。

标签: linux-kernel operating-system


【解决方案1】:

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

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

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

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

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

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

接收@sawdust 的评论 - 一旦内核设置了上述限制,那么:

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

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

【讨论】:

  • 谢谢。但是DMA呢?它不允许程序绕过CPU吗?我认为绕过是 DMA 提高性能的重点。
  • DMA 在没有 CPU 参与的情况下传输数据,但您首先必须告诉设备传输数据 - 这是您无法做到的。磁盘不只是启动并决定他们想要传输数据。
  • 啊。谢谢。有没有好书或文章可以深入理解这一点?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-15
  • 2014-12-16
  • 2018-01-18
  • 1970-01-01
  • 1970-01-01
  • 2017-10-22
  • 1970-01-01
相关资源
最近更新 更多