我有一个字符驱动程序,其中我添加的接口函数之一是alloc_contig(int order)
,其中order是所需数量的4K页的log2。 该函数分配连续的物理内存并使用remap_pfn_range
函数将其映射到用户空间使用情况。 我试图写的功能,它释放内存dealloc_contig(va)
现在在内核我有虚拟地址用户给予免费,我需要获得底层的物理地址,所以我试图使用virt_to_phys
,但它并没有给我期望的地址。 日志:虚拟内核逻辑地址
//allocating
page address is ffff880868764000 //allocated using alloc_pages
//deallocating
virtual address from user 7f4c7e095000
when converted to PA using virt_to_phys got f74c7e095000 instead of ffff880868764000
你能帮我吗?
谢谢你的帮助。你可以请,如果可能的话,指导我如何找到适当的VMA结构?正如我所看到的,在mm_strct中有一个名为mm_rb的红黑树,其中包含vma结构。那么如何访问进程的mm_struct,以及如何在此树中搜索? –
嗨,这是通过do_munmap() - > find_vma()完成的,你可以看看这个链接的源代码。 http://lxr.free-electrons.com/source/mm/mmap.c#L2411 – Lin