Что происходит после загрузки образа ядра Linux в RAM

9

Я просто хочу узнать поток действий, происходящих после загрузки образа ядра Linux в ОЗУ после процесса загрузки.

Renjith G
источник
2
Вы не должны хотеть знать это. То, что вы должны хотеть, это узнать это.
Алекс

Ответы:

15

Начиная с Linux 2.6:

ядро

После загрузки в оперативную память ядро ​​выполняет следующие функции.

setup():

  1. Постройте таблицу в RAM, описывающую расположение физической памяти.
  2. Установите задержку повторения клавиатуры и скорость.
  3. Инициализируйте карту видеоадаптера.
  4. Инициализируйте контроллер диска с параметрами жесткого диска.
  5. Проверьте шину IBM Micro Channel.
  6. Проверьте наличие указывающих устройств PS / 2 (шинная мышь).
  7. Проверьте поддержку расширенного управления питанием (APM).
  8. Если поддерживается, создайте таблицу в ОЗУ с описанием доступных жестких дисков.
  9. Если образ ядра был загружен низко в ОЗУ, переместите его в высокий.
  10. Установите контакт A20 (совместимость для древних микропроцессоров 8088).
  11. Настройте предварительную таблицу дескрипторов прерываний (IDT) и предварительную таблицу глобальных дескрипторов (GDT).
  12. Сброс модуля с плавающей запятой (FPU).
  13. Перепрограммируйте программируемые контроллеры прерываний (PIC).
  14. Переключитесь из реального в защищенный режим.

startup_32():

  1. Инициализируйте регистры сегментации и временный стек.
  2. Очистить все биты в eflagsрегистре.
  3. Заполните область неинициализированных данных нулями.
  4. Вызывает decompress_kernel()распаковку образа ядра.

startup_32() (то же имя, другая функция):

  1. Инициализируйте регистры окончательной сегментации.
  2. Заполните bssсегмент нулями.
  3. Инициализируйте временные таблицы страниц ядра.
  4. Включить подкачку
  5. Настройте стек режима ядра для процесса 0.
  6. Снова очистите все биты в eflagsрегистре.
  7. Заполните IDT нулевыми обработчиками прерываний.
  8. Инициализируйте первый фрейм страницы с параметрами системы.
  9. Определите модель процессора.
  10. Инициализируйте регистры с адресами GDT и IDT.

start_kernel(): Почти каждый компонент ядра инициализируется этой функцией, это только несколько.

  • планировщик
  • Зоны памяти
  • Распределитель системы друзей
  • IDT
  • SoftIRQs
  • Дата и время
  • Распределитель плиты
  • Создать процесс 1 ( /sbin/init)

Полный «список» доступен в источниках на linux / init / main.c

В этом

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

Введите runlevelв консоль, это даст вам текущий уровень выполнения вашей системы.

Посмотрите на /etc/rcX.d/(или /etc/rc.d/rcX.d/), заменив X вашим уровнем запуска.
Это символические ссылки, упорядоченные по приоритету выполнения. S01....означает, что эти сценарии запускаются очень рано, а S99....запускаются в самом конце процесса загрузки. В KXX....симлинке сделать то же , но для последовательности останова.

Как правило, эти сценарии обрабатывают диски, сети, ведение журналов, управление устройствами, специальные драйверы, среду и многие другие необходимые последовательности.

шутник
источник
LXR - хороший интерфейс для чтения исходного кода ядра Linux. Хороший список, хотя имейте в виду, что многое зависит от архитектуры (это версия для ПК).
Жиль "ТАК - перестань быть злым"
1
  • Ядро берет на себя управление системой H / W, как только вы видите «Uncompressing Linux ..».
  • Ядро проверяет и устанавливает в BIOS регистры видеокарт и формат вывода экрана.
  • Затем ядро ​​считывает настройки BIOS и инициализирует основные аппаратные интерфейсы.
  • Затем драйверы в ядре инициализируют оборудование.
  • Тогда ядро ​​проверит на разделы
  • Затем он монтирует корневую файловую систему.
  • Затем ядро ​​запускает init, который загружает основную систему со всеми ее программами и конфигурациями.
сен
источник
0

Загрузчик переходит к точке входа образа, передавая командную строку ядра (если есть), а ядро ​​обрабатывает все остальное.

Алекс
источник