【发布时间】:2017-12-08 18:34:20
【问题描述】:
我想知道 Linux 内核上新连接的共享内存的“物理”地址。
据我所知,do_shmat() 返回共享内存的“虚拟”地址。 因此,我尝试使用 TLB 转换 do_shamt() 的返回值,方法是修改内核中的 shmat,如下所示。
SYSCALL_DEFINE3(shmat, int, shmid, char __user *, shmaddr, int, shmflg)
{
unsigned long ret;
unsigned long phys_ret;
unsigned int regVal;
long err;
pgd_t *pgd;
pud_t *pud;
pmd_t *pmd;
pte_t *pte;
err = do_shmat(shmid, shmaddr, shmflg, &ret, SHMLBA);
if (err)
return err;
force_successful_syscall_return();
pgd = pgd_offset(current->mm, ret);
pmd = pmd_offset(pgd, ret);
pte = pte_offset_kernel(pmd, ret);
printk("*pte = 0x%lx\n", *pte);
return (long)ret;
}
但是 pte 指向的地址为 0,所以我实际上无法获得物理地址。 为什么我的代码中没有正确的 pte?
【问题讨论】: