Виртуальный адрес процесса в Linux64 / x86_64 машине - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть два вопроса, связанных с картой адресов процессов;

  1. Я знаю, что на 32-битной машине Linux виртуальный адрес процесса делится на два, 3 ГБ для пространства пользователя и 1 ГБ для Крнел. То же самое для машины x86_64 / Linux 64?
  2. Objdump исполняемого файла linux показывает, что _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

Ниже показан вывод pmap того же a.out. Здесь также отображение начинается с 0000000000400000 (т.е. 4 МБ). Где же тогда используется виртуальная память до 4 МБ?

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

1 Ответ

0 голосов
/ 02 апреля 2020

На x86_64 виртуальное адресное пространство составляет 48 бит (допустимы только 64-битные адреса с до 17 бит, все 0 или все 1), а на linux, который делится пополам - 128 ТБ для пользователя и 128 ТБ для kernel.

В этом 128 ТБ пространства пользователя стек размещается по произвольно выбранному старшему адресу (как правило, что-то, начинающееся с 00007fff), а исполняемый файл - по низкому адресу. Общие библиотеки затем обычно загружаются где-то ниже стека (также несколько рандомизированные). Точные выбранные адреса рандомизируются, чтобы затруднить использование ошибок безопасности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...