extra
或general
。但是它们实际上指向程序存储器的哪一部分?如果我对它的理解不正确,则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窗口同时使用FS
和GS
寄存器。存储在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