高速缓冲寄存器(转自whowin博客)
来源:互联网 发布:视频片头软件 编辑:程序博客网 时间:2024/05/17 06:25
实际上,不管是在实模式还是在保护模式下,CPU都会把一个分段的基地址放在一组隐藏的寄存器中,这组隐藏的寄存器,对程序员是不可见的,程序也是无法直接存取的,但却是实际存在的,这组隐藏的寄存器叫做描述符高速缓存寄存器(Descriptor Cache Registers),当段寄存器的值发生变化时,段的基地址、段的边界以及存取属性(存取权限)都会被重新加载到这个段寄存器对应的高速缓存中,为增强性能,CPU对随后的寻址均会直接从这个高速缓存中计算,而不会去描述符表中提取描述符,实际上,各种CPU中这个高速缓存的内部结构是不同的,以下是几种CPU中高速缓存的结构图:
不管其内部结构是怎样的,但我们可以看到,CPU在把描述符加载进高速缓存时并不是简单的拷贝,而是做了一些适当的处理,比如把原来没有连续存放的段基址和段界限变成了连续的,把原来20bits的段界限根据G值转换成了32bits,所以我们在高速缓存里看不到原来描述符里的G标志就是这个道理,显然,这些处理十分有利于快速地得出实际地址来。
前面我们提到过,CPU内部寄存器GDTR中存储着描述符表的起始地址,细心的读者可能会发现,《80386寄存器组成》一文中提到的GDTR寄存器有48bits,而且分成两部分,一部分是32bits,另一部分是16bits,这是怎么回事呢?实际上GDTR中不仅存着描述符表的起始地址,还存放着描述符表的长度,其中16bits的部分就是描述符表的长度,32bits的部分就是描述符表的起始地址,按照规范,描述符表中最多可以有8192(8K)个描述符,每个长度8个字节,所以最大长度为64K,16bits已经足够了,同理,段寄存器仍然保持16bits长度也是足够的。
不管是在实模式还是在保护模式下,CPU在实际寻址时都会使用这个高速缓存。所不同的是,在实模式下,在段寄存器的值发生变化时,仅仅把段寄存器的值×16(左移4位)放到高速缓存的的基地址位置,段界限和存取权限总是一个固定不变的值(按照Intel的说法,PC机加电后工作在实模式,高速缓存中将被置入缺省值,在实模式下,其中的段界限和存取权限将一直保持不变);而在保护模式下,当段寄存器发生变化时,CPU要从描述符表中加载数据到高速缓存中,实际上,保护模式下CPU在从描述符表中向高速缓存中加载数据时要做大量的保护性检查,大致如下:
- 段寄存器的值不能是0。根据规范,描述符表中的第一个描述符必须是空描述符,所以段寄存器值为0是不合法的。如果为0,产生异常中断13.
- 段寄存器中的值是否大于或等于描述符表的长度(存在GDTR中),如果大于或等于描述符表的长度,产生异常中断13.
- 如果段寄存器是CS,检查描述符表中的段类型是否为代码段,如果不是,产生异常中断13.
- 如果段寄存器CS要求装入的段是代码段,检查描述符表该段是否存在,如果不存在产生异常中断11
- 如果段寄存器CS通过了3、4的检查,还要检查IP是否超越了该段的边界,如果越界,产生异常中断13
- 如果段寄存器CS通过了3、4、5的检查,则把相应的描述符装入高速缓存
- 如果段寄存器不是CS,检查描述符表中的段类型为数据段,如果不是产生异常中断13
- 如果段寄存器不是CS,该段为数据段,检查其是否存在,如果不存在产生异常中断13
- 如果段寄存器不是CS,且通过了7、8检查,则把相应的描述符装入高速缓存
- 高速缓冲寄存器(转自whowin博客)
- 高速缓冲寄存器(转自whowin博客)
- 高速缓冲寄存器
- 段描述符高速缓冲寄存器
- 段描述符高速缓冲寄存器
- 【转自Aurola的博客】I386的寄存器(一)
- 【转自Aurola的博客】I386的寄存器(二)
- Query cache(高速查询缓冲池)
- MySQL查询高速缓冲
- 数据缓冲区高速缓冲
- mysql高速缓冲
- 一个操作系统的实现:关于保护模式和实模式的跳转和段描述符高速缓冲寄存器
- 一个操作系统的实现:关于保护模式和实模式的跳转和段描述符高速缓冲寄存器
- Linux内核学习笔记之高速缓冲管理(五)
- SBUF数据缓冲寄存器
- MySQL查询高速缓冲详解
- MySQL查询高速缓冲学习
- 内存中的高速缓冲页的管理
- 【C++】高精度方法求2的N次方
- 路径寻找问题 UVA 1499 - Gem And Prince
- Android界面设计之创建自定义的控件焦点顺序
- STM32的IAP
- 【恢复状态】第三届山东省ACM竞赛Problem J——Contest Print Server
- 高速缓冲寄存器(转自whowin博客)
- Template Code 无法使用 this.Host 报错
- 4:前缀中的周期
- 【C++】孙子问题,中国剩余问题
- itoa的实现
- 读书笔记:“集体智慧编程”之第九章:高阶分类-核方法与SVM
- sizeof strlen
- 什么是Java中的happen-before关系
- 深入理解servlet jdbc 数据库连接池