C代码,为什么地址0xFF00被强制转换为结构?

前端之家收集整理的这篇文章主要介绍了C代码,为什么地址0xFF00被强制转换为结构?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图了解一些用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);

然后调用Linux内核低级IO功能.

地址被转换为指向结构的指针,以便从地址访问偏移量,例如:

0xFF00 + offsetof(struct rtl818x_csr,EEPROM_CMD)

请注意,在上面的rtl818x_iowrite8调用中,当传递& priv-> map-> EEPROM_CMD参数时,由于&而没有取消引用.运算符,仅计算地址偏移量.通过在rtl818x_iowrite8内部调用的内部低级函数进一步实现取消引用.

猜你在找的C&C++相关文章