Linux програмування в прикладах
Linux програмування в прикладах
3.1. Адресний простір Linux/Unix
3.1. Адресний простір Linux/Unix
Як робоче визначення ми прийняли, що процес є запущеною програмою. Це означає, що операційна система завантажила файл, що виконується для цієї програми в пам'ять, зробила доступними аргументи командного рядка і змінні оточення і запустила її. Процес має п'ять виділених йому концептуально різних областей пам'яті:
Часто званасегментом текстуобласть, в якій знаходяться інструкції, що виконуються. Linux і Unix організують речі в такий спосіб, що кілька запушених екземплярів однієї програми наскільки можна розділяють свій код; У будь-який час у пам'яті знаходиться лише одна копія інструкцій однієї і тієї ж програми (Це прозоро для працюючих програм.) Частина файлу, що містить сегмент тексту, називається секцією тексту.
Статично виділені та глобальні дані, які ініціалізовані ненульовими значеннями, знаходяться в сегменті даних . У кожного процесу з однією і тією ж запущеною програмою свій власний сегмент даних. Частина файлу, що містить сегмент даних, єсекцією даних.
Ініціалізовані нулями дані[38]
Глобальні та статично виділені дані, які за умовчанням ініціалізовані нулями, зберігаються в області процесу, який називають областюBSS[39]. У кожного процесу, в якому запущена та сама програма, своя область BSS. При запуску дані BSS розміщуються в сегменті даних. У файлі вони зберігаються всекції BSS.
Формат виконуваного файлу Linux/Unix такий, що простір файлу на диску займають лише змінні, ініціалізовані ненульовимизначеннями. Тому великий масив, оголошений як 'static char somebuf[2048]; ', який автоматично заповнюється нулями, не займає 2 Кб простору на диску. (Деякі компілятори мають опції, що дозволяють вам поміщати ініціалізовані нулями дані в сегмент даних.)
Сегмент стека- це область, в якій виділяються локальні змінні. Локальними є всі змінні, оголошені всередині лівої фігурної дужки, що відкриває тіла функції (або іншої лівої фігурної дужки) і не мають ключового слова static .

Мал. 3.1. Адресний простір Linux/Unix
Таблиця 3.1. Сегменти програми, що виконується, та їх розміщення
$cc -o ch03-memaddr.с -о ch03-memaddr /* Компілювати програму */ $ls -l ch03-memaddr /* Показати загальний розмір */ -rwxr-xr-x 1 arnold devel 12320 Nov 24 16:45 ch03-memaddr $size ch03-memaddr /* Показати розміри компонентів */ text data bss dec hex filename 1458 276 8 1742 6ce ch03-memaddr $strip ch03-memaddr /* Видалити символи */ $ls -l ch03-memaddr /* Знову показати загальний розмір */ -rwxr-xr-x 1 arnold devel 3480 Nov 24 16:45 ch03-memaddr $size ch03-memaddr /* Розміри компонентів не змінилися */ text data bss dec hex filename 1458 276 8 1742 6ce ch03-memaddr
Загальний розмір завантаженого в пам'ять з файлу в 12320 байтів всього лише 1742 байта. Більшість цього місця займаютьсимволи (symbols), список імен змінних і функцій програми. (Символи не завантажуються в пам'ять під час запуску програми.) Програма strip видаляє символи з об'єктного файлу. Для великої програми це може зберегти значний дисковий простір ціною неможливості налагодження дампа ядра [40], якщо з'явиться (На сучаснихсистемах про це не варто турбуватися, не використовуйте strip .) Навіть після видалення символів файл все ще більше, ніж завантажений в пам'ять образ, оскільки формат об'єктного файлу містять додаткові дані про програму, такі, як використані бібліотеки, що розділяються, якщо вони є.[41 ]