Почему я получаю высокий адрес, когда использую kmalloc с GFP DMA в Linux?
Я пишу драйвер устройства для устройства DMA в Linux. В драйверах устройств Linux, Глава 15 , говорится:
Для устройств с такого рода ограничениями должна быть выделена память. из зоны ДМА путем добавления флага GFP_DMA на то резервируется память вызовом kmalloc или вызов get_free_pages. Когда этот флаг присутствует, только память, которая может адресация с 24 битами выделена. Кроме того, вы можете использовать общий слой DMA (который мы обсудим вкратце) для выделения буферов, которые работа вокруг ограничений вашего устройства
Я звоню kmalloc
Вот так:
physical_pointer0 = kmalloc(number_of_bytes, GFP_DMA);
И выводим результат следующим образом:
printk(KERN_INFO "pinmem:pinmen_write kmalloc succeeded. pointer is %p, buffer size is %dn", physical_pointer0, (unsigned)number_of_bytes);
И вот что я вижу:
Sep 9 00:29:45 nfellman_lnx kernel: [ 112.161744] pinmem:pinmen_write kmalloc succeeded. pointer is ffff880000180000, buffer size is 320800
Как я могу получить указатель на 0xffff880000180000
, который не помещается в 24 бита, если я использовал GFP_DMA?
kmalloc
), Как я могу получить его физический адрес?
Я есть работа в OpenSuse 12.
1 ответ:
Ответ на это, по-видимому, состоит в том, что
kmalloc
на самом деле возвращает не физический указатель, а скорее линейный указатель, который я должен преобразовать в физический с помощьюvirt_to_phys
.СпасибоАлексу Брауну за предоставленный ответздесь .