Разработка ядра Linux
Шрифт:
• Отображение выполняемого кода из выполняемого файла в область памяти процесса, которая называется сегментом кода (text section).
• Отображение инициализированных переменных из выполняемого файла в область памяти процесса, которая называется сегментом данных (data section).
• Отображение страницы памяти, заполненной нулями, в область памяти процесса, которая содержит неинициализированные глобальные переменные и называется сегментом bss [79] (bss section).
79
Термин "BSS" сложился исторически и является достаточно старым. Он означает block started by symbol (блок, начинающийся с символа). Неинициализированные переменные в выполняемом файле не хранятся, поскольку с ними не связано никакого значения. Тем не менее стандарт языка С требует, чтобы неинициализированным переменным присваивалось определенное значение по умолчанию (обычно все заполняется нулями). Поэтому ядро загружает переменные (без их значений) из выполняемого файла в память и отображает в эту память нулевую страницу, тем самым переменным присваивается нулевое значение без необходимости зря тратить место в объектном файле на ненужную инициализацию.
• Отображение страницы памяти, заполненной нулями, в память процесса, которая используется в качестве стека процесса пространства пользователя (не нужно путать со стеком процесса в пространстве ядра, который является отдельной структурой данных и управляется и используется ядром).
• Дополнительные сегменты кода, данных и BSS каждой совместно используемой библиотеки, таких как библиотека libc и динамический компоновщик, которые загружаются в адресное пространство процесса.
• Все файлы, содержимое которых отображено в память.
• Все области совместно используемой памяти.
• Все анонимные отображения в память, как, например, связанные с функцией
Каждое действительное значение адреса памяти в адресном пространстве процесса принадлежит только и только одной области памяти (области памяти не перекрываются). Как будет показано, для каждого отдельного участка памяти в выполняющемся процессе существует своя область: стек, объектный код, глобальные переменные, отображенный в память файл и т.д.
80
В более новых версиях библиотеки glibc функция
Дескриптор памяти
Ядро представляет адресное пространство процесса в виде структуры данных, которая называется дескриптором памяти. Эта структура содержит всю информацию, которая относится к адресному пространству процесса. Дескриптор памяти представляется с помощью структуры
Рассмотрим эту структуру с комментариями, поясняющими назначение каждого поля.
81
Между дескриптором процесса, дескриптором
памяти и соответствующими функциями существует тесная связь. Поэтому структура