如何在C中的用户模式下检查页面权限?

时间:2019-05-12 12:43:04

标签: c linux qemu

我目前正在实施分布式系统及其分布式共享内存协议。如果我可以在用户模式下检查某个虚拟地址的页面权限(rwx,存储在pte中),可能会更容易。


我想做什么:

获取虚拟地址的pte。因此,我可以检查存储在其中的最后3位,分别代表PROT_READ / PROT_WRITE / PROT_NONE


我做什么:

  1. 试图使用pmd的自引用来获取pte。失败。
  2. 尝试其他方法。记录一切都是愚蠢的。我已经尝试过了,而且效果很好,但是现在我想对其进行改进。

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中。

提供了虚拟地址,请检查其页面的权限。在用户模式下。

谢谢。

0 个答案:

没有答案