如何在LINUX中获取进程中某个虚拟地址所在物理内存地址

    xiaoxiao2025-01-26  1

    /* *伪代码,示例 *32位地址,三级映射(没有pud_t),页面大小4KB */ unsigned long addr = 0x12345678;//要找的虚拟地址,用户空间所访问的地址 unsigned long real_addr = 0x00;//要输出的地址 struct task_struct *cur_task = get_current();//获取当前进程控制块 struct mm_struct *mm = cur_task ->  mm;//进程虚拟空间 pgd_t *pgd;//描述页全局目录项 pmd_t *pmd;//描述页中间项 pte_t *pte;//页表项 pgd = pgd_offset(mm, addr);//找出所在目录 if (pgd_none(*pgd)){         goto out; } pmd = pmd_offset(pgd, addr);//找出所在中间项 if (pmd_none(*pmd)){     goto out; } pte = pte_offset(pmd, addr);//找出所在页面 if (pte_none(*pte)) {     goto out; } //假设每页4KB real_addr = addr & 0x00003fff; //取出页面偏移量 real_addr += pte;//内核空间访问的地址 real_addr -= PAGE_OFFSET;//真正物理地址() printk("物理地址是 %x\n",real_addr); return; out: printk("没有内存映射",real_addr);
    转载请注明原文地址: https://ju.6miu.com/read-1295801.html
    最新回复(0)