gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:02:26 27 4
gpt4 key购买 nike

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

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

#include <linux/module.h>
#include <linux/mm.h>
#include <asm/tlbflush.h>
#include <asm/tlb.h>

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 <%s>\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");

最佳答案

Flushing the cache and TLB does not work.

实际上它可能有效,但 TLB 刷新的效果是不会出现页面错误。 TLB刷新后,目标进程的内存访问将导致TLB未命中和TLB重新填充。在最常见的 x86/x86_64 和更常见的 ARM 中,Memory management unit将在硬件中重新填充 TLB,无需来自操作系统的事件代码。在重新填充时,MMU 将加载页表并遍历它。在更奇特的 SPARC 或 MIPS 中,tlb 重新填充可以通过软件完成,但不能通过页面错误完成。

如果您想在访问某些内存区域时强制出现页面错误,您可以(从用户空间)使用 mprotect 系统调用( check its man ,只需在标志中设置不读取 (PROT_READ) 和写入 (PROT_WRITE) 访问。

如果你想从内核空间做同样的事情,你可以检查mprotect的实现:SYSCALL_DEFINE3(mprotect in mm/mprotect.c并做同样的事情...

 unsigned long vm_flags = calc_vm_prot_bits(..flags..); // set flags
down_write(&current->mm->mmap_sem); // lock mm
vma = find_vma(current->mm, ..address..); // find needed VMA
// check for errors...
vma->vm_flags = newflags;
vma->vm_page_prot = pgprot_modify(...) // update vm flags, or just call mprotect_fixup
up_write(&current->mm->mmap_sem); // unlock mm

^^^ 该代码未经测试,无效,任何人都不应使用。

关于linux - 刷新缓存和TLB不起作用: flush_cache_mm(mm)/flush_tlb_mm(mm),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22519999/

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