比如下面这个输出,Memory at 有 2 行,我的 cpu 是 x86 32 位的,这里为什么显示 64 位?另外 size=4k ,size=16k ,这里的 4k 和 16k 是什么的大小?
root@develop:~# lspci -s 05:00.0 -v
05:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 15)
Subsystem: Realtek Semiconductor Co., Ltd. TP-Link TG-3468 v4.0 Gigabit PCI Express Network Adapter
Flags: bus master, fast devsel, latency 0, IRQ 27, IOMMU group 15
I/O ports at e000 [size=256]
Memory at fcc04000 (64-bit, non-prefetchable) [size=4K]
Memory at fcc00000 (64-bit, non-prefetchable) [size=16K]
Capabilities: [40] Power Management version 3
Capabilities: [50] MSI: Enable- Count=1/1 Maskable- 64bit+
Capabilities: [70] Express Endpoint, MSI 01
Capabilities: [b0] MSI-X: Enable+ Count=4 Masked-
Capabilities: [d0] Vital Product Data
Capabilities: [100] Advanced Error Reporting
Capabilities: [140] Virtual Channel
Capabilities: [160] Device Serial Number 01-00-00-00-68-4c-e0-00
Capabilities: [170] Latency Tolerance Reporting
Capabilities: [178] L1 PM Substates
Kernel driver in use: r8169
Kernel modules: r8169
root@develop:~#
root@develop:~# lspci -s 05:00.0 -x
05:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 15)
00: ec 10 61 81 07 04 10 00 15 00 00 02 10 00 00 00
10: 01 e0 00 00 00 00 00 00 04 40 c0 fc 00 00 00 00
20: 04 00 c0 fc 00 00 00 00 00 00 00 00 ec 10 68 81
30: 00 00 00 00 40 00 00 00 00 00 00 00 ff 01 00 00
root@develop:~#
使用 lspci -x 输出了这个设备的 configuration space ,从 configuration space 的内容解析出来的 BAR 地址和-x 输出的 Memory at 的地址对不上又是怎么回事?
1
systemcall 2022-12-29 18:09:02 +08:00
4k 和 16k 是内存地址的大小,你在 Windows 上的设备管理器上也可以看到这 2 个内存地址。区别是 Linux 是告诉你起始位置和大小,Windows 是告诉你范围
你确定 CPU 是 x86 32 位的吗?我记得这种 CPU 现在是很少见的,新一点的机器里也就 n270 之类的是 32 位的了 |
2
wniming OP @systemcall 感谢回复,我用 qemu 模拟的 32 位 cpu
|
3
wniming OP @systemcall 内存地址的大小是什么意思?地址还有大小?
|
4
systemcall 2022-12-29 18:34:40 +08:00
@wniming #3
那一段内存地址可以操作那一个设备 你要操作一个设备,就是在那段内存地址里面操作。你要是玩过单片机就比较好理解。比如一个字节是调整串口方向,另一个字节是读写那个串口,这些地址在手册里面就会告诉你。PCI 是自动枚举,有一些 API 可以拿到地址,之后你就可以参考手册操作那些地址来控制硬件。但是 x86 比单片机复杂多了 |