Linux 修改内存后禁用对ext4的写入

Linux 修改内存后禁用对ext4的写入,linux,linux-kernel,Linux,Linux Kernel,我试图在运行时从Linux内核驱动程序修改用户空间应用程序代码 给定以下代码段: writeCR3(process_cr3); writeCR0(cr0 & ~X86_CR0_WP); // to allow writing to RO pages *(char*)someUserAddress = 0x90; // just an example, nop writeCR0(cr0 | X86_CR0_WP); // restore write protection 它在运行时成功地

我试图在运行时从Linux内核驱动程序修改用户空间应用程序代码

给定以下代码段:

writeCR3(process_cr3);
writeCR0(cr0 & ~X86_CR0_WP); // to allow writing to RO pages
*(char*)someUserAddress = 0x90; // just an example, nop
writeCR0(cr0 | X86_CR0_WP); // restore write protection
它在运行时成功地修改了用户应用程序代码,但由于某种原因,它自身的文件也发生了更改(如果我在写入修改后的可执行文件上使用'OBJDUMP'或'READELF',我实际上可以看到它已被修改)-它似乎也正在写入ext4文件系统

我不想那样。我希望代码只能在内存中修改。
我如何做到这一点?为什么文件系统实际上也会自己修改文件?

这是因为页面与二进制图像相关,因此被认为是“页面缓存”。写入地址时,处理器在条目上设置“脏”位,而vmscan(?)在页面结构中设置相应的脏位。所有脏的“页面缓存”页面都会写回磁盘。我看不到干净的解决办法。也许,您可以通过设置PG_swapbacked标志将页面永久标记为未缓存,但其后果是不可预测的。是否有任何硬件机制可以实现这一点?为什么您首先要尝试从内核修改用户空间代码?听起来像是一场灾难。