Відповіді:
Кожен рядок /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 Регіони пам’яті