Здравствуйте!
Мне нужно выделить 256-512 Мб непрерывной(!) физической памяти и иметь прямой доступ к ней из пространства пользователя.
Для выделения памяти я решил использовать патч CMA.
По моей задумке все должно происходить так:
1. CMA выделят нужное кол-во памяти во время загрузки системы.
2. Парсится вывод CMA патча, который имеет вид, например: «CMA: reserved 256 MiB at 27400000» и из него извлекаются данные: размер CMA области = 256*1024*1024 байта и физический адрес этой области = 0х27400000 (это значение только для моей системы разумеется).
3. Маппирую нужное кол-во байт функцией mmap() в файл /dev/mem с оффсетом = 0х27400000. Естественно, параметр CONFIG_STRICT_DEVMEM отключен.
Все вроде как просто, но следующий код приводит к segmentation fault(объем памяти тут взял = 1Мб):
int file;
void* start;
file=open("/dev/mem", O_RDWR | O_SYNC);
if ( (start = mmap(0, 1024*1024, PROT_READ | PROT_WRITE, MAP_SHARED, file, 0x27400000)) == MAP_FAILED ){
perror("mmap");
}
for (int offs = 0; offs<50; offs++){
cout<<((char *)start)[offs];
}
Выводит следующее: mmap: Invalid argument.
Но если в этом коде оффсет поменять на ноль или на многие другие значения (которые я брал из /proc/iomem), то код работает прекрасно и выводит мусор, как и ожидается.
Судя по информации из того же /proc/iomem физический адрес CMA зоны (0х27400000 на моей системе) всегда находится в System RAM. И этот участок система никак не позволяет мне смаппировать.
Подскажите пожалуйста, как можно это сделать?
Заранее спасибо!