3.3.3 Карта памяти программного обеспечения

Предыдущая  Содержание  Следующая V*D*V

8 Мб SDRAM становится доступным для работы как загрузчика, так и ядра Linux. Обычно загрузчик заставляют работать с конца доступной памяти, так что как только он передаёт управление ядру Linux, оно может легко вернуть себе эту память. Если это не так, то вам, возможно, придётся использовать некоторые уловки, чтобы освободить память загрузчика, если память загрузчика не является смежной с адресным пространством Linux или если его адресное пространство располагается перед адресным пространством ядра. Настройка карты памяти Linux разделена на четыре этапа:

 

Схема памяти ядра Linux - скрипт компоновщика

Распределитель памяти при загрузке

Создание отображения памяти и ввода-вывода в виртуальное адресное пространство

Создание ядром различных зон распределения памяти

 

Схема памяти ядра Linux

 

Схема памяти ядра Linux задаётся в момент сборки ядра с помощью файла сценария компоновщика ld.script. Для архитектуры MIPS сценарием компоновщика по умолчанию является arch/mips/ld.script.in; сценарий компоновщика, предоставляемый платформой, может его переопределить. Сценарий компоновщика написан с использованием командного языка компоновщика и описывает, как должны быть упакованы различные разделы ядра и какие адреса необходимо им дать. Образец сценария компоновщика, который определяет следующее распределение памяти, можно найти в Распечатке 3.1:

 

Текстовый раздел начинается с адреса 0x8010_0000. Все другие разделы неизменно следуют за текстовым разделом. Началом текстового раздела является адрес _ftext, а концом текстового раздела является адрес _etext.

После _etext выровненное по 8 Кб пространство отведено для присвоения дескриптора процесса и стека для процесса 0, называемого также процессом подкачки.

Следующим за ним является пространство для раздела init. Адреса _init_begin и _init_end обозначают начало и конец этих разделов, соответственно.

После этого инициализируется раздел данных ядра. Символы _fdata и _edata обозначают начало и конец этих разделов, соответственно.

Последний раздел представляет собой неинициализированные данные ядра, или BSS. В отличие от других разделов, этот раздел не является частью образа ядра, а только пространством, используемым им и заданным с помощью адресов _bss_start и _end. Процедура запуска ядра использует эти символы, чтобы получить диапазон адресов BSS и обнулить пространство BSS.

 

Рисунок 3.4 показывает расположение разделов ядра, как это определено сценарием компоновщика.

 

Рисунок 3.4 Разделы образа ядра.

Рисунок 3.4 Разделы образа ядра.

 

Распределители загрузочной памяти

 

Распределители загрузочной памяти являются динамическими распределителями памяти ядра на ранних стадиях запуска ядра (до настройки подкачки); после настройки подкачки за динамическое распределение памяти несут ответственность зонные распределители. Распределители загрузочной памяти вызываются из функции setup_arch(). Распределитель загрузочной памяти работает с картой памяти платы, которая обычно передаётся загрузчиком; это обычная процедура для серии x86, и именно поэтому мы рассмотрим карту памяти, которая передаётся загрузчиком в ПК на Pentium®.

 

0000000000000000 - 000000000009f800 (используется)

000000000009f800 - 00000000000a0000 (зарезервировано)

00000000000e0000 - 0000000000100000 (зарезервировано)

0000000000100000 - 000000001f6f0000 (используется)

000000001f6f0000 - 000000001f6fb000 (данные ACPI)

000000001f6fb000 - 000000001f700000 (ACPI NVS)

000000001f700000 - 000000001f780000 (используется)

000000001f780000 - 0000000020000000 (зарезервировано)

00000000fec00000 - 00000000fec10000 (зарезервировано)

00000000fee00000 - 00000000fee01000 (зарезервировано)

00000000ff800000 - 00000000ffc00000 (зарезервировано)

00000000fffffc00 - 0000000100000000 (зарезервировано)

 

Ядро начинает использовать память с физического адреса 1 Мб. Так что распределитель загрузочной памяти резервирует следующие регионы:

 

От 640 К до 1 Мб: они зарезервированы для ПЗУ видео и расширения.

Свыше 1 Мб: они зарезервированы для кода ядра и разделов данных.

 

Настройка связи памяти и ввода-вывода

 

Это должно быть сделано на процессорах, которые не имеют включённой при сбросе виртуальной памяти. Примерами таких процессоров являются Intel и PowerPC. С другой стороны, MIPS работают после сброса в среде виртуальной памяти. Для Intel и PowerPC виртуальные отображения памяти должны быть настроены так, чтобы они могли обращаться к памяти и отображаемому на память вводу-выводу. Например, на PowerPC во время ранней стадии инициализации ядра виртуальный адрес связан с физическим адресом один к одному. Как только карта памяти стала известной, настраивается таблица виртуального отображения.

 

Настройка зонных распределителей

 

Зонные распределители делят память на три зоны:

 

Зона DMA: эта зона предназначена для распределения памяти, которую можно использовать для передач DMA. Для платформ MIPS и PowerPC в зону DMA добавляются вся динамическая нижняя память. Однако, на ПК на базе i386™ она имеет максимальный размер 16 Мб из-за ограничений адресации памяти на шине ISA.

Зона NORMAL: распределители памяти ядра пытаются выделять память из этой зоны, либо откатываются обратно к зоне DMA.

Зона HIGHMEM: многие процессоры не могут получить доступ ко всей физической памяти из-за небольшого размера линейного адресного пространства. Эта зона используется для отображения такой памяти. Она обычно не используется на встраиваемых системах и больше используется на настольных компьютерах и серверах.

 

Предыдущая  Содержание  Следующая