Я хотел, знают, как ядро обеспечивает память для простой программы C.
Например:
#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 ;
}
Посмотрите В этой программе, которую я использовал статичный, глобальный и malloc для выделения динамической памяти Так, как память размечает, будет...? Любой дает мне URL, который будет иметь, имеют подробную информацию об этом процессе..
По сути, в программах на C, созданных для целевого формата ELF (исполняемый и связываемый формат), таких как программы, построенные на Linux, создается стандартная структура памяти. Подобные макеты, вероятно, существуют для других архитектур, но я недостаточно знаю, чтобы рассказать вам о них больше.
Есть некоторые разделы глобальных данных, которые инициализируются в младших адресах памяти в памяти (например, разделы для текущего исполняемого кода, глобальные данные и любые строки, созданные с помощью ".. . "
внутри вашего кода C).
Ниже находится куча открытой памяти, которую можно использовать. Размер этой кучи автоматически увеличивается по мере того, как вызовы malloc и free перемещают то, что называется «остановкой программы», по более высоким адресам в памяти.
Начиная с старшего адреса в памяти, стек увеличивается в сторону младших адресов.Стек содержит память для любых локально распределенных переменных, например, в верхней части функций или в области видимости ( {...}
).
Хорошее описание работающей программы ELF можно найти здесь , а более подробную информацию о самом формате можно найти в статье в Википедии . Если вам нужен пример того, как компилятор переводит код C в сборку, вы можете посмотреть GCC, в их Internals Manual есть кое-что интересное; наиболее важные разделы, вероятно, находятся в главе 17, особенно 17.10, 17.19 и 17.21. Наконец, Intel имеет много информации о структуре памяти в ее IA-32 Architectures Software Developer's Manual . В нем описывается, как процессоры Intel обрабатывают сегментацию памяти, создание стеков и тому подобное. Подробностей об ELF нет, но можно увидеть, где они совпадают. Наиболее полезными являются, вероятно, раздел 3.3 тома 1: Базовая архитектура и глава 3 тома 3A: Руководство по системному программированию, часть 1.
Я надеюсь, что это поможет любому, кто погрузится во внутреннее устройство выполнения программ на языке C, удачи.
Краткое обсуждение в википедии .
Немного более подробное введение здесь .
Более подробная информация доступна здесь , но я не уверен, что она представлена очень хорошо.