Linux kernel 如何在分页操作中将虚拟地址映射到交换分区上的地址

Linux kernel 如何在分页操作中将虚拟地址映射到交换分区上的地址,linux-kernel,operating-system,virtual-memory,Linux Kernel,Operating System,Virtual Memory,我想知道是否有人能帮助我理解虚拟地址是如何映射到它的一个地址的——备份存储,它用于保存所有用户进程的移出页面 它是静态映射还是哈希算法?如果是静态的,那么这种映射保存在哪里?它似乎不能位于TLB或page表中,因为根据,当页面移出时,PTE将同时从TLB和page表中删除。对算法的描述和包含这些信息的C结构将很有帮助 无论是静态映射还是哈希算法,由于每个进程的虚拟地址空间太大(2^64),而交换空间太小,如何保证2号进程将其地址映射到交换分区上的相同位置 因此: 在pagein期间,操作系统如何

我想知道是否有人能帮助我理解虚拟地址是如何映射到它的一个地址的——备份存储,它用于保存所有用户进程的移出页面

它是静态映射还是哈希算法?如果是静态的,那么这种映射保存在哪里?它似乎不能位于TLB或page表中,因为根据,当页面移出时,PTE将同时从TLB和page表中删除。对算法的描述和包含这些信息的C结构将很有帮助

无论是静态映射还是哈希算法,由于每个进程的虚拟地址空间太大(2^64),而交换空间太小,如何保证2号进程将其地址映射到交换分区上的相同位置

因此:

在pagein期间,操作系统如何知道在交换分区上的何处找到要移入的地址(对应于用户进程访问的虚拟地址)


当物理页面需要调出时,操作系统如何知道在交换分区上的位置?

对于问题的第一部分:它实际上依赖于硬件,但一般的方法是保留对包含调出页面的交换块的引用(根据交换子系统的实现,它可以是指针、块号或表中的偏移量)在其相应的页表条目中。

编辑:
TLB是一种快速关联缓存,有助于快速进行虚拟到物理页面的映射。当一个页面被调出时,它在TLB中的条目可以被一个新的活动页面替换。但是页面表中的条目不能被替换,因为页面表不是关联内存。页面表仍然是PERI在整个过程中都在内存中,无法删除或替换任何条目(由另一个虚拟页)。只能映射或取消映射页表中的条目。当它们被取消映射时(由于交换或释放),条目的内容可能包含对交换块的引用,也可能只是一个无效值。

对于问题的第二部分:系统内核在交换分区中维护一个空闲块列表。每当它需要退出RAM页时,它分配一个空闲块,然后返回块引用,以便将其插入PTE。当该页返回到RAM时,磁盘块被释放,以便其他人可以使用r页

在page in期间,操作系统如何知道在交换设备上的何处找到要移入的页面(对应于用户进程访问的虚拟地址)

这实际上可能是一个相当复杂的进程。操作系统必须维护一个进程页面映射到的位置表。这可能很复杂,因为页面可以映射到多个设备,甚至同一设备上的多个文件。一些系统使用可执行文件进行分页

当物理页需要调出时,在TLB中查找物理页的虚拟地址后,操作系统如何知道将交换设备放在何处


在设计合理的操作系统上,当虚拟页映射到进程时,会分配(或确定)辅助存储。在程序运行期间,该位置保持不变。

关于我的第一个问题,我想看一个将虚拟页映射到交换分区上位置的示例(为了简化,不是文件)。根据您对我第一个问题的回答,虚拟页面交换部分的位置保持不变,然后我的两个问题成为一个。我想了解交换页面是如何计算的。包含此类信息或wikipage链接的C结构将很有帮助。关于您对我第一个问题的回答,我学到了什么内德()换出页面后,PTE将从页面表&TLB中删除。关于我的第二个问题:由于交换分区是所有用户进程的后备存储,因此要移出的RAM页面的交换位置应该根据RAM页面当前映射到的虚拟地址计算,而不是直接映射RAM页到交换页。TLB是可以找到RAM页虚拟地址的地方。我对我的答案做了一些更改。请查看!@AlexL