【问题标题】:Virtual Address of process in Linux64/x86_64 machineLinux64/x86_64机器中进程的虚拟地址
【发布时间】:2020-07-13 23:49:35
【问题描述】:

我有两个关于进程地址映射的问题;

  1. 我知道在32位Linux机器中,一个进程的虚拟地址分为两个,3GB用于Userspace,1GB用于Krnel。 x86_64/Linux 64 机器是一样的吗?
  2. linux 可执行文件的 objdump 显示 _init 大约从地址 0x400000 开始。为什么exe地址从0x400000左右开始?
bash-4.2$ objdump -S a.out
       a.out:     file format elf64-x86-64
       Disassembly of section .init:
       0000000000400390 <_init>:
       400390:       48 83 ec 08             sub    $0x8,%rsp

下面显示了相同 a.out 的 pmap 输出。这里的映射也从0000000000400000(即4MB)开始。那么直到 4MB 的虚拟内存在哪里使用呢?

bash-4.2$ pmap 95297
95297:   ./a.out
0000000000400000      4K r-x-- a.out
0000000000600000      4K r---- a.out
0000000000601000      4K rw--- a.out
00007fdfd0f37000   1800K r-x-- libc-2.17.so
00007fdfd10f9000   2048K ----- libc-2.17.so
00007fdfd12f9000     16K r---- libc-2.17.so
00007fdfd12fd000      8K rw--- libc-2.17.so
00007fdfd12ff000     20K rw---   [ anon ]
00007fdfd1304000    136K r-x-- ld-2.17.so
00007fdfd1506000     12K rw---   [ anon ]
00007fdfd1524000      4K rw---   [ anon ]
00007fdfd1525000      4K r---- ld-2.17.so
00007fdfd1526000      4K rw--- ld-2.17.so
00007fdfd1527000      4K rw---   [ anon ]
00007fff09042000    132K rw---   [ stack ]
00007fff091c3000      8K r-x--   [ anon ]
ffffffffff600000      4K r-x--   [ anon ]
 total             4212K

【问题讨论】:

标签: linux linux-kernel memory-address virtual-address-space


【解决方案1】:

在 x86_64 上,虚拟地址空间是 48 位(只有 64 位地址到 17 位全为 0 或全为 1 才有效),而在 linux 上则分为两半——用户为 128TB,内核为 128TB。

在这 128TB 的用户空间中,堆栈被放置在随机选择的高地址(因此通常以 00007fff 开头),而可执行文件位于低地址。然后,共享库通常会加载到堆栈下方的某个位置(也有些随机)。选择的精确地址是随机的,以使其更难利用安全漏洞。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 2011-12-27
    相关资源
    最近更新 更多