X86 pte修改是否像通常的内存访问一样通过相同的页表?

X86 pte修改是否像通常的内存访问一样通过相同的页表?,x86,operating-system,osdev,X86,Operating System,Osdev,我知道通常的内存访问会通过页表进行虚拟地址到物理地址的转换。但是pte呢?假设操作系统想要修改进程的页表条目,它是否也会遍历进程的页表?换句话说,页面表中是否有指向自身的条目?没错。通常会有一个PTE指向页面目录本身的物理地址,以使其可以从虚拟地址空间访问。这在很大程度上取决于CPU/MMU/硬件 在x86上,PTE通常在已启用页转换时进行修改(不要将其与页表的初始设置混淆,这可以在启用页转换之前完成),因此内存访问必须涉及虚拟到物理地址转换 当然,您可以关闭页面翻译。或者,您可以使用DMA或其

我知道通常的内存访问会通过页表进行虚拟地址到物理地址的转换。但是pte呢?假设操作系统想要修改进程的页表条目,它是否也会遍历进程的页表?换句话说,页面表中是否有指向自身的条目?

没错。通常会有一个PTE指向页面目录本身的物理地址,以使其可以从虚拟地址空间访问。

这在很大程度上取决于CPU/MMU/硬件

在x86上,PTE通常在已启用页转换时进行修改(不要将其与页表的初始设置混淆,这可以在启用页转换之前完成),因此内存访问必须涉及虚拟到物理地址转换

当然,您可以关闭页面翻译。或者,您可以使用DMA或其他电路(或CPU)从CPU外部更改内存内容。但这很不寻常

虽然我不知道有多少不同的CPU,但很可能其中一些CPU有特殊的功能,在访问PTE时直接操纵PTE,而不进行地址转换


在x86上,设置页面目录(最上面的页面表)的方式也很常见,即其中一个条目指向页面目录。这允许您访问虚拟地址子范围中的所有PDE和PTE。

我现在将重点介绍x86。我想知道的是,当操作系统修改一个进程“pte”时,它会通过该进程的页表吗?我从#osdev那里得到了答案,他们说操作系统不会遍历进程的页表,而是将进程的页表映射到内核空间的某个地方,修改操作将遍历操作系统的页表。也就是说,通常的内存访问和pte修改将通过两个不同的页表。对吗?不需要额外的映射。如果它是当前进程(意味着CR3指向它的所有页面表),您可以使用我在答案末尾概述的技巧。无论采用哪种方式,如果页面转换保持启用状态,它将影响所有内存访问。您的意思是,如果操作系统想要修改正在运行的进程的pte,它只使用CR3指向的内容(即进程的页面表),并且在此处进行修改,而不使用额外的页面表?既然你说“如果是当前进程…”,我猜当操作系统想要修改一个未运行(即关闭)进程的pte时,操作系统仍然需要在内核空间映射进程的页表,正如我前面所说的那样?不确定你说的“这里没有额外的页表”是什么意思,但是,如果内核所处的进程上下文与它要修改其PTE的进程上下文不同,那么,是的,它必须创建一个临时映射来修改这些PTE,或者需要临时切换到该进程(到其地址空间IOW,加载其CR3)。“此处没有额外的页表”表示只使用了进程的页表。:)对于那个投了一票的人——这怎么会是离题的?有许多关于51区的OSDev.SE的提案,没有一个被接受,因为SE工作人员的官方声明说“他们已经在SO上被涵盖了”——那么,这又是怎么回事?