- 论坛徽章:
- 3
|
回复 1# wanyuan111
对于你之前说的通过pte entry来禁止cache, 我有一个想法 : 通过遍历映射了 进程地址空间的所有vma的虚拟页的pte,来去除相应的PCD, PWT bit.
需要在mm/memorc.c增加一个接口. 不过很多细节没考虑到, 只能是参考.
int walk_mm_cancel_cache(struct task_struct *task)
{
struct mm_struct *mm = task->mm;
struct vm_area_struct vma;
int ret;
spinlock_t *ptl;
pte_t *ptep;
unsigned long address;
if(!task || !mm)
return -EINVAL;
for( vma = mm->mmap ; vma ; vma = vma->next){
for( address = vma->vm_start; address < vma->vm_end; address += PAGE_SIZE){
ret = follow_pte(vma->vm_mm, address , &ptep, &ptel);/*find which pte maps this address*/
if(!ret){
*ptep = pte_val(*ptep) & ~PAGE_CACHE_MASK;
/* PAGE_CACHE_MASK:_PAGE_PCD|_PAGE_PWT */
}
}
}
return 0;
}
EXPORT_SYMBOL(walk_mm_cancel_cache);
其实仔细想想, 这种新增方法好有风险,, 还不如直接写CR0.CD bit来禁止整个RAM的cache. |
|