маппирование CMA области на /dev/mem

Вопросы программного кода и архитектуры Linux

Модератор: Olej

just_a_student
Писатель
Сообщения: 20
Зарегистрирован: 11 июл 2013, 20:57
Контактная информация:

маппирование CMA области на /dev/mem

Непрочитанное сообщение just_a_student » 21 янв 2014, 14:20

Здравствуйте!
Мне нужно выделить 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. И этот участок система никак не позволяет мне смаппировать.


Подскажите пожалуйста, как можно это сделать?
Заранее спасибо!

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: маппирование CMA области на /dev/mem

Непрочитанное сообщение Olej » 21 янв 2014, 16:55

just_a_student писал(а): Мне нужно выделить 256-512 Мб непрерывной(!) физической памяти и иметь прямой доступ к ней из пространства пользователя.
А зачем вам непрерывная физическая память?
Насколько я представляю, непрерывная физическая память нужна только для аппаратных устройств, сидящих на процессорной шине. Как правило, это устройства с DMA обменом.
Процессам в пространстве пользователя, вообще то, "до лампочки" должно быть физическое размещение памяти.

P.S. Я так понимаю, что речь у вас идёт о x86 архитектуре?
just_a_student писал(а): Для выделения памяти я решил использовать патч CMA.
Что за патч CMA?
Хоть ссылку какую-то бы дали... (поиск, по-верхам, ничего путнего не показывает).

Ответить

Вернуться в «Linux изнутри»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 4 гостя