История изменений
Исправление 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 или как-то так.
Тьфу-ты блин. Как-то размазанно получилось. Задавай свои ответы.