- 论坛徽章:
- 9
|
回复 10# gong_yue
内核没有直接把内核所在内存更改为只读的函数,但可以同通过set_pte来更改对应的页表项来实现。前提必须找到对应的页表项,可以通过pxx_offeset来实现,如果你是X86的,那就方便一点,有人给你写好了--lookup_address。
整个过程,其实和kmemcheck相做的类似。可以参考一下它的实现:- void kmemcheck_hide_pages(struct page *p, unsigned int n)
- {
- unsigned int i;
- for (i = 0; i < n; ++i) {
- unsigned long address;
- pte_t *pte;
- unsigned int level;
- address = (unsigned long) page_address(&p[i]);
- pte = lookup_address(address, &level);
- BUG_ON(!pte);
- BUG_ON(level != PG_LEVEL_4K);
- set_pte(pte, __pte(pte_val(*pte) & ~_PAGE_PRESENT));
- set_pte(pte, __pte(pte_val(*pte) | _PAGE_HIDDEN));
- __flush_tlb_one(address);
- }
- }
复制代码 对你这个需求,你要去掉的是_PAGE_RW,而不是_PAGE_PRESENT。
还是比较简单的。
但的两点要注意。
1. 你的数组必须页对齐
2. 要搞清楚你的内核是采用大页还是小页。
|
|