3

我正在为 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 中工作。

4

1 回答 1

3

这个问题的答案似乎是它kmalloc实际上并没有返回一个物理指针,而是一个线性指针,我必须将它转换为物理指针virt_to_phys

感谢Alex Brown在这里提供答案。

于 2012-09-10T06:57:35.377 回答