r8169_main ドライバーでは、レジスターの変数を void ポインターとして持っています。
このページでは
カーネルは通常、仮想アドレスを使用します。kmalloc()、vmalloc()、および同様のインターフェイスによって返されるアドレスはすべて仮想アドレスであり、void * に格納できます。
仮想メモリ システム (TLB、ページ テーブルなど) は、仮想アドレスを CPU の物理アドレスに変換し、「phys_addr_t」または「resource_size_t」として格納されます。カーネルは、レジスタなどのデバイス リソースを物理アドレスとして管理します
そのため、物理アドレスを使用してレジスタを処理するには、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;
その再利用性。任意のものを指すことができ、任意のものに置き換えることができます。これは、resource_size_t または phys_addr_t を必要とするレジスタを使用して、物理アドレス データ型の代わりに void ポインタを使用できることを意味します。
void __iomem *mmio_addr;
または、メモリにマップされたIOでは、すべてのレジスタがドライバとデバイスにもあるメモリ領域に配置されているためです。