【发布时间】:2022-01-20 16:10:44
【问题描述】:
我有一个小函数可以在 32 位架构上将虚拟内存地址转换为物理地址:
uint32_t VIRTBASE;
uint32_t getPhysForVirt(void* virt) {
uint32_t offset = (uint8_t*)virt - VIRTBASE;
return PHYSBASE + offset;
}
它在过去 10 年多的时间里编译和运行,没有任何问题。
我已经更改了编译器,以便为较新的架构构建存储库(现在首次支持 64 位)。
编译失败说明
从 ‘uint8_t*’ {aka ‘unsigned char*’} 到 ‘uint32_t’ {aka ‘unsigned int’} 的无效转换 [-fpermissive]
现在,我理解了该消息,但我不确定使此编译没有错误的必要步骤。
我只是确定我不想启用 -fpermissive。
【问题讨论】:
-
VIRTBASE是什么? -
它在过去 10 年多的时间里编译和工作,没有任何问题。 什么给你的印象是,它可以以任何方式、形状或形式尝试填充任何指针变成
uint32_t?这样做的代码 - 坦率地说 - 完全是废话。如果你现在应该让它工作,你有很多工作要做。我不会相信写那个 POS 的人的任何东西(不是“销售点”......) -
你甚至还没有看到它正在破坏的其他东西!直接访问 DMA 寄存器的内存并指示它将数据从这里复制到那里.. :)
-
我不想看 ;-)
-
我们确实需要更多信息来帮助您移植此代码。虚拟地址的含义还不清楚。它只是表示进程虚拟地址空间中的地址,即普通地址/指针吗?如果是这样,物理地址究竟是什么?这是用于进程间通信和共享内存中的地址,每个进程的基地址不同吗?
标签: c memory type-conversion