Загрузка ядра

На данный момент мы рассмотрели подсистемы ядра Linux и используемые в их операциях структуры. Каждая глава подразумевала, что подсистема была настроена и запущена, а мы фокусировались на типичном управлении подсистемами ядра и обработке их операций. Тем не менее каждая из подсистем должна быть инициализирована перед использованием. Эта инициализация происходит во время загрузки ядра, после того как загрузчик завершит загрузку образа ядра в память и передаст ему управление.
Мы выбрали путь следования процессу инициализации ядра в линейном порядке. Начнем мы с обсуждения того, что при этом происходит, начиная с включения и вызова первой архитектурно-зависимой функции, start_kernel (), и заканчивая вызовом процесса инициализации /sbin/init. Рис. 8.1 иллюстрирует порядок сообщений начиная с включения и заканчивая выключением.
Мы начнем с обсуждения BIOS и Open Firmware, являющихся первым кодом, запускаемым на системах х86 и РРС при включении соответственно. Далее мы обсудим наиболее распространенные загрузчики, используемые в Linux, и то, как они загружают ядро и передают ему управление. После этого мы подробно обсудим шаги инициализации ядра (kernel initialization), во время которой инициализируются все подсистемы. В конце инициализация ядра происходит вызов /sbin/init как процессом 1. Программа init продолжается тем, что называется инициализацией системы (system initialization), с помощью включения процессов, необходимых перед регистрацией пользователя в системе.
Вскоре станет ясно, что часть инициализации ядра состоит из вложенных инициализаций подсистем. Это затрудняет попытки проследить непрерывный процесс инициализации подсистем с начала и до конца. Тем не менее дальнейший линейный порядок загрузки ядра Linux позволяет проследить настройку подсистем ядра и по мере их появления и иллюстрирует сложность процесса загрузки.
Мы коснемся многих структур, представленных в предыдущих главах, по мере их загрузки и инициализации. Мы начнем с рассмотрения первого шага: BIOS и Open Firmware.