谭升
非主流人工智能科学家 我和外面那些妖艳的货不一样

【30天自制操作系统】 GDT和IDT

GDT和IDT

全局描述表(GDT ,Global Descriptor Table):首先看到全局说明这货很重要,应该是掌握了一些,其次这个表是个数组,所以,这是一个重要的数据结构。
GDT数组中装的是段描述符【段地址,段的最大长度,访问权限】。因为这个描述符太大了,没有这么大的寄存器(64位),所以就把这个描述符放在内存里,成为了重要的GDT,intel的大叔们设计了一个寄存器GDTR(LGDT为装入此寄存器指令)用来存放GDT的入口地址,因为GDT可以设计到内存的任何位置,而GDTR可以帮助快速定位,这样段寄存器的13位就能索引到GDT了。GDT是保护模式必备的数据结构。能够很好的划分内存,控制程序的内存方位(不然会出大问题)。
中断描述符表(IDT Interrupt Descriptor Table):之前已经见识过中断的强大了,这个描述符表是管理中断的,很明显是高手中的高手,其实他是一个8字节的描述符数组,也是一种重要的数据结构。IDT只要保存256个描述符就够了,因为最多也不会有超过256种中断,甚至IDT可以少于256,只要够用就行。同样,IDT可以放在内存的各个角落,只要你愿意,但是一定要是线性的,不然就找不到了(这是个数组,当然线性了),IDT也有专门的寄存器存放入口地址,叫IDTR,这个寄存器中含有IDT表32位的基地址(高32位)和16位的长度(限长)值(低16位)。IDT表基地址应该对齐在8字节边界上以提高处理器的访问效率。LIDT和SIDT指令分别用于加载和保存IDTR寄存器的内容。LIDT指令用于把内存中的限长值和基地址操作数加载到IDTR寄存器中。该指令仅能由当前特权级CPL是0的代码执行,通常被用于创建IDT时的操作系统初始化代码中。如果有越界访问IDT的现象会触发一个保护性异常。

中断向量表:实模式下的前1K个字节为中断向量表,每项有四字节(2字节的段地址,2字节的偏移地址,来定位实模式下的1M空间),用来指向中断处理程序的位置,但是在保护模式下,4字节不够用,需要8字节,所以改名IDT,而且位置也不局限于开始的0x00000处,使用全新的方式完成中断处理。

IDT中的每一项叫“门”(门描述符),很明显是传送门。。哈哈。。

Advertisements
Share

You may also like...

说点什么

avatar
  Subscribe  
提醒

试录了几节线性代数视频课程,欢迎大家支持,
点击试看
点击购买更多内容

由于博客移至wordpress,部分公式和代码显示不正常,博主正在努力修改,如发现公式显示错误,请及时在文章下留言,感谢您的帮助,尽请原谅!