Pan*_*der 4 x86 assembly operating-system kernel gdt
我阅读了关于GDT(全局描述符表)的教程,该教程将GDT定义为"为内存的某些部分定义基本访问权限的那个".这意味着GDT用于记忆保护.
它是否执行除上述以外的任何其他任务?
是否必须在操作系统中实施GDT?
简而言之,如果有人能够以易于理解的方式详细阐述GDT,那将会更好.
谢谢
Mar*_*oom 18
所有图像均来自英特尔手册3A,§5.1.
有关进一步的细节,OP应该阅读该手册,这里我将简化一些简化的概念,以避免仅链接的答案.
顾名思义,全局描述符表是一组描述符,可用于指定和定义系统范围的资源(因此描述这些资源).
资源往往是连续记忆的一个领域,但也有其他非常重要的资源.
描述符的分类是
Descriptors
Non system descriptors
Code segment descriptor
Data segment descriptor
Stack segment descriptor (Alias of the previous)
System descriptors
System segment descriptors
LDT segment descriptor
TSS segment descriptor
Gate descriptors
Call gate descriptor
Interrupt gate descriptor
Trap gate descriptor
Task gate descriptor
Run Code Online (Sandbox Code Playgroud)
除了GDT还有另外一个表中,局部描述符表由操作系统只有特定的情境描述所提供的资源.
描述符由其表(GDT或LDT)及其在表上的位置及其索引来标识.
这种索引被写入特定的寄存器,称为选择寄存器(以前称为段寄存器).
隐式或显式访问内存的每条指令都使用其中一个选择器.
xor eax, eax ;eax is zero
xor esp, esp ;esp is zero
xor ebx, ebx ;ebx is zero
mov ecx, DWORD [eax] ;Use DS selector (implicit)
mov ecx, DWORD [esp] ;Use SS selector (implicit)
mov ecx, DWORD [fs:ebx] ;Use FS selector (explicit)
Run Code Online (Sandbox Code Playgroud)
所有这些指令都读取逻辑地址 0,但CPU使用描述符计算新地址,称为线性地址并执行安全检查.
因此,这三条指令最终可能会读取完全不同的地址.
每个选择器还指定执行操作时应使用的权限.
该cs选择是特殊的,因为它不能再改变(它实际上已经一段时间)有mov,但只有一个分支指令(jmp,ret,call,...).
它的目的不仅仅是在获取代码时使用,它还拥有代码权限级别.
CPU使用此权限级别来检查是否可以访问资源(具有所请求的权限),检查并不总是微不足道的.
正如您将看到的,每个描述符都有一个DPL字段来设置其权限级别.
所以它们是一种保护形式.
非系统描述符用于定义用于存储代码或数据及其属性的存储器区域.
正如您所看到的,这种描述符的目的是指定一个内存区域并为其附加一些属性.
特别是基地址,限制(大小),访问它所需的权限(DPL字段,检查实际上比这更多),代码的大小(仅代码),如果允许读/写等等上.
长模式(64位)改变了属性的解释方式,请注意这一点.
OS使用系统描述符来控制用户模式程序.
这些描述符定义了用于存储LDT的存储区域和另一个称为任务状态段的结构(英特尔为缓解任务切换而提供的机制).
系统上可以有多个这样的结构,所选择的结构由ldtr(LDT寄存器)和tsr(TS寄存器)寄存器指示.
这些用于将控制转移到其他(更多或更少特权)代码.
打电话给你
如果查看图片,您可以看到调用门本质上是一个元描述符,它指定一个选择器和一个偏移到该描述符指定的区域以及特权.
它用于将控制权传递给特权例程.
call fs:0badbabeh
Run Code Online (Sandbox Code Playgroud)
假设fs持有门的索引,CPU根本不会使用直接地址0badbabeh,而是使用门本身的信息.
中断和陷阱门
这些都与中断一起使用,两者的区别在于前者清除了if标志,后者则没有.
它们与呼叫门非常相似.
这些描述符实际上放在另一个表中,通常是中断描述符表.
另一个表没有使用选择器索引,但带有中断号.
如果我没记错的话,它们也可以放在GDT/LDT中,并像其他门一样使用.
甲任务门可用于执行任务切换.
任务门
这些就像呼叫门,但将控制转移到新任务(任务切换).
有些资源不是简单的内存区域,它们可以是门