java刷新缓存flush_刷新缓存和TLB不起作用:flush_cache_mm(mm)/ flush_tlb_mm(mm)

本文探讨了一个内核模块尝试通过指定的PID刷新进程的TLB和缓存条目,但在实际操作中未能观察到预期效果的情况。作者修改了handle_mm_fault函数,并尝试在x86-64bit处理器上的Linux v3.11.6内核中查找和处理目标进程,但未成功触发页面错误。
摘要由CSDN通过智能技术生成

刷新缓存和TLB不起作用 . 以下内核模块接收pid并使用该id刷新进程的tlb / cache条目 .

我修改了Linux内核中的 handle_mm_fault() 函数,并在其中添加了一行打印出pid和导致页面的地址 if(current->pid == target_process) ....请参阅下面注释掉的行 . 但是,当我运行测试时,我看不到该进程导致的任何页面错误 . 我正在使用在x86-64bit处理器上运行的linux v3.11.6 .

#include

#include

#include

#include

static int pid = -1;

module_param(pid, int, 0444);

void do_init(void) {

struct task_struct *task;

struct vm_area_struct *next_vma;

struct mm_struct *mm;

if (pid == -1)

return;

task = pid_task(find_vpid(pid), PIDTYPE_PID);

//target_process = pid;

if (!task) {

printk("Could not find the task struct for process id %d\n", pid);

return;

} else {

printk("Found the task \n", task->comm);

}

mm = task->mm;

if (!mm) {

printk("Could not find the mmap struct for process id %d\n", pid);

return;

}

printk("****Start_brk = %lu\n", mm->start_brk);

down_read(&mm->mmap_sem);

next_vma = find_vma(mm, mm->start_brk);

flush_cache_mm(mm);

flush_tlb_mm(mm);

up_read(&mm->mmap_sem);

}

int init_module(void) {

printk("Inserting the module!!!\n");

do_init();

return 0;

}

void cleanup_module(void) {

printk("Module removed!!!\n");

}

MODULE_LICENSE("GPL");

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值