为什么我会得到一个较高的地址,当我在Linux上使用的kmalloc与GFP_DMA?(Why am

2019-09-22 06:43发布

我写在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个工作。

Answer 1:

这个问题的答案似乎是kmalloc其实并没有返回一个指针身体,而是线性的指针,我必须转换成物理与virt_to_phys

感谢亚历克斯·布朗提供的答案在这里 。



文章来源: Why am I getting a high address when I use kmalloc with GFP_DMA in Linux?