Linux64 / x86_64计算机中的进程虚拟地址

问题描述 投票:0回答:1

我有两个与过程地址图有关的问题;

  1. 我知道在32位Linux机器中,进程的虚拟地址分为两个,用户空间3GB,内核Krnel 1GB。 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.ou​​t的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个回答
0
投票

[在x86_64上,虚拟地址空间为48位(只有具有17位全0或全1的64位地址有效,而在Linux上分为两半-用户为128TB,内核为128TB)。 >

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

© www.soinside.com 2019 - 2024. All rights reserved.