首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

CSAPP复习之虚拟内存 更新

CSAPP复习之虚拟内存 更新

虚拟内存作为内存管理的工具

    每个进程有独立的虚拟地址空间
        每个进程有独立的页表

    VM简化链接
        每个程序都有相似的虚拟地址空间
        代码段、数据段、堆都从同样的地址开始

    VM简化加载
        为代码段和数据段分配虚拟页,把他们标记为未被缓存的

    VM简化内存分配
        程序要求额外的堆空间时
            操作系统分配k个连续的虚拟内存页面并将它们映射到k个任意位置的物理页面
            物理页面不需要连续

虚拟内存作为内存保护的工具

    在PTE上添加一些额外的许可位来控制对一个虚拟页面内容的访问

地址翻译

    N M P

    n位的虚拟地址包括
        p位的虚拟页面偏移 VPO
        n-p位的虚拟页号 VPN

    利用VPN选择适当的PTE
        例如 VPN0选择PTE0,VPN1选择PTE1

    将页表条目中的物理页号和虚拟地址中的VPO串联起来就得到了物理地址

    由于PP和VP都是P字节所以PPO和VPO相同

    页面命中
        CPU把虚拟地址发给MMU
        MMU通过虚拟地址生成PTE地址并请求
        缓存/内存返回PTE
        MMU构造物理地址,并把它返回给缓存/内存
        缓存/内存将数据返回给CPU

    缺页
        1-3步和命中一样
        有效位为0,触发缺页异常
        确定牺牲页,如果牺牲页在之前的操作中被修改过,则把它换出到磁盘
        调入新的页面,更新PTE
        返回到原来的进程,再次执行导致缺页的指令

    利用TLB加速地址翻译

        TLB是一个小的、虚拟寻址的缓存
            每一行都保存着一个由单个PTE组成的块

        匹配TLB的索引和标记来自VPN
            如果TLB有T=2t个组,则TLB索引(TLBI)是由VPN的t个最低位组成的
            TLB标记(TLBT)是由VPN剩余的位构成

        TLB命中
            CPU产生虚拟地址
            MMU从TLB取出对应PTE
            根据PTE翻译出物理地址,发送给缓存/内存
            缓存/内存将数据返回给CPU

        TLB不命中
            需从缓存中取出相应的PTE放在TLB中
            很少见

    多级页面

        用单级页表会让页表的大小变得非常大

        二级页表
            一级页表中的每个PTE负责映射虚拟地址空间中一个4MB的片
                每一个片由1024个连续的页面组成
                如果1024个页面均未分配则一级PTE i为空
                若至少有一个页分配了,则一级PTE i指向一个二级页表的基地址
            二级页表每个PTE负责映射一个4KB的虚拟内存页面

        k级页表地址翻译
            虚拟地址被划分成k个VPN和一个VPO
            每个VPN i是一个到第i级页表的索引
            前k-1个页表,每个PTE都指向下一级的某个页表的基地址
            第k级页表中每个PTE包含某个物理页面的PPN
返回列表