高速缓冲寄存器
来源:互联网 发布:淘宝分享有赏基础分 编辑:程序博客网 时间:2024/05/06 13:09
不管其内部结构是怎样的,但我们可以看到,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博客)
- MySQL查询高速缓冲
- 数据缓冲区高速缓冲
- mysql高速缓冲
- 一个操作系统的实现:关于保护模式和实模式的跳转和段描述符高速缓冲寄存器
- 一个操作系统的实现:关于保护模式和实模式的跳转和段描述符高速缓冲寄存器
- SBUF数据缓冲寄存器
- MySQL查询高速缓冲详解
- MySQL查询高速缓冲学习
- 内存中的高速缓冲页的管理
- 第3章 数据缓冲区高速缓冲
- Query cache(高速查询缓冲池)
- 第三章 数据缓冲区高速缓冲
- 高速dma缓冲使用。kmem_cache_alloc,kmem_cache_create,struct kmem_cache。内核dma
- pwn1
- GET和POST的真正区别
- PHP版本的Graphviz样例之集群流程图
- [leetcode]66. Plus One
- Reverse Bits
- 高速缓冲寄存器
- java反射机制总结
- 【MindManager软件常用快捷键】Mindjet MindManager快捷键教程
- DPL,RPL,CPL 之间的联系和区别
- Vijos P1431 守望者的逃离
- oarcle-导入工具DataLoad
- 权限管理模型之一
- 修改LoadRunner自带的示例程序端口号
- <Android 应用 之路> 百度地图API使用(2)