C: расположение памяти выполнения программы на C - PullRequest
4 голосов
/ 20 марта 2010

Я хотел знать, как ядро ​​предоставляет память для простой программы на Си.

Например:

#include<stdio.h> 
#include<malloc.h> 
int my_global = 10 ; 
main() 
{ 
char *str ; 
static int val ; 
str = ( char *) malloc ( 100 ) ; 
scanf  ( "%s" , str ) ;
printf( " val:%s\n",str ) ;
free(str) ;
return 1 ;
}

Смотрите, в этой программе я использовал static, global и malloc для выделения динамической памяти. Итак, как будет выкладываться память ...? Любой дает мне URL, который будет иметь подробную информацию об этом процессе.

Ответы [ 5 ]

6 голосов
/ 20 марта 2010

По сути, в программах на C, предназначенных для работы с ELF (исполняемым и связываемым форматом), таких как программы, основанные на linux, создается стандартная схема памяти. Подобные макеты, вероятно, существуют для других архитектур, но я не знаю достаточно, чтобы рассказать вам больше о них.

Макет:

Существуют некоторые разделы глобальных данных, которые инициализируются в памяти по низким адресам памяти (например, разделы для исполняемого в настоящее время кода, глобальные данные и любые строки, созданные с помощью "..." внутри вашего кода C).

Ниже есть куча открытой памяти, которую можно использовать. Размер этой кучи автоматически увеличивается по мере обращения к malloc и свободного перемещения так называемого «разрыва программы» на более высокие адреса в памяти.

Начиная с высокого адреса в памяти, стек увеличивается в сторону более низких адресов. Стек содержит память для любых локально распределенных переменных, таких как те, что находятся вверху функций или в области ({ ... }).

Подробнее:

Хорошее описание работающей программы ELF здесь и более подробную информацию о самом формате можно найти в статье Википедии . Если вам нужен пример того, как компилятор выполняет преобразование кода C в сборку, вы можете взглянуть на GCC, в его Internals Manual есть некоторые интересные вещи; Наиболее значимыми являются, вероятно, разделы в главе 17, особенно 17.10, 17.19 и 17.21. Наконец, Intel имеет много информации о разметке памяти в Руководстве разработчика программного обеспечения IA-32 Architectures. Он описывает, как процессоры Intel обрабатывают сегментацию памяти и создают стеки и тому подобное. Там нет никаких подробностей об ELF, но можно увидеть, где они совпадают. Наиболее полезными являются, вероятно, раздел 3.3 тома 1: Базовая архитектура и глава 3 тома 3А: Руководство по системному программированию, часть 1.

Надеюсь, это поможет любому окунуться во внутренности запуска программ на С, удачи.

1 голос
/ 24 сентября 2012

Все статические и глобальные переменные хранятся в сегменте данных, все автоматические и временные переменные хранятся в стеке, а все динамические переменные хранятся в куче.

Все параметры функции хранятся в стеке, и для каждого вызова функции существует отдельный кадр стека, так работает рекурсивная функция.

Подробнее об этом см. этот сайт .

1 голос
/ 20 марта 2010

Есть краткое обсуждение в Википедии .

Чуть более длинное введение - здесь .

Более подробная информация доступна здесь , но я не уверен, что он представлен очень хорошо.

0 голосов
/ 30 мая 2018
  • все статические и глобальные неинициализированные переменные переходят в bss (блок начинается с символа).
  • все Инициализированные глобальные / локальные / статические переменные делятся на

только для чтения

const int x = 10;

& чтение / запись

char Str [] = "StackOverFlow"

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

  • Текстовый сегмент содержит исполняемые инструкции вашей C-программы, также называемый сегментом кода. Это представление машинного языка выполняемых шагов программы, включая все функции, составляющие программу, как пользовательские, так и системные. Сегмент текста доступен для совместного использования, поэтому в памяти должна находиться только одна копия для различных исполняемых программ, таких как текстовые редакторы, оболочки и т. Д. Обычно текстовый сегмент доступен только для чтения, чтобы программа не могла случайно изменить свои инструкции.

  • еще одна область в структуре памяти программы - это Unmapped или зарезервированный сегмент, содержащий аргументы командной строки и другие данные, относящиеся к программе, такие как более низкий адрес-адрес исполняемого образа и т. Д.
0 голосов
/ 02 декабря 2015

Практически, когда вы запускаете любую C-программу, ее исполняемый образ загружается в RAM компьютера организованным способом, который называется адресным пространством процесса или структурой памяти C-программы.

http://www.firmcodes.com/memory-layout-c-program-2/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...