LINUX.ORG.RU

История изменений

Исправление ziemin, (текущая версия) :

Подойди к вопросу со стороны «железа».

Рассмотрим процесс загрузки. Кстати тут очень важно понять, что программа не сама запускается, а её запускают!

То, как система шарит по диску, проверяет, что файл исполняемый, сверяет всякие контрольные суммы мы опустим.

Сначала в дело вступает загрузчик. Он парсит заголовок исполняемого файла (в случае очень древнего «прямого» формата coff создаёт). Оттуда он выясняет, из каких секций состоит программа. И резервирует под них память

Далее начинается встроенный загрузчик самой программы (это всё происходит ДО работы программы).

Он дополнительно выделяет память и инициализирует секции.

Секции бывают разные. В Фон-Неймовской архитектуры данные и код это одно и тоже. Проще говоря ячейке памяти всё равно, что в ней находится: код или просто число.

Но, для упрощения файл всё-таки делят на секции кода. Плюс в 86 (и других) процах можно установить у памяти признак исполняемости.

Но! Данные бывают разные. Например ты можешь замутить массив чисел в программе. Я имею в виду реально ввести в программу числа. Например:

const double data[] = { 3.14, 2.7, 1.6 ........};

Это инициализированные данные (уже подраздел данных).

А можешь замутить данные, которые «не требуют инициализации». Проще говоря есть соглашение, что по-умолчанию (это 0).

Таким образом возникает ещё одно деление. Отдельно идут неинициализированные данные, которые установишь ты. Компилятор не дурак и два раза работу делать не будет.

Теперь переходим к работе твоей программы. Код уже проинициализирован на нескольких уровнях (но и на разных сегмента). Однако для работы требуется стек.

Каждый раз, когда ты вызываешь в коде функцию, в стек запихивается адрес возврата. Кроме того на такой архитектуре туда же и пихаются локальные переменные (есть архитектуры с отдельным стеком данных).

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

Тьфу-ты блин. Как-то размазанно получилось. Задавай свои ответы.

Исходная версия ziemin, :

Подойди к вопросу со стороны «железа».

Рассмотрим процесс загрузки. Кстати тут очень важно понять, что программа не сама запускается, а её запускают!

То, как система шарит по диску, проверяет, что файл исполняемый, сверяет всякие контрольные суммы мы опустим.

Сначала в дело вступает загрузчик. Он парсит заголовок исполняемого файла (в случае очень древнего «прямого» формата coff создаёт). Оттуда он выясняет, из каких секций состоит программа. И резервирует под них память

Далее начинается встроенный загрузчик самой программы (это всё происходит ДО работы программы).

Он дополнительно выделяет память и инициализирует секции.

Секции бывают разные. В Фон-Неймовской архитектуры данные и код это одно и тоже. Проще говоря ячейке памяти всё равно, что в ней находится: код или просто число.

Но, для упрощения файл всё-таки делят на секции кода. Плюс в 86 (и других) процах можно установить у памяти признак исполняемости.

Но! Данные бывают разные. Например ты можешь замутить массив чисел в программе. Я имею в виду реально ввести в программу числа. Например:

const int data[] = { 3.14, 2.7, 1.6 ........};

Это инициализированные данные (уже подраздел данных).

А можешь замутить данные, которые «не требуют инициализации». Проще говоря есть соглашение, что по-умолчанию (это 0).

Таким образом возникает ещё одно деление. Отдельно идут неинициализированные данные, которые установишь ты. Компилятор не дурак и два раза работу делать не будет.

Теперь переходим к работе твоей программы. Код уже проинициализирован на нескольких уровнях (но и на разных сегмента). Однако для работы требуется стек.

Каждый раз, когда ты вызываешь в коде функцию, в стек запихивается адрес возврата. Кроме того на такой архитектуре туда же и пихаются локальные переменные (есть архитектуры с отдельным стеком данных).

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

Тьфу-ты блин. Как-то размазанно получилось. Задавай свои ответы.