虚拟寻址系统

虚拟内存

概念上而言,虚拟内存被组织为一个由存放在磁盘上的 N 个连续的字节大小的单元组成的数组
也就是说,虚拟内存被组织为一个存放在磁盘上的数组


而这个磁盘上的数组的内容被缓存在物理内存中 (DRAM cache)
也就是说有一份拷贝在内存上,是磁盘和内存上双份
这些内存块(也就是上面的数组)被称为页 (每个页面的大小为 字节)

一个东西链接完了之后,会生成一个可执行目标文件,这个东西是会放在磁盘里面的,然后会有个加载操作
这个加载它并不是真的把这个文件从磁盘放到内存里面,它是将我们这个磁盘里面的生成的可执行目标文件映射到这个虚拟内存里面

cahe 和主存交换的单位是块,以前的块是 64B,现在的页是 4kb
要读一个数据,一个数据不在,我会把这个数据所在的一个页都拿过来,这个页和这个块是类似的,只不过这个页,会比块更大。这个块我给大家讲,我要记住它的一些数据,就是我们在嗯

虚拟内存的状态

状态有三种,

  • 未分配:可执行文件向虚拟内存映射的时候没有映射到这一部分
  • 未缓存:已经和可执行文件关联上了,但是还没有从磁盘放到物理内存里面
  • 已缓存:已经从磁盘缓存到物理内存中了

linux将虚拟内存组织成一些区域的集合

虚拟地址

虚拟地址空间: N = 2n 个虚拟地址的集合: {0, 1, 2, 3, …, N-1}
注意区分虚拟内存和虚拟地址之间的区别
一个 linux 进程的虚拟地址空间
从下往上看

内核态:上端的内核虚拟内存
用户态:进程虚拟内存
进程上下文切换时,内核代码段不保存

物理地址空间: M = 2m 个物理地址的集合: {0, 1, 2, 3, …, M-1}

主存中的每字节都有一个选自虚拟地址空间的虚拟地址和选自物理地址空间的物理地址

PA 的组成是 PPN 加上 PPO,其实这个长度也是什么的长度也是 CT、 CI、CO 的长度,回忆一下 cache 那里块那部分的知识

Link to original

与进程有关的数据机构

  • mm_struct
    • pgd:
      • 指向第一级页表(页全局目录)的基址
    • mmap:
      • 类似于链表的结构,它每个节点指向一个段,第一个段就要共享库,第二个段就叫数据相当于代码,然后在这个每个节点里面它会有一些东西,这个 end 就是它的结束的地方,start 和 end 的顺序,是顺着地址空间从下往上看
  • vm_prot:
    • 描述这个区域内所有页的读写许可权限
  • vm_flags
    • 描述这个区域内的页面是与其他进程共享的还是这个进程私有的