微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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内部调用的内部低级函数进一步实现取消引用.

原文地址:https://www.jb51.cc/c/118562.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐