Почему я получаю высокий адрес, когда использую 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 3

1 ответ:

Ответ на это, по-видимому, состоит в том, что kmalloc на самом деле возвращает не физический указатель, а скорее линейный указатель, который я должен преобразовать в физический с помощью virt_to_phys.

СпасибоАлексу Брауну за предоставленный ответздесь .