C代码,为什么要将地址0xFF00转换为结构?

C代码,为什么要将地址0xFF00转换为结构?,c,casting,struct,hex,C,Casting,Struct,Hex,我试图理解一些用C编写的USB Wi-Fi适配器Linux内核驱动程序代码。文件/drivers/net/wireless/rtl818x/rtl8187/dev.c中的行1456(以防有人想参考内核代码了解上下文)如下所示: 我很好奇正确的操作数在这里到底做了什么-(struct rtl818x_csr*)0xFF00。我一直将其解释为“将内存地址0xFF00转换为rtl818x\u csr类型,然后将其分配给priv->map”。如果我的解释是正确的,那么内存地址有什么特别之处,驱动程序可以

我试图理解一些用C编写的USB Wi-Fi适配器Linux内核驱动程序代码。文件
/drivers/net/wireless/rtl818x/rtl8187/dev.c
中的行
1456
(以防有人想参考内核代码了解上下文)如下所示:

我很好奇正确的操作数在这里到底做了什么-
(struct rtl818x_csr*)0xFF00。我一直将其解释为“将内存地址
0xFF00
转换为
rtl818x\u csr
类型,然后将其分配给
priv->map
”。如果我的解释是正确的,那么内存地址有什么特别之处,驱动程序可以可靠地判断它后面的内容将始终位于该地址?另一件我很好奇的事情是0xFF00只有16位。如果它正在强制转换内存地址,我希望是32/64位


有人能澄清这行代码中到底发生了什么吗?我想在我对C语法的理解中有一个缺陷。

将绝对地址强制转换为指向结构的指针是驱动程序访问设备(内存映射)寄存器的一种常见方法,就像普通的C结构一样


使用
0xff00
有效,因为C不进行数字的符号扩展。

0xff00
是系统IO地址空间中的一个地址。如果查看代码,地址永远不会被直接解引用,而是通过IO函数访问

例如,在通话中

rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD,
                 RTL818X_EEPROM_CMD_CONFIG);
然后调用Linux内核低级IO函数

将地址强制转换为指向结构的指针,以访问地址的偏移量,例如:

0xFF00 + offsetof(struct rtl818x_csr, EEPROM_CMD)

请注意,在上面的
rtl818x_iowrite8
调用中,由于
&
运算符,在传递
&priv->map->EEPROM_CMD
参数时不会发生解引用,只计算地址+偏移量。该解引用是通过内部调用的低级别函数来实现的,内部函数称为代码> RTL818XIIOWRITE8/COD>。

< P>您必须从设备的角度考虑这个问题。 从rtl8187设备映射的地址空间内的地址0xFF00开始,是一个内存范围,它保存的信息的结构与定义的rtl818x_csr结构相同

因此,在逻辑映射该区域后,可以开始对其执行总线读写操作,以控制设备。比如(因为我没有足够的声誉发布3个以上的超链接,所以我不得不再多剪两个超链接,但你明白了)。这些只是几个例子。如果你读了整个文件,你会看到读写到处都是

为了理解为什么该结构看起来如此以及为什么使用0xFF00而不是0xBEEF或0xDEAD,您必须查阅该设备的数据表

因此,如果您想开始研究内核代码,特别是设备驱动程序,那么您需要的不仅仅是代码。您还需要数据表或规范。这可能很难找到(请参阅大量的电子邮件线程和文章,征求供应商的开放文档)

不管怎样,我希望我回答了你的问题。
快乐的黑客

看起来RTL818x芯片组的控制/状态寄存器内存映射到地址0xFF00。
0xFF00 + offsetof(struct rtl818x_csr, EEPROM_CMD)