【发布时间】:2015-06-18 20:24:17
【问题描述】:
是否可以将 PTE 指向不同的物理页面?
假设我当前处于某个进程 A 的上下文中的内核模式,该进程 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);
【问题讨论】:
-
拜托,具体一点,“没有运气”是什么意思,你到底试过什么(给个代码sn-p)
-
添加了一些代码 ;) 谢谢。
-
如何测试这段代码?您的期望是什么?
-
我只是打印更改前后的页面内容。它确实改变了。但不是我所期望的 :( 编辑:我的意思是我在更改后打印虚拟地址指向的内容
-
请给出测试change_pte的代码
标签: linux-kernel paging tlb