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