我有英特尔系统Ethernet controller: Intel Corporation 82579LM Gigabit Network Connection (Lewisville) (rev 04)
。我已经下载了数据表,如数据表Intel ® 82579 Gigabit Ethernet PHY
现在我正在读取 pci 以太网设备的 resource0,例如
if((fd = open("/sys/bus/pci/devices/0000:00:19.0/resource1", O_RDWR | O_SYNC)) == -1) {
perror("Error: open error");
}
int map_size = 4096UL;
...
map_base = mmap(0,4096UL , PROT_READ, MAP_SHARED, fd, Register_Values_From_Datasheet);
我有 x86-64 位系统。卡利 Linux 5.7。所以我 Register_Values_From_Datasheet
从上面替换数据表中的寄存器偏移值,例如0x00008
for STATUS:Device Status Register
=from datasheet
22:EINVAL
但 mmap() 的 errno在 mmap 调用后具有价值。表示无效的论点。也许我从数据表中读取的偏移值可能必须以其他方式解释。
我在以太网设备的 sys/bus/pci/devices/0000:00:19.0 中的资源文件是这样的
0x00000000fe400000 0x00000000fe41ffff 0x0000000000040200
0x00000000fe427000 0x00000000fe427fff 0x0000000000040200
0x000000000000f060 0x000000000000f07f 0x0000000000040101
0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 0x0000000000000000
从上面的资源文本文件(resource0)转储显示我的内存映射 IO 从 0x00000000fe400000 开始。所以我认为应该是 mmap (return (void*)=&0x00000000fe400000)= 的返回地址,但我得到类似的东西0xffffffff
,errno 是 22。任何人都可以指导我正确的方向来解释偏移量需要如何解释从数据表。此外,通常需要访问哪些寄存器才能获取 pci 以太网设备的数据包。因为我是设备编程的新手。