c – 如何查看虚拟内存中每个进程维护的页表 – Linux?

在虚拟内存概念中 – 每个进程都维护自己的页表.此页表将虚拟地址映射到内核虚拟地址.此内核虚拟地址将地址转换为物理RAM.我知道有一个Kernel Virtual adddres – vm area struct.此vm区域结构最终将此地址映射到物理地址.
当我做cat / proc // maps时 – 我看到了虚拟地址到物理地址的直接映射.因为它将地址映射到文件 – 使用inode.因此,它看起来它是硬盘上的地址,文件描述符,主要次要编号. RAM上有一些地址.所以,我可以说我看不到虚拟地址映射到内核虚拟地址的表.我想看看那张桌子.我怎么能看到这个?它不应该在内核空间中.因为进程正在访问时让我们说内存 – 0x1681010然后这应该被转换为内核虚拟内存地址.最后,该地址应转换为物理内存地址.
最佳答案
不,Linux kernel维护进程页表(但不保留进程本身). Processes仅通过他们的address space看到virtual memory.进程使用一些syscalls,例如syscalls. mmap(2)execve(2),改变他们的地址空间.

物理地址和页表以及处理和管理MMU是内核的业务,它实际上为用户应用程序提供了一些“abstract machine”(带有虚拟地址空间,系统调用作为原子基本操作等等).应用程序看不到原始(x86)硬件,而只看到内核给出的user mode.某些硬件资源和指令不可用(它们仅在user space中运行).

页表由内核管理,实际上各种进程可能使用不同的或有时相同的页表. (因此,由kernl管理的context switches可能需要重新配置MMU).您不关心(并且用户进程看不到页表)内核将管理它们.

不,/ proc / self / maps没有显示任何关于物理地址的信息,只显示虚拟地址.允许内核将进程从一个核心移动到另一个核心,以便随时将页面从一个物理(非虚拟)地址移动到另一个,等等.和应用程序通常不会看到这个(他们可能会查询mincore(2),getcpu(2)proc(5) …)

应用程序不应该关心物理内存或interrupts,如page faults(只有内核关心这些;有时通过发送信号).

虚拟到物理地址转换发生在MMU中.通常,它是成功的(可能透明地访问页表),并且处理器在总线上向RAM发送转换的物理地址(对应于由用户模式机器指令处理的某个虚拟地址).当MMU无法处理它时,会发生页面错误,由内核处理(可以交换某些页面,发送SIGSEGV,执行上下文切换等等)

另请参阅processor architecture,instruction set,page table,paging,translation lookaside buffer,cache,x86x86-64 wikipages(并按照我给你的所有链接).

转载注明原文:c – 如何查看虚拟内存中每个进程维护的页表 – Linux? - 代码日志