gpt4 book ai didi

linux-kernel - 设置 PTE 以指向不同的物理页面 - Linux Kernel

转载 作者:行者123 更新时间:2023-12-04 04:02:20 38 4
gpt4 key购买 nike

是否可以将 PTE 指向不同的物理页面?

假设我目前在某个进程 A 的上下文中处于内核模式,该进程当前将地址 400k 映射到物理页号。 5.
我可以将该地址 (400k) 映射到物理页号吗? 6 ? (例如)
如果是这样,如何?

我尝试使用这个 API:

set_pte / clear_pte / mk_pte / pfn_to_page

但到目前为止还没有运气。

编辑:

一些代码:

static pte_t *walk_page_table(struct mm_struct *mm, size_t addr)
{
pgd_t *pgd;
pud_t *pud;
pmd_t *pmd;
pte_t *ptep;
spinlock_t *ptl;
struct vm_area_struct* vma = mm->mmap;

pgd = pgd_offset(mm, addr);
if (pgd_none(*pgd) || unlikely(pgd_bad(*pgd)))
return NULL;

pud = pud_offset(pgd, addr);
if (pud_none(*pud) || unlikely(pud_bad(*pud)))
return NULL;

pmd = pmd_offset(pud, addr);
if (pmd_none(*pmd))
return NULL;

ptep = pte_offset_map(pmd, addr);

return ptep;
}

bool change_pte(size_t address, size_t new_page_phys_address)
{
pte_t *p = walk_page_table(current->mm, address);
pte_t new_pte;

if (!p)
return false;

new_pte = pfn_pte(new_page_phys_address >> PAGE_SHIFT,
PAGE_KERNEL_EXEC);
set_pte(p, new_pte);
__flush_tlb_one(address);

return true;
}

一些测试代码:
  struct pt_regs* regs = task_pt_regs(current);
hexDump("someData", regs->ip, some_size);
void * newPage = kmalloc(PAGE_SIZE,GFP_KERNEL);
memset(newPage,0,PAGE_SIZE);
change_pte(regs->ip, virtual_to_physical(newPage));
hexDump("post someData", regs->ip, some_size);

最佳答案

让我和你分享一个建议。似乎没有证据表明kmalloc将返回页面对齐地址(我不确定,但您可以检查它)。让我做一个例子:

   page1  page2      remapped uspace page
| 000|000 | | 000|
| 000|000 | | 000|
^ ^
| |
newPage reg->ip

尝试使用 get_free_page 而不是 kmalloc。如果这没有帮助,我将尝试重复您的实验。

关于linux-kernel - 设置 PTE 以指向不同的物理页面 - Linux Kernel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29606794/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com