Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 虚拟内存区域结构是否只有在出现页面错误时才会出现?_C_Linux_Linux Kernel - Fatal编程技术网

C 虚拟内存区域结构是否只有在出现页面错误时才会出现?

C 虚拟内存区域结构是否只有在出现页面错误时才会出现?,c,linux,linux-kernel,C,Linux,Linux Kernel,虚拟内存对我来说是一个相当复杂的话题。我正在努力理解它。以下是我对32位系统的理解。示例RAM只有2GB。我试着阅读了很多链接,但目前我没有信心。我希望你们能帮助我澄清我的概念。请承认我的观点,也请回答你认为错误的地方。我的观点中也有一个混乱的部分。所以,这里开始总结 每个进程都认为它只是在运行。它可以访问4GB的内存虚拟地址空间 当进程访问虚拟地址时,它通过MMU转换为物理地址。 这个MMU是CPU硬件的一部分 当MMU无法将地址转换为物理地址时,会引发页面错误 在页面错误时,会通知内核。内核

虚拟内存对我来说是一个相当复杂的话题。我正在努力理解它。以下是我对32位系统的理解。示例RAM只有2GB。我试着阅读了很多链接,但目前我没有信心。我希望你们能帮助我澄清我的概念。请承认我的观点,也请回答你认为错误的地方。我的观点中也有一个混乱的部分。所以,这里开始总结

  • 每个进程都认为它只是在运行。它可以访问4GB的内存虚拟地址空间

  • 当进程访问虚拟地址时,它通过MMU转换为物理地址。 这个MMU是CPU硬件的一部分

  • 当MMU无法将地址转换为物理地址时,会引发页面错误

  • 在页面错误时,会通知内核。内核检查VM区域结构。如果它能找到它-可能在磁盘上。它将进行一些页进/页出操作。把这个内存放到RAM上

  • 现在MMU将再次尝试,这次将成功

  • 如果内核找不到地址,它将发出一个信号。例如,无效访问将引发SIGSEGV

  • 混乱的观点

  • 页表是否在内核中维护?此VM区域结构是否有页表

  • MMU如何在物理RAM中找不到地址。假设它被翻译成RAM中的某个错误地址。代码仍将执行,但它将是一个错误的地址。MMU如何确保读取正确的数据?它是否每次都参考内核VM区域

  • 是映射表-虚拟到物理在MMU中。我读过它,它是由一个单独的进程维护的。如果它在一个进程中,为什么我看不到它。 或者,如果是MMU,MMU是如何生成地址的-是段+12位移位->页帧号,然后加上偏移量(位-1到10)->给出了一个物理地址。 这是否意味着对于32位体系结构,在我的脑海中有了这个计算。我可以从虚拟地址确定物理地址

  • cat/proc/pid_值/映射。这显示了vmarea的当前映射。基本上,它读取Vmarea结构并打印它。这意味着这很重要。我无法把这件作品完整地描绘出来。执行程序时,不会生成vmarea结构。VMAREA是否仅在MMU无法翻译地址(即页面错误)时才会出现在图片中?当我打印vmarea时,它会显示地址范围、权限和映射到文件描述符的地址,以及偏移量。我确信这个文件描述符就是硬盘上的描述符,偏移量就是这个文件的

  • 高内存概念是内核不能直接访问大于1GB(约)的内存区域。因此,它需要一个页表来间接地映射它。因此,它将临时加载一些页表来映射地址。HIGH MEM每次都会出现在图片中吗。因为用户空间可以通过MMU直接转换地址。在什么情况下,内核真的想要访问高内存。我相信内核驱动程序将主要使用kmalloc。这是一个直接内存+偏移地址。在这种情况下,实际上不需要映射。因此,问题在于内核需要在什么情况下访问高内存

  • 处理器是否专门附带MMU支持。那些没有MMU支持的人不能运行LInux


  • 虽然这不是最好的答案,但我想分享一下我对困惑的观点的看法

    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。不过,我不能完全肯定

    由于所有这些都是概念性问题,我可能缺乏一些知识和经验