郑州网站设计哪家公司好,网上购物的网站有哪些,wordpress完全静态化插件,seo做的比较好的公司分页机制虽然很灵活#xff0c;但您也看到了#xff0c;为了实现虚拟地址到物理地址的映射#xff0c;过程还是有些麻烦的。先要从CR3寄存器中获取页目录表物理地址#xff0c;然后用虚拟地址的高10位乘以4的积做为在页目录表中的偏移量去寻址目录项pde#xff0c;从pde中…分页机制虽然很灵活但您也看到了为了实现虚拟地址到物理地址的映射过程还是有些麻烦的。先要从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是页表的缓存处理器寻址时最先访问的是TLBTLB里面存储的是程序运行所依赖的指令和数据的内存地址任意时刻都必须保证地址的有效性否则程序必然出错所以TLB必须实时更新。可是如果实时读取内存中的页表去更新TLB的话这又回到了从内存查询映射关系的老路TLB反而成了鸡肋。为此TLB并不自动更新处理器也不负责TLB的有效性它把TLB的维护工作交给操作系统开发人员由开发人员手动控制。这的确是非常合理的毕竟维护页表的代码是开发人员自己写的他们肯定知道何时修改了页表或是修改了哪些条目。
尽管TLB对开发人员不可见但依然有两种方法可以间接更新TLB一个是针对TLB中所有条目的方法——重新加载CR3比如将CR3寄存器的数据读出来后再写入CR3这会使整个TLB失效。另一个方法是针对TLB中某个条目的更新。处理器提供了指令invlpginvalidate page它用于在TLB中刷新某个虚拟地址对应的条目处理器是用虚拟地址来检索TLB的因此很自然地指令invlpg的操作数也是虚拟地址其指令格式为invlpg m。注意其中m表示操作数为虚拟内存地址并不是立即数比如要更新虚拟地址0x1234对应的条目指令为invlpg [0x1234]并不是invlpg 0x1234。将来咱们在内存管理系统中会涉及到TLB的更新操作这一点尤为注意。
好啦有关TLB的介绍就到这儿下节再见