В замешательстве идите в сторону энтузиазма.
загрузка 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набор текста