• ⁶₆⁶₆⁶₆
    2022-02-27
    为保证空指针可以触发访问缺失页的异常SIGSEGV,空出位于虚拟地址空间的最低部分,空出的虚拟地址部分不访问,就可以省下一个页大小的空间,原本空出的空间为4KB(0x0~0x1000)即可,考虑到大页机制时最小页为4MB,因此就空出4MB的空间(0x0~0x00400000),所以VAS的真实使用地址从0x400000开始

    作者回复: 回答的很赞!

    共 3 条评论
    7
  • ZR2021
    2022-02-26
    老师,TLB中缓存的是几级页表?如果是一级的话,那对应的二级页表是不是就要到物理内存里查的?这样的话,如果是4级页表,即使第一级被TLB命中,其他3级也得到物理内存里找,好像TLB也没带来多大的性能提升……希望老师指点下,这块我一直有点不清楚

    作者回复: TLB 缓存的直接是物理页号,也就是经过所有页表查询后得到的结果。这个结果再配合虚拟地址中的页偏移信息,就可以的到目标数据的物理地址。

    共 2 条评论
    3
  • brian
    2023-04-26 来自中国香港
    这部分内容其实是os的设计,不是c特有的,所有语言的进程都是这样使用内存的,这样理解没错吧

    作者回复: 是的

    
    
  • 猪小擎
    2022-06-23
    这一讲好难,知识的原文从哪本书里能看到

    作者回复: 这块内容也可以参考 CSAPP 等书籍哈。

    共 2 条评论
    
  • 青鸟飞鱼
    2022-05-18
    虚拟地址与物理地址根据页表映射起来的,虚拟地址空间是存在哪里的呢,二进制可执行文件吗?是磁盘里吗?根据用到时一点点加载到内存里吗?那申请内存时(brk和mmap),会跳转到内核里,不分配物理内存,分配后的地址要写到可执行的二进制文件里吗?

    作者回复: 是的,VAS 实际上是就是由页表维护的一个“虚拟”的地址空间。页表的数据本身会被存放在磁盘上,随着页面的查询而不断从磁盘载入到内存中。申请内存时通常会让虚拟内存区域映射到“匿名文件”这种类型的对象上,同时更新页表标记某几个页是驻留在内存中的,从而不会产生磁盘与内存之间的实际数据交换过程。

    
    
  • 奇得隆冬强
    2022-05-08
    假设在一个 32 位地址空间中,页大小为 4KiB,每个 PTE 大小为 4 字节。此时,MMU 在进行物理地址查询时,首先会根据虚拟地址中隐含的虚拟页号信息来查找一级页表内的目标 PTE,而一级页表中的每个 PTE,此时实际上负责映射 VAS 中的一个 4MiB 的片。 这个 4MiB 是怎么算出来的呢?

    作者回复: 这是个好问题,实际上这里我们有一个隐含条件就是页表的大小为 4KiB,PTE 大小为 4 字节,即拥有 1024 个表项。这样每个 PTE 就负责映射 2^32 / 1024,即 4MiB 的大小。我来修改一下文章。

    
    
  • 奇得隆冬强
    2022-05-08
    则地址字段中存放有该页在物理内存中的起始位置。而在该位复位的情况下,若地址字段为空,则表明该虚拟页还未被分配。否则,地址字段中便保存有 “虚拟页内容在磁盘上的起始位置。” 这个 虚拟页内容 不是程序的数据吧,是指虚拟页自身的一些结构数据??

    作者回复: 这里的“虚拟页内容”指的是虚拟页中存放的数据内容,实际上就是程序使用到的数据。当然,与页表自身相关的数据结构,也是被维护在内存中的,这部分属于操作系统内核数据。

    
    
  • Simon
    2022-02-24
    64位系统的地址空间只有 2^48,高十六位都是0,共256T。

    作者回复: 没错,对于大多数体系比如 x86-64 和 ARMv8 来说是这样的,但也有支持完整 64 位虚拟地址的体系,比如 Oracle SPARC 的某些型号。

    共 3 条评论
    
  • 功夫熊猫
    2022-06-30
    页面置换,请求调页
    
    1
  • LDxy
    2022-02-23
    位于虚拟地址空间的最低部分,未赋予物理地址。任何对它的引用都是非法的,用于捕捉使用空指针和小整型值指针引用内存的异常情况。
    
    1