C 虚拟内存区域结构是否只有在出现页面错误时才会出现?
虚拟内存对我来说是一个相当复杂的话题。我正在努力理解它。以下是我对32位系统的理解。示例RAM只有2GB。我试着阅读了很多链接,但目前我没有信心。我希望你们能帮助我澄清我的概念。请承认我的观点,也请回答你认为错误的地方。我的观点中也有一个混乱的部分。所以,这里开始总结C 虚拟内存区域结构是否只有在出现页面错误时才会出现?,c,linux,linux-kernel,C,Linux,Linux Kernel,虚拟内存对我来说是一个相当复杂的话题。我正在努力理解它。以下是我对32位系统的理解。示例RAM只有2GB。我试着阅读了很多链接,但目前我没有信心。我希望你们能帮助我澄清我的概念。请承认我的观点,也请回答你认为错误的地方。我的观点中也有一个混乱的部分。所以,这里开始总结 每个进程都认为它只是在运行。它可以访问4GB的内存虚拟地址空间 当进程访问虚拟地址时,它通过MMU转换为物理地址。 这个MMU是CPU硬件的一部分 当MMU无法将地址转换为物理地址时,会引发页面错误 在页面错误时,会通知内核。内核
虽然这不是最好的答案,但我想分享一下我对困惑的观点的看法
1.
是否维护页表
对。内核维护页面表。实际上,它维护嵌套的页表。页面表的顶部存储在top_pmd中。我想它是页面映射目录。可以使用此结构遍历所有页面表
2.
MMU如何在物理RAM中找不到地址
我不确定我是否理解这个问题。但如果由于某些问题,指令出现故障或正在访问超出其指令区域的指令,通常会出现未定义的指令异常,从而导致未定义的异常中止。如果查看崩溃转储,可以在内核日志中看到它
3.
是映射表-虚拟到物理在MMU中
对。MMU为SW+HW。HW就像TLB一样。映射表存储在这里。对于指令,也就是代码部分,我总是转换物理虚拟地址,并且它们总是匹配的。而且几乎所有的时间它都匹配数据部分
4.
cat/proc/pid\u值/map。这显示了vmarea的当前映射
这更多地用于分析用户空间堆栈的虚拟地址。正如您所知,几乎所有的用户空间程序都可以有4GB的虚拟地址。所以,如果我说0xc0100234,它与内核不同。你不能直接指向指令。因此,您需要这个映射和虚拟地址来根据您拥有的数据指向指令
5.
高内存概念是内核不能直接访问内存
高内存对应于用户空间内存(如果我错了,有人会纠正我)。当内核想要从用户空间的地址读取一些数据时,您将访问HIGHMEM
6.
处理器是否专门提供MMU支持。那些没有MMU支持的人不能运行LInux
我提到的MMU是硬件+软件。因此,大部分情况下,它将与芯片组一起出现。软件通常依赖于体系结构。您可以从内核配置和构建中禁用MMU。但我从未试过。现在大多数芯片组都有它。但我认为小型电路板会禁用MMU。不过,我不能完全肯定
由于所有这些都是概念性问题,我可能缺乏一些知识和经验