我正在试图弄清楚如何在物理内存中分配连续的内存缓冲区并获取其物理地址。我已经在SO上阅读了很多帖子,但它们似乎都没有起作用。
据我所知,我必须为此创建一个内核模块。我也正在阅读Linux设备驱动程序,第3版。它有很多有用的信息,但到目前为止我还没找到我正在寻找的东西。我不是Linux的新手,但我从未在内核和驱动程序级别上工作过。
到目前为止,我已尝试过以下
virtAddr = kmalloc(mysize, GFP_KERNEL);
physAddr = virt_to_phys(virtAddr);
printk("virtAddr = %x, physAddr = %x\n", virtAddr, physAddr);
kfree(virtAddr);
以下内容:
virtAddr = dma_alloc_coherent(NULL, mysize, &mydma_handle, GFP_KERNEL);
physAddr = virt_to_phys(virtAddr);
physAddr = virt_to_phys(virtAddr);
printk("virtAddr = %x, physAddr = %x\n", virtAddr, physAddr);
dma_free_coherent(NULL, mysize, virtAddr, dma_handle);
当我查看dmesg
日志时,我发现在两种情况下,virtAddr和physAddr具有相同的值,即对于情况一,它看起来会像(值不精确,它只是选择演示一点)
virtAddr = d00abe, physAddr = d00abe
对于案例2,输出看起来像(值不精确,只是选择它来证明一个点)
virtAddr = ac435f, physAddr = ac435f
我在使用英特尔处理器的普通PC上运行此代码,因此我非常怀疑虚拟和物理地址可能具有相同的值。显然我误解了一些东西,所以如果有人可以教我这个,我会非常感激。