Страницы

Поиск по вопросам

четверг, 11 октября 2018 г.

Функции железа и ОС

Прошу пояснить некоторые вещи, которые я опишу ниже. Я много читал о том, как загружается система, какие функции выполняет железо, какие - система, но пока что полной картины сложить не могу.
Итак. Как я понимаю, при загрузке системы сначала просыпается bios. Он проверяет все железо, делает диагностику. Когда он решит, что все нормально, он считывает 512 (не уверен) первых байт с диска, проверяет 2 "магических" байта, и если они говорят о том, что этот диск - загрузочный, то bios начинает выполнять код загрузчика, т.е. этих 510 байт. При этом начинает выполнять не сразу, а записав их по некоторому адресу в оперативную память. Здесь вроде все понятно. А еще как процессор адресует память - постранично - вроде тоже понятно.
А теперь то, что мне непонятно: допустим, я загружаю linux. Загрузчик с диска поднял grub, grub загрузил ядро, ядро начало выполняться. Окай. Но как ядро адресует память? Получается напрямую физическую? Ну т.е. без виртуальной. Тогда другой вопрос. Получается весь user-space код, который адресует виртуальную память, выполняется в некой "песочнице" ядра, которая позволяет транслировать адреса виртуальные в физические? Или же есть какие-то именно процессорные механизмы? И как работает uefi?
В общем, меня интересует то, какие возможности предоставляет процессор, да и железо в целом, а что реализовано на системном уровне, и если можно, то почему оно так работает.
И да, еще интересно, как процессор общается с различным железом вроде видеокарт, и какие интерфейсы он предоставляет для управления этим железом программно.


Ответ

Загрузка кажется только простой, правда, это очень сложный и многошаговый процесс, я постараюсь Вам описать его. Хоть это и будет похоже на маленькую книжку, но я надеюсь, что многим будет интересно это почитать
Вы нажали кнопку питания
Линия PS_ON замыкает на "землю" и происходит подача питания на все железо! ОНО ОЖИЛО!. Блок питания включен. Начинается тестирование блока питания на соответствие всех напряжений требованиям. В случае удачного завершения данной операции, спустя 0.1-0.5с, вырабатывается сигнал Power Good, свидетельствующий о том, что загрузку компьютера можно продолжать. Головки жесткого диска выходят из парковочной зоны, остальное оборудование включается...ПОЕХАЛИ!

Блок питания проверился, а что дальше?
Дальше на специальный вход центрального процессора подается сигнал сброса (Reset). Процессор обнуляет содержимое своей памяти и начинает работу.
В чем заключается начало работы процессора?
Системная память сделана так, что первая команда которую будет считывать процессор после сброса находится в BIOS. Это инструкции по проведению самотестирования. Программа POST выполняет тестирование процессора, оперативной памяти, чипсета, видеосистемы, накопителей, системы управления питанием, клавиатуры, портов LPT и COM (а также подключенных к ним устройств), других компонентов компьютера.
POST завершился, что делать дальше системе?
После того как успешно завершилась процедура POST, вызывается программное прерывание BIOS INT 19h и запускается процедура поиска загрузочного сектора порядок поиска которого установлен непосредственно в BIOS.
Теперь будем искать загрузочную запись?
Да, но сначала немного терминологии, без которой дальше делать нечего:
Сектор - минимальный участок хранения информации на жестком диске равный 512 байтам; MBR (Master Boot Record) - Главная загрузочная запись, она находится в нулевом секторе диска и по сути является загрузочным сектором жесткого диска;
Дальше с указанного жесткого диска BIOS`ом считывается главная загрузочная запись MBR и управление дальнейшей загрузкой передается ей. Далее микропрограмма, находящаяся в MBR, сканирует таблицу разделов на наличие активного загрузочного раздела, после того как системный раздел будет найден, MBR загружает в память компьютера его нулевой сектор и выполняет код находящийся в нем. Загрузочный сектор раздела содержит код операционной системы, которую нужно загружать. В случае, когда на жестком диске нет системного раздела, BIOS отобразит сообщение об ошибке. Если системный раздел будет найден, загрузка продолжится. Все вышесказанное относится к запуску абсолютно любой операционной системы.
Хочу загружать Windows!
А теперь, если вы например загружаете WINDOWS, после всего вышесказанного, загрузчик ntldr который находится в системном разделе считывает из загрузочного файла boot.ini информацию о количестве операционных систем и их расположении, и предлагает пользователю выбрать из списка операционную систему.
Система выбрана!
Отлично, загружаем ядро в память, система готова к работе, но как же ядро управляет распределением памяти?
Что представляет собой ОЗУ?
Логически ОЗУ представляет собой упорядоченный (одномерный) массив элементов. Элементы (минимальные адресуемые единицы МАЕ) пронумерованы, причем номер каждой МАЕ фиксирован и определяется схемотехнической реализацией устройства памяти. Номер элемента реально существующего в системе устройства памяти в дальнейшем будем называть адресом (Address) этого элемента. В каждой такой ячейке может храниться двоичное слово фиксированной длины
Распределяем память
И так, адресная шина процессора работает...Нет, это слишком долго.. Будем считать, что процессор работает с диапазоном последовательных адресов от нуля до максимально доступного в системе адреса (в зависимости от количества оперативной памяти) и может при необходимости обратиться к любому байту в этом диапазоне.
Если сгенерировать для программы адреса, как они расположены в физическом виде, без виртуальной, то одновременное выполнение двух программ просто невозможно из-за перекрывания данных одной программы другой. Например, компилятор генерирует адреса для виртуального адресного пространства заданного диапазона, а устройство управления памятью, называемое диспетчером памяти, транслирует виртуальные адреса, сгенерированные компилятором, в адреса ячеек, расположенных в физической памяти. Компилятору нет необходимости знать, в какое место в памяти ядро потом загрузит выполняемую программу.
Конечно же виртуальная память сама по себе ничего не хранит. Виртуальное адресное пространство — это просто абстракция, но оно определенным образом поставлено в соответствие физической памяти. Отображение виртуальной памяти на физическую осуществляется через аппаратно реализованные страничные таблицы. Аппаратная часть непосредственно выполняет отображение, а ядро управляет таблицами и их конфигурацией, алгоритмами замещения и т.д.

Диспетчер памяти, это не какой-то процесс! Это устройство и оно может находиться на микросхеме процессора или на отдельной микросхеме рядом с процессором.
Вы обратились на какой-нибудь 32 битный адрес, то модуль разделяет его на 20 разрядный адрес страницы и 12 разрядное смещение внутри страницы. Все это называется прозрачной работой с памятью, когда программист даже не подозревает о существовании страничной организации памяти. Хотя, есть страничная организация памяти с процессом сегментации, при котором программисту требуется знать о существовании сегментов.
UEFI
Код микропрограммы UEFI написан на C и выполняется в современном 64-битном режиме. По сути это полноценная операционная система, которая работает на неограниченном уровне доступа к ресурсам "ring 0". Выполняется фаза PEI, и DXE перед загрузкой. Я не вижу смысла здесь все это описывать, вот картинка вам:

Источники: IBM.com, Habrahabr.ru, Overclockers.ru, Таненбаум Э. "Архитектура компьютера"
Для более четкого понимания работы компьютера и решения ваших вопросов, присоединюсь к ответу @AlexanderBlinov, прочитайте Архиктуру компьютера, очень полезная книга.

Комментариев нет:

Отправить комментарий