问题标签 [mmio]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
62 浏览

c - 可以在变量中使用 void 指针来写入和访问内存映射的硬件寄存器吗?

在 r8169_main 驱动程序中,它们具有寄存器变量作为 void 指针..

在本页面

内核通常使用虚拟地址。kmalloc()、vmalloc() 和类似接口返回的任何地址都是虚拟地址,可以存储在 void *.

虚拟内存系统(TLB、页表等)将虚拟地址转换为 CPU 物理地址,存储为“phys_addr_t”或“resource_size_t”。内核将寄存器等设备资源管理为物理地址<-[因此它的寄存器物理地址为什么 rtl8169 驱动程序使用 void * <-Q

所以要处理寄存器,我们使用物理地址可以是phys_addr_tresource_size_t。但我很困惑为什么在 r8168 以太网驱动程序中他们这样做

带空指针

void 指针通常用于虚拟地址,但寄存器不是虚拟地址。那么使用 void 指针作为寄存器的原因可能是什么

还是因为 void 指针可以包含任何内容。

它的可重用性。它可以指向任何东西并替换任何东西意味着我可以使用 void 指针代替需要 resource_size_t 或 phys_addr_t 的寄存器的物理地址数据类型

无效 __iomem *mmio_addr;

还是因为在内存映射 IO 中,所有寄存器都放置在驱动程序和设备也拥有它的内存区域上。