我正在 Linux 中为 DMA 设备编写设备驱动程序。在Linux 设备驱动程序,第 15 章 http://lwn.net/images/pdf/LDD3/ch15.pdf, 它说:
对于有这种限制的设备,应该分配内存
通过将 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
,如果我使用 GFP_DMA,它不适合 24 位?
难道这不是我的内存块的物理地址?如果不是(这意味着我完全误解了kmalloc
),我怎样才能得到它的物理地址?
我正在 OpenSuse 12 中工作。
这个问题的答案似乎是kmalloc
实际上并不返回物理指针,而是返回线性指针,我必须将其转换为物理指针virt_to_phys
.
谢谢亚历克斯·布朗 https://stackoverflow.com/users/121332/alex-brown为了提供答案here https://stackoverflow.com/a/12346036/1084.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)