据我所知,这些段是extrageneral。但是它们实际上指向程序存储器的哪一部分?如果我对它的理解不正确,则DS在转储的入口点插入,SS表示Stack,这是英特尔构想中的剩余物。


这些是我使用Ollydbg的寄存器,如何我可以预测将移入EAX的内容吗?

MOV EAX, DWORD PTR FS:[0]


#1 楼

在x86 32位窗口上,FS段寄存器指向一种称为线程信息块或TIB的结构。此结构由内核在创建线程时创建,用于支持与操作系统相关的功能,服务和API。

数据TIB用法的示例如下:


线程本地存储。
堆。
堆栈。
SEH异常链。
访问流程环境块(具有类似的流程级别目标)。 >
还有许多其他...

要预测对FS寄存器的取消引用的实际值,您需要参考该结构(仅部分记录)的映射。您正在使用的特定操作系统版本。例如,我前面提到的TIB维基百科页面描述了32位Windows TIB布局。

在Linux上,无论寄存器大小如何,GS寄存器都用于类似目的,而64位intel窗口同时使用FSGS寄存器。

存储在TIB中的信息不应直接由程序使用,无论如何将结构的特定成员经常用于意外目的,例如以更普遍的方式检测调试器。

您可以看到,很少使用其他段寄存器。

一些历史记录

尽管段寄存器用于与OS相关的功能,但这并不是目标段寄存器的目的。过去,当CPU寄存器大小在8位和16位之间变化时,寻址受到很大限制,并且只有64KB的地址空间可用。由于原始CPU仅在实模式(而非保护模式)下运行,因此该地址空间必须与所有正在运行的服务,进程,连接的外围设备等共享...

为了绕过该限制,以两种形式使用了内存分段。一个是保护模式VS实模式,另一个是段寄存器-用作用于寻址的实际寄存器的偏移量。这极大地增加了寻址的热情,并被认为是有效的解决方案。在32位保护模式处理器的时代,每个进程都可以使用4GB的虚拟可寻址空间,当然在64位CPU上,段寄存器很少用于其最初的目标(高度底层组件(如实模式启动)除外)加载程序,可能仍需要额外的寻址。)

PS

DS代表数据选择器。

评论


感谢您的解释,现在细分的概念对我来说更加清晰了。

– Erexo
17年9月13日在20:29

段选择器还有另一面,我不想介绍,因为您的问题本质上是关于FS寄存器的。如今,段寄存器仍用于权限和内存管理。这对于理解英特尔架构家族的内存管理非常重要,但与您的问题并不真正相关,您可以在此处阅读有关内容:en.wikipedia.org/wiki/Global_Descriptor_Table

– NirIzr
17年9月13日在20:39