Linux kernel 什么是反向中断?
因此,中断是硬件设备产生的电子信号,发送到内核以引起处理器的注意。但是,内核生成的指示设备执行某些操作的电子信号的术语是什么?例如,网络驱动程序具有类似于硬启动\u xmit和netif\u tx的功能。现在,许多网络适配器都有自己的指令集,当设备启动时,这些指令由内核读取并加载到内存中,这是正确的。因此,为了传输数据包,内核向网络适配器发送一个电子信号,该信号本质上是一条指令,用于开始传输加载到设备内存缓冲区的数据包,在此之前,排队的数据包在发送之前通过总线传输到内存缓冲区。如果这不正确,那么内核是如何“告诉”设备(实际的低级代码)开始在队列上传输数据的?内核是如何与设备“对话”的——严格取决于设备硬件接口。但在大多数情况下,这种交互是通过设备完成的(您可以读取寄存器值并写入寄存器)。内核如何准确地写入设备的寄存器——取决于设备如何连接到CPU。若设备连接到CPU内存总线——内核可以直接写入总线上相应的寄存器地址(和常规RAM的写入方式相同)。若设备通过类似于或的总线连接,内核将使用该总线协议与设备对话 如果您正在谈论将中断从CPU发送到某个外部设备(该设备通常也包含某种CPU)——通常通过线路完成,配置为输出 对于网络适配器(使用您提到的功能),它们很可能通过PCI总线连接到CPU。在PC机中,你们有专门的控制器来处理PCI总线,称为南桥。看这张图片以获得一些线索。要了解PCI总线的内部结构(即CPU如何向设备发送电信号),可以在维基百科上阅读 关于如何在PCI以太网卡上启动传输的问题。据我所知,您有两种机制来处理PCI总线上的设备寄存器:。第一个只是将PCI设备地址映射到RAM总线,第二个使用端口I/O总线(可在x86上使用)。这两个空间称为。当您想要开始传输时,通常会将一些值写入某些(在设备数据表中定义的)寄存器。要将PCI地址映射到内存总线,可以使用内核中的函数,该函数将虚拟地址返回到映射区域的开头。一旦映射了PCI设备,就可以使用常规函数(如Linux kernel 什么是反向中断?,linux-kernel,network-programming,device-driver,Linux Kernel,Network Programming,Device Driver,因此,中断是硬件设备产生的电子信号,发送到内核以引起处理器的注意。但是,内核生成的指示设备执行某些操作的电子信号的术语是什么?例如,网络驱动程序具有类似于硬启动\u xmit和netif\u tx的功能。现在,许多网络适配器都有自己的指令集,当设备启动时,这些指令由内核读取并加载到内存中,这是正确的。因此,为了传输数据包,内核向网络适配器发送一个电子信号,该信号本质上是一条指令,用于开始传输加载到设备内存缓冲区的数据包,在此之前,排队的数据包在发送之前通过总线传输到内存缓冲区。如果这不正确,那么
iowrite32()
等)读取/写入寄存器
例如,请参见驱动程序:
- 函数,它将PCI设备地址映射到内存总线
- 函数,该函数通过执行来启动传输,而这反过来只是
操作iowrite32()