在虚拟内存概念中,每个进程都维护自己的页表。此页表将虚拟地址映射到内核虚拟地址。该内核虚拟地址将地址转换为物理RAM。我了解有一个内核虚拟地址-vm区域结构。该vm区域结构最终将此地址映射到物理地址。当我执行cat / proc // maps时-我看到了虚拟地址到物理地址的直接映射。因为它将地址映射到文件-使用inode。因此,它看起来是硬盘上的地址,文件描述符,主要编号。RAM上有一些地址。因此,我可以说看不到虚拟地址映射到内核虚拟地址的表。我想看那张桌子。我怎么看?它不应在内核空间中。因为当进程正在访问时,假设内存为0x1681010,则应将其转换为内核虚拟内存地址。最后,该地址应转换为物理内存地址。
不,Linux内核维护进程页面表(但不维护进程本身)。进程仅在其地址空间中看到虚拟内存。进程使用一些系统调用,例如mmap(2)或execve(2)来更改其地址空间。
物理地址和页表以及处理和管理MMU是内核的职责,它实际上为用户应用程序提供了一些“抽象机”(具有虚拟地址空间,作为基本操作的syscall等)。应用程序看不到原始(x86)硬件,而只能看到内核给定的用户模式。某些硬件资源和说明不可用(它们仅在用户空间中运行)。
页表由内核管理,实际上,各种进程可能使用不同的页表,有时甚至使用相同的页表。(因此,由内核管理的上下文切换可能需要重新配置MMU)。您不在乎,(并且用户进程看不到页表)内核将管理它们。
而且,/proc/self/maps
不显示任何有关物理地址的信息,仅显示有关虚拟地址的信息。允许内核随时将进程从一个核心移动到另一个核心,将页面从一个物理(非虚拟)地址移动到另一个,等等。和应用程序通常看不到这一点(它们可能会使用mincore(2),getcpu(2)和proc(5)进行查询...)
应用程序不应该关心诸如页面错误之类的物理内存或中断(仅内核关心这些;有时是通过发送信号)。
虚拟地址到物理地址的转换发生在MMU中。通常,它是成功的(也许透明地访问页表),并且处理器在总线上将转换后的物理地址(对应于由用户模式机器指令处理的某个虚拟地址)发送到RAM。当MMU无法处理时,将发生页面错误,由内核处理(可以交换某些页面,发送SIGSEGV
,进行上下文切换等)。
另请参阅处理器体系结构,指令集,页表,分页,转换后备缓冲区,缓存,x86和x86-64 wiki页面(并遵循我给您的所有链接)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句