Я работаю над встроенной целью и хочу определить пулы памяти.Как применить маску к адресу const void *?
Адрес памяти представлен как void*
. Однако в конкретном случае эти адреса кэшируются, и я хочу, чтобы они не смогли их напрямую получить «реальный» аппаратный адрес.
Я хочу, чтобы определить адрес начала memory_area
(который является только маркером):
#define UNCACHE_MASK 0xABCDEF12UL // Value of the mask to apply
extern uint32_t memory_area; // Global, defined somewhere else
const void * virtual_address = &memory_area; // OK
const void * real_address =
(void*)(virtual_address | UNCACHE_MASK); // guilty line
К сожалению, GCC
не позволит мне сделать это:
error: invalid operands to binary | (have 'const void *' and 'long unsigned int')
В отчаянии Я пробовал:
const void * real_address =
(void*)(((uint32_t)virtual_address) | UNCACHE_MASK); // guilty line
напрасно:
error: initializer element is not constant
Я действительно хочу сохранить const
для безопасности: это достижимо?
[EDIT]
- Я использую
gcc
v4.9 (с-std=gnu99
и много-Wxxx
флагов) на Linux. - Отрывок из файла
.h
, переменные являются «глобальными».
Здесь, вероятно, не имеет значения, вы знаете, что ваша арка 32-разрядная, но обычно вы должны использовать 'uintptr_t' для указания указателей на целые числа. (потому что в тот день, когда вы переносите свой материал на 64 бит, вы пожалеете об этом :) –
Правильно, спасибо за подсказку! – Coconop
Я не думаю, что «кеш» означает то, что вы думаете о нем, здесь. Звучит так, будто вы говорите о * виртуальных адресах *, которые не являются концепцией кэширования. Кэширование не изменяет адреса. – unwind