程序启动时何时以及如何设置 DS 寄存器(elf / x86)

Bob*_*421 1 x86 assembly

我正在尝试拆解一些经典程序以了解其工作原理。我有时会看到类似的东西

  MOV DWORD PTR ds:0xXXXXXX, YYYYYh
Run Code Online (Sandbox Code Playgroud)

其中 XXXXXX 是 32 位地址,YYYYY 是 32 位值

但之前没有将值放入 ds 寄存器。我在调试器中看到一个值,但我不知道她来自哪里。

这个指令会做什么?

将 YYYYY 放在 ds+0xXXXXXX 地址处?

小智 5

根据 i386 的 sysv ABI 的要求(此处为 PDF,请参阅第 3-29 页)

%cs、%ds、%es、%ss

段寄存器被初始化,以便用户进程可以使用 32 位虚拟地址来寻址代码、数据和堆栈段。更改其值的程序不符合 ABI 并且具有未定义的行为。

Linux 内核%ds在启动程序时会放入一个可用值。