嵌入式ARM程序高级调试基础:11.Linux 虚拟地址转物理地址实现
在 Linux 中,将虚拟地址转换为物理地址通常需要内核模块的支持,因为用户空间程序无法直接访问页表。以下是两种实现方式:
方法一:使用内核模块(推荐)
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/mm.h>
#include <linux/highmem.h>
static unsigned long virt_to_phys_example(unsigned long vaddr)
{
pgd_t *pgd;
p4d_t *p4d;
pud_t *pud;
pmd_t *pmd;
pte_t *pte;
struct page *page;
unsigned long paddr = 0;
// 获取当前进程的 mm_struct
struct mm_struct *mm = current->mm;
// 获取页全局目录项
pgd = pgd_offset(mm, vaddr);
if (pgd_none(*pgd) || pgd_bad(*pgd))
return 0;
p4d = p4d_offset(pgd, vaddr);
if (p4d_none(*p4d) || p4d