Говоря о запуске операционной системы и инициализации ядра

Операционная система
Говоря о запуске операционной системы и инициализации ядра

В замешательстве идите в сторону энтузиазма.

загрузка BIOS

Когда вы нажимаете кнопку питания, ваша материнская плата начинает включаться.Когда питание только что включено, компьютер выполнит некоторую работу по инициализации регистров, напримерCS代码段寄存器Установить как0xFFFF,БудуIP指令寄存器Установить как0x0000, так что наша первая инструкция будет указывать на0xFFFF0,тогдаCPUВыполните эту инструкцию, содержание этой инструкции очень простое, то есть перейти в указанную позицию для выполненияBIOSработа по инициализации.

Итак, где именно находится так называемое назначенное место? Это изреальный режимНачни говорить.

Так называемый реальный режим.режим реального адреса(используется физический адрес), я проверил некоторую информацию и обнаружил, что эта штука очень странная. для раннегоCPUОн был разработан из битов 16. Что означает понятие битов 16? мы знаемCPUи память надо пройтиавтобусдля общения (конечно сейчас мобильныйARMструктура может быть разной). для шестнадцатиCPU, то есть его регистр 16 бит (конечно, не обязательно говоритьCPUКоличество бит определяет количество битов всех регистров, что можно понять здесь до поры до времени). Для 16-битных регистров он может хранить только2^16 = 65536Такое большое число, значит, мы можем хранить адрес памяти максимум только через регистр.65536байты, то есть64KB, что означает, что память только64KB?

И настоящие адреса, о которых мы говорим,1MBАх, как это произошло?

Причина в том,CPUМежду памятью и памятью 20 шин, чтобы воспользоваться дополнительными 4, люди используютдва регистра для представления адреса, то что я сказал вышеCSа такжеIP. И как использовать два регистра16+16=32位представлять 20-битный адрес? Подумайте о двух вышеупомянутых регистрах0xFFFFа также0x0000как это вышло0xFFFF0из?CSотносится к сегментному регистру, аIPОн относится к регистру смещения (назовем его так), а адрес, представленный комбинацией этих двух, —базовый адрес сегмента . Таким образом, мы можем иметь двадцатибитную адресацию, т.е.1MB.

Поговорив о происхождении реального режима, давайте продолжим смотреть, что означает указанное местоположение в первом абзаце. теперь у нас есть1MBобъем памяти, так как же мы его используем? Сначала мы должны начатьBIOSНу, это программа, которая должна занимать память, тогда мы даемBIOSВыделить память. Так мы выделяем блок памятиROMобласть для картыBIOSизROM.

Затем мы начинаем бежатьBIOSпрограмма, перваяBIOSСначала проверьте, не неисправно ли оборудование вокруг вас (т.POSTСООБЩЕНИЕ). если вы когда-либо входилиBIOSинтерфейс, вы обнаружите, что можете получить аппаратные данные, такие как память, процессор, жесткий диск и т. д.

Затем выполните прерывание распределения,IOпорт,DMAресурсы и т. д. В настоящее время таблица векторов прерываний и процедура обслуживания прерываний будут созданы в основном для пользователей, выполняющих операции с клавиатурой и мышью.

Например, когда мы переустанавливаем систему, нам нужно ввестиBIOSКогда интерфейс включен, вам нужно нажать определенную клавишу на клавиатуре в течение нескольких секунд загрузки.Несколько секунд в середине на самом делеBIOSВо время POST (некоторые материнские платы могутPOSTзадержка), если по истечении этих секунд вы не решите войтиBIOS,ТакBIOSПункт запуска по умолчанию будет загружен, который такжеBIOSПоследнее задание,То есть выберите загрузочное устройство для запуска его引导程序boot.

ТакBIOSКак определить расположение загрузчика? это сказатьЗагрузочный диск(MBR)Загрузочный диск в целомПервый сектор занимает 512 байт и начинается с0xAA55конец. когдаBIOSкогда условия считаются выполненнымипередать права процессора на программу, то есть скопировать данные загрузочного диска в физическую память (обратите внимание, что мы все еще находимся в режиме реального адреса, поэтому используется адрес физической памяти)0x7c00место, тоПрыгатьзадавать0x7c00выполнять.

Работа загрузчика

упомянутый вышеboot引导程序Там всего 512 байт (на самом деле 510 байт, кроме конечной метки), что можно сделать с таким большим размером? Ну ничего не могу сделать. Вы понимаете, что загрузка операционной системы — это старт ракеты, требующий поуровневого бустера, иbootявляется одним из них.

Так называемый бустер - это загрузка через него других загрузочных программ, достаточно взятьGRUB (一种操作系统启动管理器)Например, 510 байт не могут быть загружены всеGRUB, и что делается в этих 510 байтахЗагрузите второй загрузчик.

А в это время следует рассмотреть еще одну проблему. Предположим, вы сейчасbootразработчик программы, которую вы хотите использоватьbootзагрузитьloaderпрограммы (то есть второго загрузчика), то один из способов -loaderтак же какbootпоместите его в указанное физическое место на диске, а затем жестко закодируйте это физическое место вbootпрограмма. Несомненно, это обязательно принесет много проблем, таких как жестко запрограммированное сравнение путейжесткий и негибкий, что требуется без поддержки файловой системыУбедитесь, что последующие программы расположены на диске непрерывно.. Конечно, это тоже метод, который обычно использовался в первые дни.LILOЗагрузчик так и делает.

Вместо того, чтобы все время терпеть эту жестко запрограммированную муку и боль, лучше иметь долгую боль, чем короткую, я могу прямоbootпрограммаСоздайте простую файловую систему,а такжеGRUBВот что это делает. Даже мы можем понятьGRUBэто небольшая операционная система.

во всяком случаеbootОсновная задача — создать простую файловую систему и загрузить второй загрузчик.

Загрузчик загрузчика

вместе сbootРазгонный блок первой ступени отделяется от ракеты, а управление процессором передаетсяLoaderпрограмма. и этоLoaderВ основном делать три вещи.

  • Проверить информацию об оборудовании
  • Переключатель режимов
  • Передать данные ядру, запустить ядро

Сначала черезBIOSСлужба прерывания для получения аппаратной информации предназначена для подготовки к третьему шагу по передаче данных ядру.

Тогда этоПереключатель режимов, обратите внимание, что в этот момент мы все еще находимся в реальном режиме, только1MBфизического адресного пространства, а ядро ​​нужно загружать позже, чего точно не хватает. Итак, мы собираемся открытьA20, то есть двадцать первая адресная строка.

Почему вы хотите его открыть?Мы также сказали выше, что исходный процессор 8086 8088 имеет только 20 адресных строк, а когда он вступил в эпоху 80286, он стал адресными линиями 24. В настоящее время, если вы используете 24 адресных строки, вы определенно может получить доступ к1MBВышеупомянутое пространство памяти несовместимо с предыдущим. В то время 86 был действительно успешным.Все эти типы есть на рынке.Если вы создаете новый, который не такой, это означает, что программное обеспечение и драйверы должны быть переработаны, что неприемлемо для пользователей. .Таким образом, чтобы быть совместимыми адресные строки 20, при использованииA20как ограничение.

открылA20, как и 32-битная система, можно войти в защищенный режим и использовать адресные строки 32. В это время доступ к адресу памяти становится4GB, а для 64-битной введитеIA-32eРежим доступа к памяти еще больше.

отложить в сторону1MBУзкое пространство, на этот раз мы действительно можем изменить ситуацию. Информация об оборудовании, которую мы только что получили на первом шаге, полезна, и нам нужно установить некоторые параметры запуска ядра, а затем ввести информацию всредство запуска ядра. сопровождаемыйLoaderПосле выполнения последней инструкции программы начинается запуск ядра.

заголовок ядра

Не значит ли это, что сейчас ядро ​​начало запускаться, этозаголовок ядраЧто это такое? перед запуском ядраглобальная таблица описания сегментов (GDT), таблица описания прерываний (IDT) и инициализация структуры таблицы страниц для последующих ядеробработка прерыванияа такжеуправление памятьюИнициализация закладывает основу. Для этого предназначена заголовочная программа ядра — специальный ассемблерный код, который должен быть выполнен до выполнения программы ядра.

инициализация ядра

После входа в инициализацию ядра вся основная программа вызовет ряд функций инициализации, первая конечно это создание процесса 0, который единственный не прошелfork()а такжеkernel_thread()сгенерированный процесс.

передуматьBIOS, в ходе выполненияPOST加电自检После того, как мы вылетели, процесс инициализации был прерван, потому что в процессе выполнения программы, когда мы должныСначала рассмотрим исключения, поэтому в процессе инициализации ядра первым делом после завершения инициализации процессаИнициализировать обработку прерывания. Завершено, полагаясь на программу заголовка ядраIDTтак же какGDT, мы завершили инициализацию обработки прерывания, выполнив некоторые операции инициализации, такие как стратегии прерывания.

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

После того, как инициализация управления памятью завершена, ее нужно провестиИнициализация управления процессом. Для управления процессами мы можем разделить его на два этапа: как спроектировать нашСтруктура управления процессом (PCB)и как спроектироватьСтратегия планирования между процессами.

Тогда естьИнициализация файловой системы, как сопоставить файл с логическим адресом диска, и сопоставление логического адреса с физическим адресом — это тоже то, что нам нужно решить. Помните некоторые системные вызовы файлов, такие какopen(),read(),write()Ждать. Когда мы делаем эти системные вызовы, нам определенно нужно работать с нижележащим физическим дисковым носителем, иVFS(虚拟文件系统)Это связующий слой между нашими файлами и физическим носителем. Этот шаг на самом деле не инициализирует всю файловую систему, а только создает каталог первой точки монтирования./И выполнить некоторые определения формата, то есть мы не можем передать что-то вроде/root/xxxЧтобы получить доступ к файлу, во-первых, в настоящее время нет прогрессаМонтирование файловых систем физических дисковВторой в это времяПока нет пользовательского процесса(сейчас все в ядре).

После инициализации файловой системы нам нужноСоздать процесс 1, который является нашимпервый пользовательский процесс. После завершения инициализации виртуальной файловой системы необходимо войти в пользовательский режим для завершения процесса создания реальной пользовательской файловой системы. если мы предположимgrubимеет конфигурациюinitrdбудет выполняться сначала, а затемramdiskсерединаinit,этоinitГлавное, что нужно сделать, это сначала отталкиваться от типа СХДзагрузить драйвер, с водителем мы можем проехатьramdiskПерейдите к настройке настоящей корневой файловой системы, и тогда мы сможем получить доступ к корневой файловой системе.initПрограмма выполняет некоторую инициализацию пользовательского режима.

Когда у пользовательского процесса есть предок, будет создан предок процесса ядра, то естьПроцесс 2. Его роль очень проста, этоУправление планированием других потоков ядра.它会一直循环运行kthreaddфункция, эта функция в основномОтвечает за планирование и управление всеми потоками режима ядра..

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

В этой статье используетсяmdniceнабор текста