我正在为Linux中的DMA设备编写设备驱动程序。在Linux Device Drivers, Chapter 15中,它说:
对于具有此类限制的设备,应分配内存 通过将GFP_DMA标志添加到kmalloc或来自DMA区域 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 %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工作。