【发布时间】:2012-07-08 13:27:58
【问题描述】:
最近我试图修改某人的 mmap 代码并遇到以下错误。 (实际上我现在对他们的代码有点怀疑,因为看起来他们在做一些不必要的事情 - 尝试将 MAP_FIXED 与他们自己的页面对齐内存一起使用。手册页建议使用 NULL 调用 mmap 作为 addr 参数应该在 Linux 上执行此操作。) 所以我想我至少会测试使用 NULL 地址调用 mmap。但是,当我更改它时,我不太明白 gcc 向我抛出的错误。他们的代码工作正常,而我得到 左值需要作为赋值的左操作数。
基本上他们在做以下事情:
uint8_t * ptr = (uint8_t *)mem;
if ((uint32_t)ptr % PAGE_SIZE)
{
ptr += PAGE_SIZE - ((uint32_t)ptr % PAGE_SIZE);
}
其中 mem 是一些 malloc 内存的 void *。
我正在尝试或多或少地使用类型转换:
if ((uint32_t)mem % PAGE_SIZE)
{
(uint8_t *)mem += PAGE_SIZE - ((uint32_t)mem % PAGE_SIZE); /* ERROR */
}
所以我认为我很聪明并删除了一个我认为不需要的变量。 有人可以告诉我为什么我的类型转换关闭了吗? 干杯。
【问题讨论】:
-
这不是一个答案,但需要注意的是原始代码做错了很多事情。如果地址一开始是页面对齐的,他们的页面对齐代码将浪费一整页。
mmap(和MAP_FIXED)在malloc获得的内存上可能是一个错误,除非你确定你永远不会释放它。