我目前正在实施分布式系统及其分布式共享内存协议。如果我可以在用户模式下检查某个虚拟地址的页面权限(rwx,存储在pte中),可能会更容易。
我想做什么:
获取虚拟地址的pte。因此,我可以检查存储在其中的最后3位,分别代表PROT_READ
/ PROT_WRITE
/ PROT_NONE
。
我做什么:
qemu中没有这样的宏
407 pgd_t *pgd;
408 pmd_t *pmd;
409 pte_t *ptep, pte;
410
411 pgd = pgd_offset(mm, address);
412 if (pgd_none(*pgd) || pgd_bad(*pgd))
413 goto out;
414
415 pmd = pmd_offset(pgd, address);
416 if (pmd_none(*pmd) || pmd_bad(*pmd))
417 goto out;
418
419 ptep = pte_offset(pmd, address);
420 if (!ptep)
421 goto out;
422
423 pte = *ptep;
所以上面的代码对我不起作用,更不用说它以内核模式运行了。
在pgd中应该有一个自引用的pmd,但我认为我发现了错误的提示。
// I found it in qemu/roms/qemu-palcode/init.c
#define PAGE_SHIFT 13
#define VPTPTR 0xfffffffe00000000UL
static inline unsigned long
pt_index(unsigned long addr, int level)
{
return (addr >> (PAGE_SHIFT + (10 * level))) & 0x3ff;
}
...
static void
init_page_table(void)
{
/* Install the self-reference for the virtual page table base register. */
page_dir[pt_index(VPTPTR, 2)] = build_pte(page_dir);
...
我不明白为什么VPTPTR设置为这样的值以及如何使用它?
// fill the 4th page index(47-39) with 1
unsigned long pgd_index = 0b0000000000000000111111111000000000000000000000000000000000000000;
unsigned long pg_addr_pte = host_addr |= pgd_index;
但是它不起作用,它的地址无效。
这等同于“获取linux中页面的物理地址”,因为物理地址和页面权限都存储在pte中。
提供了虚拟地址,请检查其页面的权限。在用户模式下。
谢谢。