5

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

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

  #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 进行输入/输出通信吗?

谢谢。

4

3 回答 3

8

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

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

您可以在此处此处阅读有关 PIC 的信息。

如果这不能提供足够的详细信息来理解命令和位掩码,您可以随时参考芯片的数据表

于 2012-01-22T11:18:13.523 回答
1

器件特定代码最好与相应的数据表一起阅读。例如,“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地址空间”。

于 2012-01-22T11:32:29.483 回答
1

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

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

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

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

于 2012-01-22T14:51:42.620 回答