关于x86系统段选择器的相关技术问题咨询
问题1:段选择器是否存储在RAM中?
段选择器是16位数值,它可以存储在RAM中(比如程序的指令、数据区域里),当需要访问对应段时会被加载到段寄存器。不过段寄存器加载后,CPU会自动将对应的段描述符信息缓存到内部的不可见缓存寄存器中,这部分缓存不在RAM里。问题2:段选择器由谁创建?是自动生成的吗?
段选择器由操作系统内核或编译器/汇编器创建。编译链接阶段,汇编器会根据代码段、数据段的定义生成对应选择器;内核在创建进程/线程时,也会为其分配合适的段选择器。它不是自动生成的,是通过工具或内核代码人为定义的。问题3:一个段是否可以拥有多个段选择器?
可以。一个段对应的段描述符在GDT/LDT中是唯一的,但多个不同的段选择器可以指向同一个描述符(只要选择器的索引部分匹配描述符在表中的位置)。甚至可以创建不同权限的选择器指向同一个段,实现不同权限下的访问控制。问题4:段选择器与段寄存器之间的关系是什么?
段寄存器(如CS、DS、ES等)的可见部分存储的就是段选择器。当把段选择器加载到段寄存器时,CPU会自动从GDT/LDT中取出对应的段描述符,将描述符的基地址、限长、权限等信息缓存到段寄存器的不可见部分,后续内存访问会直接使用这些缓存信息,无需每次查询GDT/LDT。问题5:这类结构(如分页分段、段选择器等)在现代系统中是否仍被使用?
现代x86系统(如Windows、Linux)普遍启用分页机制,但分段机制仍在使用,只是被简化。比如Linux会将所有段的基地址设为0、限长设为4GB,让分段“扁平化”,主要用它处理权限(如用户态与内核态的段权限区分)。段选择器依然会被用来加载段寄存器,维持CPU的保护模式运行,只是不再依赖分段划分内存地址,转而依靠分页。
内容的提问来源于stack exchange,提问作者choiyhking

