在 r8169_main 驱动程序中,它们具有寄存器变量作为 void 指针..
在本页面
内核通常使用虚拟地址。kmalloc()、vmalloc() 和类似接口返回的任何地址都是虚拟地址,可以存储在 void *.
虚拟内存系统(TLB、页表等)将虚拟地址转换为 CPU 物理地址,存储为“phys_addr_t”或“resource_size_t”。内核将寄存器等设备资源管理为物理地址<-[因此它的寄存器物理地址为什么 rtl8169 驱动程序使用 void * <-Q
所以要处理寄存器,我们使用物理地址可以是phys_addr_t
或 resource_size_t
。但我很困惑为什么在 r8168 以太网驱动程序中他们这样做
void __iomem *mmio_addr;
带空指针
#define RTL_W8(tp, reg, val8) writeb((val8), tp->mmio_addr + (reg));
void 指针通常用于虚拟地址,但寄存器不是虚拟地址。那么使用 void 指针作为寄存器的原因可能是什么
还是因为 void 指针可以包含任何内容。
int i=100;
void *p=&i;
printf("%d ",*(int*)p);
return 0;
它的可重用性。它可以指向任何东西并替换任何东西意味着我可以使用 void 指针代替需要 resource_size_t 或 phys_addr_t 的寄存器的物理地址数据类型
无效 __iomem *mmio_addr;
还是因为在内存映射 IO 中,所有寄存器都放置在驱动程序和设备也拥有它的内存区域上。