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考虑到上述信息和物理卡(英特尔公司82545EM),如何更好地理解io_ports或io_mem与英特尔公司82545EM卡之间的关系?
例如,如何知道在何种情况下使用io_port和io_mem地址?我是否可以使用某种类型的API来列出每个端口地址的用途以及如何使用它们?
io_mem地址与DMA地址的关系如何?
谢谢
发布于 2017-11-29 21:51:21
编程接口(包括哪些端口)应该由Intel记录;它们通常很好地记录硬件的编程接口(不像一些只提供驱动程序的供应商)。尽管开源Linux驱动程序通常对哪些端口有相当好的评论)。
但不,硬件并不是自我记录在这个层次的细节。相反,HW供应商发布文档(通常是在线的)。它将增加额外的硬件复杂性,为硬件提供一个标准的API来告诉您如何编程,而仅仅知道每个MMIO或编程-IO端口号的名称并不能告诉您如何使用它们的语义。
On x86,IO端口是一个独立于内存的地址空间,由in和out指令使用,而不是mov加载/存储。
现代硬件主要使用内存映射的I/O,其中普通加载/存储到特殊地址,访问设备上的IO寄存器。(在被翻译成PCI / PCIe消息之后)。
我不想给这个问题写一个巨大的答案,我只想指出I/O,在那里你可以阅读到与端口I/O和DMA相关的内容,还有指向更多内容的链接。
一个合理的大小,所以答案将无法教你所有的东西,你不知道司机如何与硬件互动,对不起。有很多关于这个问题的书,但除了书之外,我不知道该用什么资源来指导你。http://wiki.osdev.org/有很多好东西,例如它有几种以太网卡的编程细节。i217很长。它开始于:
我写这个Wiki是为了展示我自己的经验,让英特尔I217和82577LM网卡的驱动程序工作,在一个真正的原生裸金属硬件上工作,
它是Linux使用e1000e的一张卡,而不是e1000。看看其他有文章的NIC,看看其中一个是否是e1000卡,如果您对自己的硬件特别感兴趣的话。(像NE2000这样更简单的硬件可能是一个比英特尔网卡更好的起点。)
https://stackoverflow.com/questions/47558941
复制相似问题