Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux kernel 什么是反向中断?_Linux Kernel_Network Programming_Device Driver - Fatal编程技术网

Linux kernel 什么是反向中断?

Linux kernel 什么是反向中断?,linux-kernel,network-programming,device-driver,Linux Kernel,Network Programming,Device Driver,因此,中断是硬件设备产生的电子信号,发送到内核以引起处理器的注意。但是,内核生成的指示设备执行某些操作的电子信号的术语是什么?例如,网络驱动程序具有类似于硬启动\u xmit和netif\u tx的功能。现在,许多网络适配器都有自己的指令集,当设备启动时,这些指令由内核读取并加载到内存中,这是正确的。因此,为了传输数据包,内核向网络适配器发送一个电子信号,该信号本质上是一条指令,用于开始传输加载到设备内存缓冲区的数据包,在此之前,排队的数据包在发送之前通过总线传输到内存缓冲区。如果这不正确,那么

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

内核是如何与设备“对话”的——严格取决于设备硬件接口。但在大多数情况下,这种交互是通过设备完成的(您可以读取寄存器值并写入寄存器)。内核如何准确地写入设备的寄存器——取决于设备如何连接到CPU。若设备连接到CPU内存总线——内核可以直接写入总线上相应的寄存器地址(和常规RAM的写入方式相同)。若设备通过类似于或的总线连接,内核将使用该总线协议与设备对话

如果您正在谈论将中断从CPU发送到某个外部设备(该设备通常也包含某种CPU)——通常通过线路完成,配置为输出

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

关于如何在PCI以太网卡上启动传输的问题。据我所知,您有两种机制来处理PCI总线上的设备寄存器:。第一个只是将PCI设备地址映射到RAM总线,第二个使用端口I/O总线(可在x86上使用)。这两个空间称为。当您想要开始传输时,通常会将一些值写入某些(在设备数据表中定义的)寄存器。要将PCI地址映射到内存总线,可以使用内核中的函数,该函数将虚拟地址返回到映射区域的开头。一旦映射了PCI设备,就可以使用常规函数(如
iowrite32()
等)读取/写入寄存器

例如,请参见驱动程序:

  • 函数,它将PCI设备地址映射到内存总线
  • 函数,该函数通过执行来启动传输,而这反过来只是
    iowrite32()
    操作

Sam,您的意思是PCI总线除了数据外还有一个控制信号部分,内核将传输指令总线到设备指令寄存器。Amirite?将我对你最后一个问题的所有评论和回答移到了真实的答案,这样更方便。