我试图了解一些用C语言编写的用于USB Wi-Fi适配器的
Linux内核驱动程序代码.在文件/drivers/net/wireless/rtl818x/rtl8187/dev.c(以防万一有人想参考上下文的内核代码)1456行的内容:
priv->map = (struct rtl818x_csr *)0xFF00;
我很好奇正确的操作数在这里做了什么 – (struct rtl818x_csr *)0xFF00;.我一直在解释这句话“将内存地址0xFF00转换为类型为rtl818x_csr,然后将其分配给priv-> map”.如果我的解释是正确的,那么内存地址0xFF00有什么特别之处,驱动程序可以可靠地告诉它后面的内容总是在这个地址?我很好奇的另一件事是0xFF00只有16位.如果它正在转换内存地址,我期待32/64位.
任何人都可以准确地澄清这行代码中发生了什么吗?我想我对C语法的理解存在缺陷.
解决方法
0xFF00是系统IO地址空间中的地址.如果你查看代码,地址永远不会被直接解引用,而是通过IO函数访问.
例如,在通话中
rtl818x_iowrite8(priv,&priv->map->EEPROM_CMD,RTL818X_EEPROM_CMD_CONFIG);
地址被转换为指向结构的指针,以便从地址访问偏移量,例如:
0xFF00 + offsetof(struct rtl818x_csr,EEPROM_CMD)
请注意,在上面的rtl818x_iowrite8调用中,当传递& priv-> map-> EEPROM_CMD参数时,由于&而没有取消引用.运算符,仅计算地址偏移量.通过在rtl818x_iowrite8内部调用的内部低级函数进一步实现取消引用.