我写在Linux中DMA设备的设备驱动程序。 在Linux设备驱动程序,第15章 ,它说:
对于这种限制的设备,内存应当从DMA区通过将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 %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
我怎样才能得到一个指针0xffff880000180000
,它不适合在24位,如果我用GFP_DMA?
难道说这不是我的内存块的物理地址? 如果不是(这将意味着我完全误解kmalloc
),我怎样才能得到它的物理地址?
我在OpenSuse当中12个工作。