导读:
段是学习汇编、操作系统经常遇到的知识,那么什么是段?为何使用段也是需要清楚的内容。此外还初步讲解了GDT和IDT的相关知识。 |
- 现在所有的操作系统都能同时运行多个程序。在这种情况下内存使用重叠了该怎么办?会出现让一个程序停止运行并且提示“内存地址冲突”的错误吗?是不会出现的。这就是采用了分段的机制。
- 分段就是指按照自己喜欢的方式,将4GB的内存空间分为多个block(块),一个块的首地址都当做0来看待。这样所有的程序开头都可以协商ORG 0。像这样分割出来的块,就称之为段(segment)。一般来说采用分页(paging)也可以解决这种问题,我们这里不讨论。
- 段寄存器是16位的,因为CPU设计的原因,低3bit不能使用,只能使用高13bit。那么段号的范围是0~8191。
- 段号该如何设定呢?因为有0~8191个段,定义这么多段需要8192x8=65536(64KB)大小。可是CPU没有这么大的存储能力,那么该怎么办?这时候就需要将其存放在内存中。那么这64KB(可能小些)的数据就称之为GDT。
GDT是“global(segment) descriptor table”的缩写,也就是全局段描述符表。这些64kb数据整齐的排列在内存中某一位置。而该位置的内存地址以及有效的个数就存放在GDTR中。GDTR是一种特殊的寄存器。如此一来段号就设定好了。
IDT是“interrupt descriptor table”的缩写,是中断描述符表。IDT记录了0~255的中断号码和中断服务函数的关系。当发生中断的时候,通过中断号码去执行中断服务函数。(IDT的设定方法和GDT非常相似,因为采用相似的方法能简化CPU的电路)