影子寄存器
内核中有好多处类似下面的汇编代码(保护模式下)
movl $0x10,%eax mov %ax,%ds mov %ax,%es mov %ax,%fs mov %ax,%gs
我就纳闷啊,内核加载时,BIOS在运行在实模式下,段寄存器是16位,段寄存器存储的是段基址,左移4位加上段偏移就是实际的物理内存地址,寻址范围是1MB。
现在32位保护模式下运行,段寄存器还是16位,不过段寄存器存储的不再是段基址,而是段选择符(selector,有的也称为段选择子),16位的段选择第3~15位是描述符表(GDT/LDT)的索引。
CPU寻址时,必然要用到段基址等信息,要从内存中读到寄存器中来使用,那么什么时候去查找描述符表,取出段的基本信息(基址、限长、属性)?将段的基本信息保存在何处?
查找一些资料,原来每个段寄存器都有一个影子寄存器,也叫描述符缓冲或描述符投影寄存器。影子寄存器对程序员来说是透明的,不可见的,它有6个字节,存储段基址、限长、属性信息,这样和段寄存器加起来正好8字节,是一个描述符的长度。
从寄存器ax将段选择符拷贝到段寄存器的同时,段的基本信息也读到了相应的影子寄存器中,使用段寄存器寻址时,它直接去影子寄存器读取段属性和基址等信息,不必再读取描述符表。
参考http://oss.org.cn/kernel-book/ch02/2.3.6.htm
留下评论