英特尔公司 82545EM 以太网卡编程指南
Programming guide for Intel Corporation 82545EM ethernet card
OS:Centos x86_64
以太网驱动程序:E1000
root@localhost e1000]# cat /proc/ioports | grep e1000
2000-203f : e1000
[root@localhost e1000]# cat /proc/iomem | grep e1000
fd5c0000-fd5dffff : e1000
fdff0000-fdffffff : e1000
根据以上信息和实物卡(Intel Corporation 82545EM),如何更好地理解io_ports或io_mem与Intel Corporation 82545EM卡的关系?
例如,如何知道在什么情况下使用 io_port 与 io_mem 地址?是否有某种类型的 API 我可以使用它列出了每个端口地址的用途以及如何使用它们?
io_mem 地址与 DMA 地址有什么关系?
谢谢
英特尔应该记录编程接口(包括哪些端口做什么);他们通常非常擅长记录硬件的编程接口(不像一些只提供驱动程序的供应商。虽然开源 Linux 驱动程序通常对哪些端口是什么有相当不错的评论)。
但是不,硬件不是 self 那样详细的文档。相反,硬件供应商发布文档(通常是在线的)。它会增加额外的硬件复杂性,让硬件有一个标准 API 来告诉你如何对其进行编程,而仅仅知道每个 MMIO 的名称或已编程的 IO 端口号不会告诉你如何进行编程的语义使用它们。
在 x86 上,IO 端口是一个独立于内存的地址 space,由 in
和 out
指令使用,而不是 mov
load/store.
现代硬件大多使用内存映射 I/O,其中普通加载/存储到特殊地址访问设备上的 IO 寄存器。 (在被翻译成 PCI / PCIe 消息之后)。
我不想为此写一个巨大的答案,我只是向您指出 https://en.wikipedia.org/wiki/Memory-mapped_I/O,您可以在其中阅读有关端口 I/O 与 DMA 的内容,以及指向的链接更多内容。
一个合理的 SO 答案无法教给您所有您不知道的有关驱动程序如何与硬件交互的知识,抱歉。有关于这个主题的整本书,但除了书籍之外,我不确定可以为您指出哪些资源。 http://wiki.osdev.org/ has lots of good stuff, for example it has the programming details for several kinds of ethernet card. http://wiki.osdev.org/Intel_Ethernet_i217 很长。它开始于:
I am writing this Wiki as a demonstration of my own experience of getting a working driver for the Intel I217 and 82577LM network cards to work, on a real native bare metal hardware,
这是一张Linux使用e1000e
的卡,不是e1000。如果您对自己的硬件特别感兴趣,请查看有关其他 NIC 的文章,看看其中一个是否是 e1000
卡。 (像 NE2000 这样更简单的硬件可能比花哨的 Intel NIC 更好。)
OS:Centos x86_64
以太网驱动程序:E1000
root@localhost e1000]# cat /proc/ioports | grep e1000
2000-203f : e1000
[root@localhost e1000]# cat /proc/iomem | grep e1000
fd5c0000-fd5dffff : e1000
fdff0000-fdffffff : e1000
根据以上信息和实物卡(Intel Corporation 82545EM),如何更好地理解io_ports或io_mem与Intel Corporation 82545EM卡的关系?
例如,如何知道在什么情况下使用 io_port 与 io_mem 地址?是否有某种类型的 API 我可以使用它列出了每个端口地址的用途以及如何使用它们?
io_mem 地址与 DMA 地址有什么关系?
谢谢
英特尔应该记录编程接口(包括哪些端口做什么);他们通常非常擅长记录硬件的编程接口(不像一些只提供驱动程序的供应商。虽然开源 Linux 驱动程序通常对哪些端口是什么有相当不错的评论)。
但是不,硬件不是 self 那样详细的文档。相反,硬件供应商发布文档(通常是在线的)。它会增加额外的硬件复杂性,让硬件有一个标准 API 来告诉你如何对其进行编程,而仅仅知道每个 MMIO 的名称或已编程的 IO 端口号不会告诉你如何进行编程的语义使用它们。
在 x86 上,IO 端口是一个独立于内存的地址 space,由 in
和 out
指令使用,而不是 mov
load/store.
现代硬件大多使用内存映射 I/O,其中普通加载/存储到特殊地址访问设备上的 IO 寄存器。 (在被翻译成 PCI / PCIe 消息之后)。
我不想为此写一个巨大的答案,我只是向您指出 https://en.wikipedia.org/wiki/Memory-mapped_I/O,您可以在其中阅读有关端口 I/O 与 DMA 的内容,以及指向的链接更多内容。
一个合理的 SO 答案无法教给您所有您不知道的有关驱动程序如何与硬件交互的知识,抱歉。有关于这个主题的整本书,但除了书籍之外,我不确定可以为您指出哪些资源。 http://wiki.osdev.org/ has lots of good stuff, for example it has the programming details for several kinds of ethernet card. http://wiki.osdev.org/Intel_Ethernet_i217 很长。它开始于:
I am writing this Wiki as a demonstration of my own experience of getting a working driver for the Intel I217 and 82577LM network cards to work, on a real native bare metal hardware,
这是一张Linux使用e1000e
的卡,不是e1000。如果您对自己的硬件特别感兴趣,请查看有关其他 NIC 的文章,看看其中一个是否是 e1000
卡。 (像 NE2000 这样更简单的硬件可能比花哨的 Intel NIC 更好。)