我正在为 Linux 中的 DMA 设备编写设备驱动程序。在Linux 设备驱动程序第 15 章中,它说:
对于具有这种限制的设备,应通过将 GFP_DMA 标志添加到 kmalloc 或 get_free_pages 调用来从 DMA 区域分配内存。当此标志存在时,仅分配可以用 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 %d\n", 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
如果我使用 GFP_DMA,如何获得0xffff880000180000
不适合 24 位的指针?
难道这不是我的内存块的物理地址?如果不是(这意味着我完全误解kmalloc
了),我怎样才能得到它的物理地址?
我在 OpenSuse 12 中工作。