【问题标题】:Programming guide for Intel Corporation 82545EM ethernet card英特尔公司 82545EM 以太网卡编程指南
【发布时间】:2017-11-29 17:58:38
【问题描述】:

操作系统: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

鉴于上述信息和物理卡(英特尔公司 82545EM),如何更好地了解 io_ports 或 io_mem 与英特尔公司 82545EM 卡的关系?

例如,如何知道在什么情况下使用 io_port 和 io_mem 地址?我可以使用某种类型的 API 来列出每个端口地址的用途以及如何使用它们?

io_mem 地址与 DMA 地址有何关系?

谢谢

【问题讨论】:

  • 英特尔应该记录编程接口(包括哪些端口做什么);他们通常很擅长为他们的硬件记录编程接口(不像一些只提供驱动程序的供应商。尽管开源 Linux 驱动程序通常有相当不错的关于哪些端口是什么的 cmets)。
  • 更一般地说,“io port”和“io mem”'port'有什么区别?
  • 但是不,硬件并没有自我在那个细节级别上记录。相反,硬件供应商会发布文档(通常是在线的)。拥有一个标准的硬件 API 会增加额外的硬件复杂性,以便告诉您如何对其进行编程,并且仅知道每个 MMIO 的名称或编程的 IO 端口号不会告诉您如何使用它们的语义。

标签: linux-kernel x86-64 pci nic


【解决方案1】:

英特尔应记录编程接口(包括哪些端口做什么);他们通常很擅长为他们的硬件记录编程接口(不像一些只提供驱动程序的供应商。尽管开源 Linux 驱动程序通常有相当不错的关于哪些端口是什么的 cmets)。

但不,硬件并没有自我以那种详细程度记录。相反,硬件供应商会发布文档(通常是在线的)。如果有一个标准的硬件 API 来告诉你如何编程它会增加额外的硬件复杂性,并且仅仅知道每个 MMIO 的名称或编程的 IO 端口号不会告诉你如何使用它们的语义。


在 x86 上,IO 端口是独立于内存的地址空间,供 inout 指令使用,而不是 mov 加载/存储。

现代硬件主要使用内存映射 I/O,其中普通加载/存储到特殊地址访问设备上的 IO 寄存器。 (被翻译成PCI/PCIe消息后)。

我没有试图为此写一个巨大的答案,我只是向您指出https://en.wikipedia.org/wiki/Memory-mapped_I/O,您可以在其中阅读有关端口 I/O 与 DMA 的对比,并提供更多内容的链接。

一个合理大小的 SO 答案将无法教给您所有您不知道的关于驱动程序如何与硬件交互的知识,抱歉。关于这个主题有整本书,但除了书籍之外,我不确定要指出哪些资源。 http://wiki.osdev.org/ 有很多好东西,例如它有几种以太网卡的编程细节。 http://wiki.osdev.org/Intel_Ethernet_i217 很长。它开始了:

我写这个 Wiki 是为了展示我自己在真正的原生裸机硬件上为英特尔 I217 和 82577LM 网卡获得工作驱动程序的经验,

这是一张 Linux 使用 e1000e 的卡,而不是 e1000。如果您对自己的硬件特别感兴趣,请查看其他 NIC 的文章,看看其中一个是否是 e1000 卡。 (NE2000 等更简单的硬件可能比花哨的 Intel NIC 更好。)

【讨论】:

    猜你喜欢
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-03
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    • 1970-01-01
    相关资源
    最近更新 更多