1.《一个操作系统的实现》中有一个nasm汇编关于段描述符的宏定义,如下:
; 描述符
; useage: Descriptor Base, Limit, Atrr
; Base: dd
; Limit: dd (low 20 bits available)
; Attr: dw (lower 4 bits of higher byte are always 0)
%macro Descriptor 3
dw %2 & 0FFFFh ; 段界限1
dw %1 & 0FFFFh ; 段基址1
db (%1 >> 16) & 0FFh ; 段基址2
dw ((%2 >> 8) & 0F00h) | (%3 & 0F0FFh) ; 属性1 + 段界符2 + 属性2
db (%1 >> 24) & 0FFh ; 段基址3
%endmacro ;共 8 字节
2.为了偏于理解这个段描述符宏定义的含义,先了解一下相关背景。
- 通用段描述符的格式如下:

即一个段描述符总共8字节,64位,其中
Base字段(32位):高4字节的24-31位和0-7位,还有低4字节的16-31位,这三部分构成了一个32位的地址
Limit字段(32位):对应的有高4字节的16-19位,低4字节的0-15位,共计20位,剩余12位(实际如果G=0,在limit前面补000,最大可以表示0x000FFFFF;如果G=1,在limit后面补FFF,最大可以表示0xFFFFFFFF)
Attr(16位):段描述符高4字节的8-23位组成。
现在再回看宏定义其实就是将Base、Limit、Atrr三个数值拆成段描述符这样的结构。
3.相关知识扩展
常用的段寄存器ES、CS、SS、DS、FS、GS、LDTR、TR其实是个96位的寄存器,如下图

总共有96位,只有16位段选择子可见,其余80位不可见。实际过程会根据段选择子到GDT或者LDT中获取段描述符,不可见部分的Base、Litmit、Attribute其实分别对应段描述符相应字段。
参考链接:
本文解析了《一个操作系统的实现》中nasm汇编的段描述符宏定义,介绍了段描述符的结构,包括Base、Limit和Attr字段,并探讨了段寄存器如何根据段选择子获取段描述符。

2109

被折叠的 条评论
为什么被折叠?



