保护模式 x86 TLB

2024-02-24 10:18
文章标签 x86 保护模式 tlb

本文主要是介绍保护模式 x86 TLB,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

TLB

文章目录

  • TLB
    • TLB结构
    • TLB种类
    • 实验

思考:

通过一个线性地址0x12345678访问一个物理页,我们想要读取0x12345678地指处一个字节的数据时,  
操作系统是真的只读了一个字节吗?

答:线性地址首先会被拆分,然后读取PDE(4字节),再读取PTE(4字节),最后读取物理页上的1字节,总共读取了8+1字节.

补充提问:

会不会有这种情况,DWORD 大小数据,前两个字节在一个物理页,后两个字节在另一个物理页,
这样当我要读取这DWORD字节大小的数据时,总共读取了多少字节?

答:这种情况肯定存在,并且也存在1个字节在单独物理页,其他三个在一个这种情况,但是不存在连续三个字节存储在分离的物理页的情况.上面说的那种情况,读取4字节PDE,4字节PTE,2字节数据,重复一遍,总共20个字节,如果是2-9-9-12分页模式, 就会多读8+8+8 = 24字节

这样的效率是非常低的! 为此CPU在内部做了一个表,来记录这些东西

这个表格是CPU内部的,和寄存器一样快

这个表格:TLB(Translation Lookaside Buffer)

思考:

任何一个进程都有4G大小的独立空间,那其中的线性地址最大能有4G个,但是TLB是存储在CPU内部的,大小受限,最多存储几百条记录,
那这几百条相对与4G少之又少,请思考这几百条的意义?

TLB结构

LA(线性地址)PA(物理地址)ATTR(属性)LRU(统计)
0x80000000-以上G位=1
0x80000000-以下G位=0
LA <-> PA ,线性地址和相对应的物理地址对应并存储ATTR属性信息:如果是2 9 9 12 分页模式就是PDPE PDE PTE三个属性&运算起来的,如果是10 10 12分页模式就是PDE & PTELRU统计:统计该线性地址的使用频率,CPU保证TLB存储使用频率最高的线性地址.由于同一个线性地址在不同进程对应的物理地址不一定是相同的(绝大部分情况都不同),所以只要CR3变了 TLB立马刷新,一核一套TLB  

如果CR3改了,TLB刷新,但是重建高2G以上的很浪费,所以PDE和PTE有个G标志位,如果G位为1刷新TLB时将不会刷新PDE/PTE的G位为1的页,当TLB满了,根据统计信息将不常用的地址废弃,最近最常用的保留.注意:PDE中的G位只有当PDE的P/S位 =1 时,即PDE代表大页的时候才有效

TLB种类

TLB在X86体系的CPU里的实际应用最早从Intel的486CPU开始,在X86体系的CPU里边,一般都设有如下4组TLB:

第一组:缓存一般页表(4K字节页面)的指令页表缓存(Instruction-TLB);

第二组:缓存一般页表(4K字节页面)的数据页表缓存(Data-TLB);

第三组:缓存大尺寸页表(2M/4M)的指令页表缓存(Instruction-TLB);

第四组:缓存大尺寸页表(2M/4M)的数据页表缓存(Data-TLB);

实验

步骤一:体验TLB的存在
步骤二:全局页的意义
步骤三:INVLPG指令的意义

待补充 - - -

这篇关于保护模式 x86 TLB的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/741789

相关文章

《x86汇编语言:从实模式到保护模式》视频来了

《x86汇编语言:从实模式到保护模式》视频来了 很多朋友留言,说我的专栏《x86汇编语言:从实模式到保护模式》写得很详细,还有的朋友希望我能写得更细,最好是覆盖全书的所有章节。 毕竟我不是作者,只有作者的解读才是最权威的。 当初我学习这本书的时候,只能靠自己摸索,网上搜不到什么好资源。 如果你正在学这本书或者汇编语言,那你有福气了。 本书作者李忠老师,以此书为蓝本,录制了全套视频。 试

NGINX轻松管理10万长连接 --- 基于2GB内存的CentOS 6.5 x86-64

转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=190176&id=4234854 一 前言 当管理大量连接时,特别是只有少量活跃连接,NGINX有比较好的CPU和RAM利用率,如今是多终端保持在线的时代,更能让NGINX发挥这个优点。本文做一个简单测试,NGINX在一个普通PC虚拟机上维护100k的HTTP

SylixOS x86平台C++符号表

1.C++跨平台问题说明     在x86平台下编译C++工程过程后,运行编译好的C++共享库时出现符号表__atomic_fetch_sub_4找不到的问题,如图 1.1所示。

《Linux运维总结:基于X86_64+ARM64架构CPU使用docker-compose一键离线部署consul 1.18.1容器版分布式ACL集群》

总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:《Linux运维篇:Linux系统运维指南》 一、部署背景 由于业务系统的特殊性,我们需要面向不通的客户安装我们的业务系统,而作为基础组件中的consul 针对不同的客户环境需要多次部署集群,作为一个运维工程师,提升工作效率也是工作中的重要一环。所以我觉得有必要针对 x86_64 + ARM64 CPU架构cons

2.第二阶段x86游戏实战2-认识进制、理解数据宽度和位的概念

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 工具下载: 链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd=6tw3 提取码:6tw3 复制这段内容后打开百度网盘手机App,操作更方便哦 上一个内容:1.第二阶段x86游戏实战2-前言 进制、数据宽度、位是一

x86的保护模式(一)

10月份就剩明天一天了,今天晚上突袭一下,写篇新博客  2017年10月30日18:13:23 BY :张飞online

X86汇编基础

1. mov指令及几种内存寻址方式: 寄存器模式(register mode),以%开头的寄存器标示符 立即数(immediate):是以$开头的数值 直接寻址(direct):直接访问一个指定的内存地址的数据 间接寻址(indirect):将寄存器的值作为一个内存地址来访问内存 变址寻址(displaced):在间接寻址之时改变寄存器的数值 AT&T汇编格式与Intel汇

X86架构(六)——光标控制

光标(Cursor)是在屏幕上有规律地闪动的一条小橫线,通常用于指示下一个要显示的字符位置。 光标在屏幕上的位置保存在显卡内部的两个光标寄存器中,每个寄存器是8位的,合起来形成一个16位的数值。标准VGA文本模式是25 行,每行80个字符。所以,0表示光标在屏幕上第0行第0列,80表示它在第1行第0列,这样算来,当光标在屏幕右下角时,该值为25×80-1=1999 光标寄存器是可读可写的 取当前

X86架构(六)——移位指令与无条件转移指令

移位指令 shr 逻辑右移 逻辑右移指令会将操作数连续地向右移动指定的次数,移出的比特被移到标志寄存器的CF位,左边空出来的位置用0填充 ;目的操作数可以是8位或16位的通用寄存器或者内存单元;源操作数可以是数字1、8位立即数或者寄存器CLshr r/m8, 1 ;目的操作数是8位通用寄存器/内存单元,源操作数是1shr ah, 1shr r/m16, 1 ;目的操作数是16位通用

虚拟机MacOS安装Openssl ld: symbol(s) not found for architecture x86_64

最近开始搞MacOS下的开发,需要用到openssl,但是系统自带的openssl头文件还有库根本找不到,也不知道能不能用,于是就自己装一个 1.去网络上下载一个openssl的源码包 2.解压到自己有权限的目录下 3.在这一步,很多人用linux下的配置方法,我也是其中一个,踩了很大的坑,他们都是: sudo ./config --prefix=/usr/local/openssl 然