什么是反向中断?

时间:2015-10-21 16:56:59

标签: linux-kernel network-programming device-driver

因此中断是由硬件设备生成并发送到内核以获得处理器注意的电子信号。但是内核生成的电子信号用于指示设备执行某些操作的术语是什么?例如,网络驱动程序具有 hard_start_xmit netif_tx 等功能。现在许多网络适配器都有自己的指令集是正确的,当设备启动时,这些指令由内核读取并加载到内存中。因此,为了发送分组,内核向网络适配器发送电子信号,该信号本质上是开始发送加载到设备存储缓冲器上的分组的指令,在此之前,排队的分组在它们被发送之前被总线连接到存储缓冲器。如果这不正确,那么内核如何“告诉”设备(实际的低级代码)开始在队列上传输数据?

1 个答案:

答案 0 :(得分:2)

内核如何与设备“交谈” - 严格依赖于设备硬件接口。但在大多数情况下,这种交互是通过设备registers完成的(您可以读取寄存器值并写入寄存器)。内核如何准确写入设备寄存器 - 取决于设备如何连接到CPU。如果设备连接到CPU内存总线 - 内核可以只写入总线上相应的寄存器地址(与常规RAM的相同方式)。如果设备通过某个总线连接,如I2CPCI - 内核使用该总线协议与设备进行通信。

如果您正在讨论从CPU向某些外部设备发送中断(通常还有某种CPU) - 通常通过GPIO行完成,配置为输出。

对于网络适配器(使用您提到的功能),很可能它们通过PCI总线连接到CPU。在PC中,您有专用的控制器来处理PCI总线,称为南桥。看看this图片以获得一些线索。要弄清楚PCI总线的内部结构(即CPU如何向设备发送电子信号) - 您可以在维基百科上阅读article on PCI

关于如何在PCI以太网卡上启动传输的问题。根据我的理解,您有两种机制来处理PCI总线上的设备寄存器:MMIO and PMIO。首先是将PCI设备地址映射到RAM总线,其次是使用端口I / O总线(在x86上可用)。这两个空格称为BARs。当您想要开始传输时,通常会向某些(在器件数据手册中定义)寄存器中写入一些值。要将PCI地址映射到内存总线,可以在内核中使用pci_iomap()函数,它将虚拟地址返回到映射区域的开头。一旦映射了PCI设备,就可以使用常规功能(如iowrite32()等)来读/写注册。

例如,请参阅Realtek 8139驱动程序: