什么是x86 cr0 WP位的目的?

dae*_*hee 11 x86 intel

在x86 CPU中,控制寄存器编号为0.该寄存器的第16位表示"写保护"设置.如果该位清零,CPU可以覆盖只读数据.(在页表条目中配置)在内存中.如果该位置1,CPU不能覆盖内存中的RO数据.

我很好奇的是"这个位的最初目的是什么?" "为什么x86 CPU需要这个?"

use*_*653 15

引自英特尔®64和IA-32架构软件开发人员手册第3A卷第1页.2-15(强调我的):

WP写保护(CR0的第16位) - 置位时,禁止管理员级程序写入只读页面; 清零时,允许管理程序级程序写入只读页面(无论U/S位设置如何;请参见第4.1.3节和第4.6节).此标志有助于实现创建由UNIX等操作系统使用的新进程(分叉)的写时复制方法.

更新:在fork()上查看维基百科:

每当进程(父进程或子进程)修改页面时,就会对执行修改的进程(父进程或子进程)单独创建该特定页面的单独副本.

这是写入时复制的核心,但是当内核完成修改时会出现问题(例如当系统调用发生写入时 - 想想read()).

4.1.3开始:

CR0.WP允许保护页面免受管理程序模式写入的影响.如果CR0.WP = 0,则允许管理员模式写访问到具有只读访问权限的线性地址; 如果CR0.WP = 1,则不是.(无论CR0.WP的值如何,用户模式写访问都不允许使用具有只读访问权限的线性地址.)

通过设置CR0.WP = 1内核将在修改只读用户页面时通知(带有页面错误),并且可以在继续页面修改之前执行写入时复制操作.

  • @daehee:我已经更新了答案。关键是没有“ CR0.WP”内核就无法知道是否需要修改需要复制的“用户”页面。 (2认同)