段寄存器中的16位值如何用于表示大内存地址?

ES 0023 32bit 0(FFFFFFFF)
CS 001B 32bit 0(FFFFFFFF)
SS 0023 32bit 0(FFFFFFFF)
DS 0023 32bit 0(FFFFFFFF)
FS 003B 32bit 7FFDF000 (FFF)
GS 0000 NULL


例如,003B中的FS如何转换为7FFDF000?为什么0023中的ES001B中的CS都可以明显地转换为0

我正在研究Intel手册,但希望这里的人能比我读得更快那些...

#1 楼

您正在查看32位寄存器(可能在32位进程中)。由于32位处理器段寄存器很少用作偏移地址,原因很简单,32位足以表示很大的地址范围。

相反,某些段寄存器(CSSSDS)现在用于权限,内存保护和分页,而另一些段则用作通用寄存器或操作系统特定的结构(例如32位的FS) Windows和GS(在Linux和64位Windows中)。

要了解更多信息,建议您阅读有关内存保护,保护模式以及现代OS内存管理和分页的信息。

#2 楼

在保护模式下,段选择器是描述符表的索引(局部或全局索引,取决于选择器的TI位)。描述符条目描述了段的基地址,限制(大小)和其他一些属性(数据或代码,16位或32位)。有关更多信息,请参见以下链接:



全局描述符表;

内存转换和分段。

Windows通常设置选择器,以便它们将1:1直接映射到虚拟地址,这就是为什么它们都以0为底的原因。fs是个例外,因为它用于快速寻址线程信息块(TIB),每个线程独立

但是,实际上,在32位内核上,您可以使用未记录的函数NtSetLdtEntries设置自定义选择器映射。有关更多信息,请参见此处:




j00ru提供了保护模式分段作为一种强大的反调试措施。


评论


这样,您使用的段描述符包含基地址+偏移量等于线性地址,我相信如果不使用分页,它等于物理地址?对于实模式,将段选择器移位两位以获取段基地址。

–元帅
17年1月13日19:55



@ Igor Skochinsky,您可以看看我几天前在此网站上询问的问题吗?

–元帅
17年1月13日19:58