Создание образа памяти Linux

Вопрос или проблема

Я изучаю процесс запуска Linux от вызова из BIOS до момента start_kernel. Чтобы предвосхитить мой вопрос и дать немного информации для лучшего понимания, сначала важно понять, как располагается память. Процессор стартует в «реальном режиме», что означает отсутствие виртуальной памяти. Адресное пространство чипа, выполняющего код, обычно составляет 1 Мб. Это показано ниже. Существует сектор (512 байт) для программы BIOS, затем MBR (главная загрузочная запись). Есть немного места для большего объема MBR/BIOS. Затем с адреса 0x001000 начинается загрузчик. (короче говоря, прокрутите вниз, чтобы увидеть краткие вопросы)
Стек выполнения в реальном режиме

Я изучал дерево исходников в течение недели или двух и разобрался с большей частью информации. Я уверен, что в определенном специальном месте хранится образ загрузчика, который загружается BIOS, когда выбирается ОС. Этот образ представляет собой ассемблерный код, определенный в файлах arch/x86/boot/compressed/head_64.S и arch/x86/boot/header.S, а также другие ассемблерные определения, необходимые для запуска рутин для запуска ядра.

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

То, что определяет порядок выполнения всех рутин, ассемблера, скомпилированного кода и определений в этом образе, — это определенный специальный файл под названием vmlinux.lds.S.

Если вы внимательно посмотрите на этот файл, arch/x86/boot/compressed/vmlinux.lds.S, то увидите, что он содержит множество определений и макросов, которые он использует для составления ассемблерного файла. Например, ENTRY(startup_32) на линии 16. Я искал это определение макроса в дереве исходников и не могу его найти. Я не могу найти ни одного из макросов, определенных в файле vmlinux.lds.S.

Мое первое предположение заключается в том, что они определены в файле, включенном на линии 2: #include <asm-generic/vmlinux.lds.h>.

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

У меня есть 2 вопроса:

  1. Исполняется ли этот (vmlinux.lds.S) ассемблер во время компиляции, чтобы разместить компоненты в правильных местах или это первый набор ассемблерных инструкций, исполняемый, хранящийся в месте, на которое указывает указатель MBR?

  2. Откуда берутся определения макросов, если этот файл vmlinux.lds.S исполняется во время выполнения?

.

Ответ или решение

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

Теория

При загрузке компьютера процессор сначала находится в так называемом "реальном режиме". В этом режиме доступная память ограничена 1 МБ, и процессор обращается напрямую к физической памяти, без использования страничной адресации. Процесс загрузки начинается с работы BIOS, который инициализирует основные компоненты системы и определяет устройство, с которого будет загружена операционная система. BIOS загружает первый сектор отведенного устройства, который является мастер-загрузочной записью (MBR), в память, и передает управление этой программе.

Основную функцию загрузки операционной системы выполняет загрузчик (bootloader). В контексте Linux это обычно GRUB или другой загрузчик, который отвечает за инициализацию системы и загрузку ядра Linux в оперативную память.

Пример

В процессе загрузки ядра Linux, определённый порядок выполнения кода и сборка всех необходимых частей управляются с помощью скриптов компоновщика, таких как vmlinux.lds.S. Этот файл используется на этапе компоновки и определяет, какие участки кода и данных загружаются в какую часть виртуального адресного пространства, когда компилируется исполняемый файл ядра (vmlinuz).

Файл arch/x86/boot/compressed/vmlinux.lds.S не является исполняемым кодом в традиционном смысле и не выполняется на этапе времени выполнения; это скрипт, который используется на этапе сборки для определения структуры исполняемого файла. Макросы, которые могут казаться отсутствующими, вероятно линкуются на этапе обработки предкомпилятора из других файлов заголовков, таких как <asm-generic/vmlinux.lds.h>.

Применение

Теперь давайте рассмотрим ваши вопросы:

  1. Собственно о vmlinux.lds.S:

    Этот файл не является первым набором инструкций, выполняемых процессором при загрузке системы. Он служит на этапе сборки для определения расположения различных сегментов кода и данных в загружаемом образом ядра. Таким образом, vmlinux.lds.S не исполняется на этапе времени выполнения; он используется для организации исполняемого файла заранее.

  2. Определения макросов:

    Макросы, которые вы не смогли найти, вероятно, определены в другом месте исходного кода ядра или в файлах заголовков, которые включаются при сборке ядра. Включение файлов, как например #include <asm-generic/vmlinux.lds.h>, добавляет код из других частей проекта, и, возможно, это в этих файлах определены искомые макросы. Часто встречающаяся практика в больших проектах, таких как ядро Linux, заключается в разбиении кода на многочисленные файлы с целью облегчения управления и понимания процесса сборки.

Заключение

Подведем итог: vmlinux.lds.S играет ключевую роль на этапе сборки ядра Linux, определяя структуру конечного исполняемого файла, но не исполняется напрямую на реальном оборудовании. Макросы и другие определения, вероятно, происхоят из сборочных процессов и заголовочных файлов, включаемых в проект на этапе подготовки сборки. Процесс сборки ядра достаточно сложен и требует понимания взаимодействия многих его компонентов, но он также очень гибок и позволяет разработчикам создавать точные и оптимизированные сборки для специфичных аппаратных конфигураций и нужд.

Оцените материал
Добавить комментарий

Капча загружается...