0
我想知道Linux內核上新連接的共享內存的「物理」地址。有什麼辦法可以知道連接的共享內存的物理地址?
據我所知,do_shmat()返回共享內存的「虛擬」地址。 所以我試圖通過修改內核中的shmat來使用TLB來轉換do_shamt()的返回值,如下所示。
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?