分页机制虽然很灵活,但您也看到了,为了实现虚拟地址到物理地址的映射,过程还是有些麻烦的。先要从CR3寄存器中获取页目录表物理地址,然后用虚拟地址的高10位乘以4的积做为在页目录表中的偏移量去寻址目录项pde,从pde中读出页表物理地址,然后再用虚拟地址的中间10位乘以4的积做为在该页表中的偏移量去寻址页表项pte,从该pte中读出页框物理地址,用虚拟地址的低12位做为该物理页框的偏移量,呼…终于完成虚拟地址到物理地址的映射。

每一个虚拟地址到物理地址的转换都要重复以上过程,甭说真正去做了,光描述这个过程我都觉得繁琐,何况这只是用二级页表做地址映射的过程,要是用三级页表…我都替处理器喊累。不止如此,处理器的速度和内存的速度完全是两个数量级,页表毕竟在内存中,转换过程中频繁的内存访问,使得地址转换速度慢上加慢,而处理器也不得不停下来等待内存的响应。

虚拟地址到物理地址的转换,最终是想得到虚拟地址所对应的物理地址,如果给出一个虚拟地址后能直接得到相应的页框物理地址,免去中间的查表过程,直接用虚拟地址的低12位在该物理页框中寻址,岂不是大大提高了地址转换速度。根据程序的局部性原理,可以将近来常用的地址和指令加载到速度更快的设备中,因此我们都想到了缓存。处理器准备了一个高速缓存,可以匹配高速的处理器速率和低速的内存访问速度,它专门用来存放虚拟地址页框与物理地址页框的映射关系,这个调整缓存就是TLB,即Translation Lookaside Buffer,俗称快表,其结构如图

TLB中的条目是虚拟地址的高20位到物理地址高20位的映射结果,实际上就是从虚拟页框到物理页框的映射。除此之外TLB中还有一些属性位,比如页表项的RW属性。

有了TLB,处理器在寻址之前会用虚拟地址的高20位做为索引来查找TLB中的相关条目,如果命中(匹配到相关条目)则返回虚拟地址所映射的物理页框地址,否则会查询内存中的页表,获得页框物理地址后再更新TLB。

高速缓存由于成本等原因,容量一般都很小,TLB也是,因此TLB中的数据只是当前任务的部分页表,而且只有P位为1的页表项才有资格在TLB中,如果TLB被装满了,需要将很少使用的条目换出。

缓存相当于数据源的快照,为了保证缓存与数据源同步变化,这就涉及到缓存刷新的问题。TLB也是缓存,当内存中的原页表被修改时,TLB中的相应映射关系按理说也要更新。一般的缓存可以定期刷新,甚至推迟几分钟都可以,但TLB和一般的缓存可不一样,您想,TLB是页表的缓存,处理器寻址时最先访问的是TLB,TLB里面存储的是程序运行所依赖的指令和数据的内存地址,任意时刻都必须保证地址的有效性,否则程序必然出错,所以TLB必须实时更新。可是如果实时读取内存中的页表去更新TLB的话,这又回到了从内存查询映射关系的老路,TLB反而成了鸡肋。为此,TLB并不自动更新,处理器也不负责TLB的有效性,它把TLB的维护工作交给操作系统开发人员,由开发人员手动控制。这的确是非常合理的,毕竟维护页表的代码是开发人员自己写的,他们肯定知道何时修改了页表,或是修改了哪些条目。

尽管TLB对开发人员不可见,但依然有两种方法可以间接更新TLB,一个是针对TLB中所有条目的方法——重新加载CR3,比如将CR3寄存器的数据读出来后再写入CR3,这会使整个TLB失效。另一个方法是针对TLB中某个条目的更新。处理器提供了指令invlpg(invalidate page),它用于在TLB中刷新某个虚拟地址对应的条目,处理器是用虚拟地址来检索TLB的,因此很自然地,指令invlpg的操作数也是虚拟地址,其指令格式为invlpg m。注意,其中m表示操作数为虚拟内存地址,并不是立即数,比如要更新虚拟地址0x1234对应的条目,指令为invlpg [0x1234],并不是invlpg 0x1234。将来咱们在内存管理系统中会涉及到TLB的更新操作,这一点尤为注意。

好啦,有关TLB的介绍就到这儿,下节再见

一步步编写操作系统 41 快表tlb 简介相关推荐

  1. 一步步编写操作系统 71 直接操作显卡,编写自己的打印函数71-74

    一直以来,我们在往屏幕上输出文本时,要么利用bios中断,要么利用系统调用,这些都是依赖别人的方法.咱们还用过一个稍微有点独立的方法,就是直接写显存,但这貌似又没什么含量.如今我们要写一个打印函数了, ...

  2. 一步步编写操作系统 62 函数调用约定

    由于我们要将c语言和汇编语言结合编程啦,所以一定会存在汇编代码和c代码相互调用的问题,有些事情还是要提前交待给大家的,本节就是要给大家说下函数调用规约中的那些事儿. 函数调用约定是什么? 调用约定,c ...

  3. 一步步编写操作系统 69 汇编语言和c语言共同协作 70

    由于有了上一节的铺垫,本节的内容相对较少,这里给大家准备了两个小文件来实例演示汇编语言和c语言相互调用. 会两种不同语言的人,只是掌握了同一件事物的两种表达方式.人在学习一种新语言时,潜意识里是建立了 ...

  4. 内存管理 —— 快表TLB

    一.快表和慢表的定义 慢表(Page):页表.段表存放在主存中,收到虚拟地址后要先访问主存,査询页表.段表,进行虚实地址转换. 快表(TLB):提高变换速度→用高速缓冲存储器存放常用的页表项 二.局部 ...

  5. 一步步编写操作系统 35 内存为何要分页

    一直以来我们都直接在内存分段机制下工作,目前未出问题看似良好,的确目前咱们的应用过于简单了,就一个loader在跑,能出什么问题呢.可是想像一下,当我们物理内存不足时会怎么办呢?比如系统里的应用程序过 ...

  6. 一步步编写操作系统 19 改进MBR,直接操作显卡

    到目前为止,说了一部分有关显存的内容,这对于一般的输出来说已经足够了,下面咱们可以尝试写显存啦.我们将之前MBR改造一下,保留滚屏的操作,只修改有关输出的部分.即把通过bios的输出改为通过显存,你会 ...

  7. 一步步编写操作系统 66 浅析c库函数与系统调用1

    本来说好的接下来的工作是要去"丰满"我们的内核,可咱们这种一步一回头的学习方式还得继续啊.其实我了解大家急切写内核的心情,但本书<操作系统真象还原>(请大家支持正版)的 ...

  8. 一步步编写操作系统 39 二级页表1

    前面讲述了页表的原理,并以一级页表做为原型讲述了地址转换过程.既然有了一级页表,为什么还要搞个二级页表呢?理由如下: 一级页表中最多可容纳1M(1048576)个页表项,每个页表项是4字节,如果页表项 ...

  9. 一步步编写操作系统 38 一级页表与虚拟地址3

    接上,页是地址空间的计量单位,并不是专属物理地址或线性地址,只要是4KB的地址空间都可以称为一页,所以线性地址的一页也要对应物理地址的一页.一页大小为4KB,这样一来,4GB地址空间被划分成4GB/4 ...

最新文章

  1. Nature子刊:残留DNA在土壤中含量丰富并且模糊了对土壤生物多样性的估计
  2. java实现快速排序
  3. plsql 参数中in out in的区别讲解
  4. Windows Shell 学习 3
  5. macOS下nginx配合obs做推流直播.md
  6. Firefox v5 正式版
  7. 以“百钱买百鸡”问题练习使用 C语言 goto 语句
  8. vue自定义组件递归实现树状_一道价值25k的腾讯递归组件面试题(Vue3 + TS 实现)...
  9. qmake manual=Variables
  10. http://www.jb51.net/article/51934.htm
  11. zbbz插件使用教程_zbbz加载成功用不了_坐标标注插件zbbz【CAD教学】
  12. vue动态创建三级导航
  13. SIGBUS:BUS_ADRERR for stack access violation in memcpy
  14. css之让尾部永远固定在页面最下方
  15. su: Authentication failure问题
  16. 老挑毛u盘一键装系统计算机意外地,u盘装系统 重装Win7系统出现提示计算机意外的重新启动或遇到错误怎么处理 我已经删除了所有分...
  17. 遗传算法(GA)学习 || 原理、本质、代码、例题
  18. git 使用总结(三)repo sync -m
  19. 互联网思维——流量思维
  20. ATM机、自助查询机无线联网方案

热门文章

  1. bzoj3203: [Sdoi2013]保护出题人
  2. 08-SSH综合案例:前台用户模块:注册页面的前台JS校验
  3. DroidPlugin插件化开发
  4. Android学习----发行版本
  5. matlab win10 gpu加速,win10的Edge浏览器设置GPU硬件加速,大幅度提升浏览器性能
  6. mysql datetime timestamp 索引_MYSQL中时间类型底层存储,DATETIME ,TIMESTAMP,INT 如何选择?...
  7. 南京二本有什么计算机学校,南京有什么好的二本学校?
  8. ubuntu12 04下django安装略谈
  9. wordpress 外部数据接口_使用接口方式获取WordPress用户信息的方法
  10. pytorch gather_【Pytorch】Pytorch-1.1.0 版本新特性