Відповіді:
Кожен рядок /proc/$PID/maps
описує область суміжної віртуальної пам'яті в процесі або потоці. Кожен рядок має такі поля:
address perms offset dev inode pathname
08048000-08056000 r-xp 00000000 03:0c 64593 /usr/sbin/gpm
-
замість r
/ w
/ з'явиться повідомлення x
. Якщо регіон не є спільним , він є приватним , тому p
замість an з’явиться повідомлення s
. Якщо процес намагається отримати доступ до пам'яті способом, який не дозволений, генерується помилка сегментації. Дозволи можна змінити за допомогою mprotect
системного виклику.mmap
), це зсув у файлі, де починається зіставлення. Якщо пам'ять не була відображена з файлу, це просто 0.[heap]
, [stack]
або [vdso]
. [vdso]
означає віртуальний динамічний спільний об'єкт. Він використовується системними дзвінками для переходу в режим ядра. Ось хороша стаття про це: "Що таке linux-gate.so.1?"Можливо, ви помітите багато анонімних регіонів. Зазвичай вони створюються, mmap
але не додаються до жодного файлу. Вони використовуються для багатьох інших речей, таких як спільна пам'ять або буфери, не виділені на купі. Наприклад, я думаю, що бібліотека pthread використовує анонімні відображені регіони як стеки для нових потоків.
gpm
- це відображення бінарного файлу за якоюсь віртуальною адресою з самого початку, із заголовком ELF тощо? Чи не завантажувач повинен розбирати заголовок ELF і відображати окремі розділи, а не весь файл?
Перевірте: http://man7.org/linux/man-pages/man5/proc.5.html
address perms offset dev inode pathname
00400000-00452000 r-xp 00000000 08:02 173521 /usr/bin/dbus-daemon
Поле адреси - це адресний простір у процесі, який займає відображення.
Поле perms - це набір дозволів:
r = read
w = write
x = execute
s = shared
p = private (copy on write)
Поле зміщення - це зміщення у файл / що завгодно;
dev - пристрій (основний: мінор);
inode - це inode на цьому пристрої.0 вказує на те, що жоден inode не асоціюється з областю пам'яті, як це було б у випадку з BSS (неініціалізовані дані).
Поле імені шляху зазвичай являє собою файл, який підтримує відображення. Для файлів ELF ви можете легко узгодити поле зсуву, переглянувши поле Зміщення у заголовках програми ELF (readelf -l).
У Linux 2.0 немає поля, що дає ім'я шляху.
proc(5)
mmap(2)
"Розуміння ядра Linux" 9.3. Регіони пам'яті; 16.2. Картографування пам’яті «Розуміння диспетчера віртуальної пам’яті Linux» 4.4 Регіони пам’яті