Хрестоматия по программированию на Си в Unix


Послуги адвоката еще здесь. | керамогранит купить в интернет-магазине. |

Системные вызовы и взаимодействие с UNIX. Хрестоматия по программированию на Си в Unix


Жизнь процессов.

6.5.1. Какие классы памяти имеют данные, в каких сегментах программы они расположены?

char x[] = "hello"; int y[25]; char *p; main(){ int z = 12; int v; static int w = 25; static int q; char s[20]; char *pp; ... v = w + z; /* #1 */ }

Ответ:

Переменная Класс памяти Сегмент Начальное значение x static data/DATA "hello" y static data/BSS {0, ..., 0} p static data/BSS NULL z auto stack 12 v auto stack не определено w static data/DATA 25 q static data/BSS 0 s auto stack не определено pp auto stack не определено main static text/TEXT

Большими буквами обозначены сегменты, хранимые в выполняемом файле:

DATA - это инициализированные статические данные (которым присвоены начальные значения). Они помещаются компилятором в файл в виде готовых констант, а при запуске программы (при ее загрузке в память машины), просто копируются в память из файла.

BSS (Block Started by Symbol) - неинициализированные статические данные. Они по умолчанию имеют начальное значение 0 (NULL, "", '\0'). Эта память расписывается нулями при запуске программы, а в файле хранится лишь ее размер.

TEXT - сегмент, содержащий машинные команды (код).

Хранящаяся в файле выполняемая программа имеет также заголовок - в нем в частности содержатся размеры перечисленных сегментов и их местоположение в файле; и еще - в самом конце файла - таблицу имен. В ней содержатся имена всех функций и переменных, используемых в программе, и их адреса. Эта таблица используется отладчиками adb и sdb, а также при сборке программы из нескольких объектных файлов программой ld. Просмотреть ее можно командой

nm имяФайла

Для экономии дискового пространства эту таблицу часто удаляют, что делается командой

strip имяФайла

Размеры сегментов можно узнать командой

size имяФайла

Программа, загруженная в память компьютера (т.е. процесс), состоит из 3x сегментов, относящихся непосредственно к программе:

stack

- стек для локальных переменных функций (автоматических переменных). Этот сегмент существует только у выполняющейся программы, поскольку отведение памяти в стеке производится выполнением некоторых машинных команд (поэтому описание автоматических переменных в Си - это на самом деле выполняемые операторы, хотя и не с точки зрения языка). Сегмент стека автоматически растет по мере надобности (если мы вызываем новые и новые функции, отводящие переменные в стеке). За этим следит аппаратура диспетчера памяти.




Содержание  Назад  Вперед