Используйте зарезервированную память и понимайте функцию memremap().Linux

Ответить
Anonymous
 Используйте зарезервированную память и понимайте функцию memremap().

Сообщение Anonymous »

Я пытаюсь реализовать свой собственный драйвер Linux для области зарезервированной памяти. Я следую этому описанию: https://xilinx-wiki.atlassian.net/wiki/ ... ved+Memory
Резервирование памяти уже работает как ожидал. Теперь я пишу свой драйвер для Linux, используя функцию memremap() в моей функции проверки:

Код: Выделить всё

paddr = r.start;
vaddr = memremap(paddr, 4096, MEMREMAP_WB);
printk("Allocated reserved memory, vaddr: 0x%0X, paddr: 0x%0X\n", (u32)vaddr, paddr);
printk("Allocated reserved memory, paddr (2): 0x%0x\n", virt_to_phys(vaddr));
Я пытаюсь понять memremap() и virt_to_phys(), поскольку для драйвера важно получить доступ к правильным физическим сумматорам в paddr< /эм>. Учитывая приведенную выше строку, я ожидаю, что у меня два раза один и тот же физический адрес paddr.
К сожалению, результат:

Код: Выделить всё

[10370.743577] Allocated reserved memory, vaddr: 0xE0847000, paddr: 0x20000000
[10370.750564] Allocated reserved memory, paddr (2): 0x20847000
Таким образом, при попытке вернуть физический адрес из vaddr с помощью virt_to_phys() происходит смещение в 0x847000 байтов
>. Откуда берется это смещение? Я ожидаю, что драйвер читает и записывает в 0x20000000 вместо 0x20847000.
Спасибо за любую подсказку

Подробнее здесь: https://stackoverflow.com/questions/792 ... p-function
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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