【问题标题】:Low level I/O access using outb and inb使用 outb 和 inb 进行低级 I/O 访问
【发布时间】:2012-02-16 03:39:30
【问题描述】:

我很难理解中断是如何工作的。

下面的代码初始化可编程中断控制器

  #define PIC0_CTRL 0x20    /* Master PIC control register address. */
  #define PIC0_DATA 0x21    /* Master PIC data register address. */

  /* Mask all interrupts*/
  outb (PIC0_DATA, 0xff);

  /* Initialize master. */
  outb (PIC0_CTRL, 0x11); /* ICW1: single mode, edge triggered, expect ICW4. */
  outb (PIC0_DATA, 0x20); /* ICW2: line IR0...7 -> irq 0x20...0x27. */
  outb (PIC0_DATA, 0x04); /* ICW3: slave PIC on line IR2. */
  outb (PIC0_DATA, 0x01); /* ICW4: 8086 mode, normal EOI, non-buffered. */

  /* Unmask all interrupts. */
  outb (PIC0_DATA, 0x00);

谁能给我解释一下它是如何工作的:

-outb的作用(我不懂linux man)

-地址及其含义

另一个不相关的问题,我读到 outb 和 inb 用于端口映射 I/O,我们可以使用内存映射 I/o 进行输入/输出通信吗?

谢谢。

【问题讨论】:

  • 对于由内存映射 IO 控制的硬件(PIC 不是)你当然可以做内存映射 IO。
  • 8086 继承了其前身 8080 和 8085 的这些指令,其中单独的 I/O 空间非常有用,以免浪费任何 64k 内存地址空间。

标签: c assembly io interrupt hardware-port


【解决方案1】:

outb() 将其第二个参数指定的字节写入其第一个参数指定的 I/O 端口。在这种情况下,“端口”是 CPU 与另一个芯片进行通信的一种方式。

您提供的特定 C 代码与 8259A 可编程中断控制器 (PIC) 相关。

您可以阅读有关 PIC herehere 的信息。

如果这不能提供足够的细节来理解命令和位掩码,您可以随时参考芯片的datasheet

【讨论】:

    【解决方案2】:

    最好结合相应的数据表阅读器件特定代码。例如,“8259A 可编程中断控制器”数据表 (http://pdos.csail.mit.edu/6.828/2005/readings/hardware/8259A.pdf) 清楚(但简明地)解释了几乎所有内容。

    但是,此数据表将仅说明如何使用该芯片(在任何系统中),而不会说明如何在特定系统中使用该芯片(例如,在“PC 兼容”80x86 系统中)。为此,您需要依赖“隐含的事实标准”(因为 PIC 芯片的许多功能并未在“PC 兼容”80x86 系统上使用,并且可能不受现代/集成芯片组的支持)。

    通常(出于历史原因)PIC 芯片的 IRQ 以一种奇怪/错误的方式映射到中断。例如,IRQ 0 映射到中断 8,与 CPU 的双重故障异常冲突。您发布的特定代码重新映射了 PIC 芯片,以便将 IRQ0 映射到中断 0x20(而 IRQ1 映射到中断 0x21,...,IRQ 15 映射到 IRQ 0x2F)。这是操作系统通常为避免冲突而做的事情(例如,每个中断都用于 IRQ 或异常,而不是两者)。

    要了解“outb()”,请查看英特尔手册中的“OUT”指令。这就像有 2 个地址空间 - 一个用于普通物理地址,另一个用于 IO 端口,其中普通指令(间接)访问普通物理内存;而IO口指令(IN、OUT、INSB/W/D、OUTSB/W/D)访问单独的“IO地址空间”。

    【讨论】:

      【解决方案3】:

      传统的 8088/86 有一个内存控制信号,它本质上是另一个直接与指令相关的地址位。控制信号将访问分为 I/O 和内存,创建两个独立的地址空间。与 CS、DS 等在芯片内部创建单独的内存空间(在到达外部内存空间之前)不同。其他处理器系列使用所谓的内存映射 I/O。

      如今,内存控制器/系统以各种不同的方式在芯片内部和外部被分割,例如,有时使用许多控制信号来指示指令与数据、缓存行填充、直写与回写等。在外部电路上,内存映射发生在芯片内部,例如专用 rom 接口,与 ram 分离等位于边缘,比旧 8088/86 的 I/O 空间与内存空间更复杂和独立。

      out 和 in 指令以及一些家庭成员会改变您是在执行 I/O 访问还是内存访问,并且传统上,中断控制器是一个芯片,它对内存总线进行解码,寻找分配地址的 I/O 访问对于该设备。几十年后的反向兼容性,您拥有正在查看的当前代码。

      如果你真的想了解它,你需要找到包含中断控制器的设备的数据表,它可能与大型支持芯片上的一堆其他逻辑相结合。可能还需要其他数据表。

      【讨论】:

      • 对不起,我不明白,这是否意味着 x86 使用端口映射而不是内存映射访问?
      • 是的,我试图解释 I/O 映射与内存映射的含义,传统上,对于 x86,它意味着单个控制线。其他架构使用一个或多个地址位来做同样的事情。除了 x86 之外,控制信号与特殊指令相关联的差别很小。
      • pci 通过允许在任一地址空间中可寻址某些项目来增加复杂性。与内存相比,坚持输入/输出可能更容易控制和虚拟化。有一个 IOPM I/O 保护图,我认为每个 VM(在这种情况下甚至是 linux 机器上的简单应用程序)都有一个单独的 IOPM。查找适用于 Windows 的 giveio 驱动程序以了解有关此问题以及如何解决此问题的更多信息。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-12
      • 1970-01-01
      • 1970-01-01
      • 2019-07-24
      • 2013-11-09
      相关资源
      最近更新 更多