内存管理——段描述符
2021/11/1 7:11:40
本文主要是介绍内存管理——段描述符,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
段描述符是位于GDT或LDT中8字节的项,给处理器提供一个段的位置、界限、访问特权级等信息。
段描述符的结构:
# G:粒度标志。Segment Limit 字段的大小比例。G=0,Segment Limit 以字节为单位;G=1,Segment Limit 以4KB为单位,计算:实际段界限 = 描述符中的段界限 * 0x1000 + 0xFFF。该标志不影响Base字段的粒度,Base字段永远以字节为单位。
# Segment Limit:表示该段的大小/界限。处理器用G标志位来解释该字段。当G=0,段的大小是1B~MB,以1字节为单位增长;当G=1,段的大小是4KB~4GB,以4KB为单位增长。对于段的扩展方向,如果是向上扩展段,逻辑地址的偏移量是0~Segment Limit;如果是向下扩展段,逻辑地址的偏移量是Segment Limit(最小值)~FFFFFFFFh或FFFFh。实模式下,处理器将Limit预置成0xFFFF,以防出错。
# Base:段在线性地址空间中的开始位置。段基址应当是16字节边界对齐的,提高程序性能。
# DPL:该描述符的特权级,0 ~ 3。用于控制对该段的访问。
# P:表示该段是否在内存。P=1,该段在内存中;P=0,该段不在内存中,处理器产生一个#NP异常,操作系统可以自由地使用Available域。
# D:处理器默认操作尺寸,表示该段按16位还是32位尺寸操作。对于代码段,D/B位是D位,表示默认的操作尺寸。当D=0,表示16位默认操作尺寸;当D=1,表示32位默认操作尺寸。
# B:对于数据段,D/B位是B位。当栈段的B位=0,使用sp;B位=1,使用esp。
# L:用于IA-32e模式下。表示一个代码段是否包含原生64位代码。L=1,表示该代码段中的指令运行在IA-32e下,D位必须为0;L=0,表示该代码段中的指令运行在兼容模式下,该位作为保留位。
# AVL:是否可以被系统软件使用。
# S:确定段描述符是系统/门段描述符(S=0)还是代码/数据段描述符(S=1)。
# Type:表示段的类型(代码段、数据段、门、系统段)和它们的权限和信息。具体是什么段先由S位决定再根据Type域的二进制决定。
参考资料
Combined Volume Set of Intel® 64 and IA-32 Architectures Software Developer’s Manuals这篇关于内存管理——段描述符的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-15鸿蒙生态设备数量超8亿台
- 2024-05-13TiDB + ES:转转业财系统亿级数据存储优化实践
- 2024-05-09“2024鸿蒙零基础快速实战-仿抖音App开发(ArkTS版)”实战课程已上线
- 2024-05-09聊聊如何通过arthas-tunnel-server来远程管理所有需要arthas监控的应用
- 2024-05-09log4j2这么配就对了
- 2024-05-09nginx修改Content-Type
- 2024-05-09Redis多数据源,看这篇就够了
- 2024-05-09Google Chrome驱动程序 124.0.6367.62(正式版本)去哪下载?
- 2024-05-09有没有大佬知道这种数据应该怎么抓取呀?
- 2024-05-09这种运行结果里的10.100000001,怎么能最快改成10.1?