0

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

在本页面

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

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

所以要处理寄存器,我们使用物理地址可以是phys_addr_tresource_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 中,所有寄存器都放置在驱动程序和设备也拥有它的内存区域上。

4

0 回答 0