Видео: YouTube
К этому моменту мы уже накопили немало вопросов, которые нас сдерживают в развитии. Один из них это управление памятью, мы ни разу не применили функцию динамического выделения памяти. Может всего пару раз позволили себе вызвать функцию вывода на экран. Так и не разобрались с тем, что и кому возвращает функция main. Также существует множество вопросов что такое многопоточность, многозадачность, что такое драйвера устройств, защита памяти, прерывания, страницы памяти, файловая система, своп или подкачка страниц. Сейчас пришло время со всем этим разобраться. Для того чтобы понять все это нужно понять сущность операционных систем. И для этого нужно прикоснуться к железу, способному обеспечить выполнение очень многих задач, исполняемых внутри операционной системы. Этим сейчас и ограничимся.
Аппаратное обеспечение
Вашему вниманию предлагается простейший 16-битный компьютер.
Его устройство обеспечивает функционирование многозадачной операционной системы, а это значит будет очень интересно. Постараемся копнуть на оптимальную глубину. Такую чтоб потом понимать как надо и не надо писать обычные прикладные приложения.
Итак, какие компоненты мы встречали ранее? Дешифратор команд, регистровый файл. В его состав входит 8 регистров разрядностью 16 бит. Флаги, и регистр указателя инструкций теперь тоже входят в состав файла. Арифметико-логических устройств два. Одно для арифметических и логических операций, Другое для расчета адреса данных в памяти, по известным базе и смещению. Отдельного стека адресов возврата теперь нет, эти адреса будут храниться в стеке, реализуемом в оперативной памяти. Функции контроллера памяти мы уже рассматривали ранее, он работает с общей динамической памятью большого размера.
Для упрощения не показан сложный интерфейс доступа к этой памяти. Остальные два блока памяти это раздельная кэш память первого уровня для программ и данных. К контроллеру памяти также подключен контроллер системной шины. К этой шине подключены устройства ввода и вывода информации.
Система команд процессора
Пройдемся по системе команд. Теперь процессор 16-разрядный, поэтому свободы в 16 битных машинных словах стало гораздо больше.
Первая инструкция это переход по адресу. Старшая единичка это информация для дешифратора о формате команды. Единицы на этом месте нет больше ни у какой инструкции.
Память состоит из 16-разрядных слов, поэтому 15 бит адреса смогут адресовать 32767 слов или 64 килобайта. Работа инструкции проста, при помощи дешифратора команд она загружает новый адрес в регистр указателя инструкции PC. В этом списке арифметические, логические инструкции, а также для работы с памятью.
Их префикс это 01 в старших разрядах. Дешифратор команд безошибочно их узнает. Арифметическая команда сложения ADD поместит в первый регистр сумму двух других.
Команда загрузки регистра из памяти MOV как и раньше выставляет на сумматор базу и индекс, содержимое ячейки памяти с вычисленным адресом загружается в выбранный регистр.
Сохранение содержимого регистра STO работает похожим образом.
Только содержимое регистра проходит через АЛУ и поступает в контроллер памяти. Обратим внимание, что в машинных инструкциях на синих позициях находятся коды регистров. Это RX, RY, RZ. Среди всего этого набора команд только команда отрицания NOT имеет две позиции под коды регистров. Это простая побитная инверсия. Результат инверсии можно сохранить в любом регистре, даже в том же самом.
Рассмотрим следующие группы команд.
Префикс команд позволяет отличить одну группу от другой. Внутри группы команды друг от друга отличают биты в желтых позициях. Как мы понимаем, отличать команды одну от другой это задача дешифратора команд. В состав инструкций входят восьмибитные поля, в которые помещаются числа. В зависимости от команды, это число имеет различное назначение. Кроме непосредственной загрузки регистра это еще и работа со стековым фреймом функции. Как мы ранее выяснили, для обращения к локальной переменной функции нужно пользоваться ее смещением от указателя стека SP.
В этой модели процессора такие операции упрощены, потому что теперь все можно делать одной инструкцией. Смещение от начала стека заложено в зеленой области.
Еще одна группа инструкций это работа со стеком через команды PUSH и POP. Содержимое регистра отправляется на вершину стека или содержимое вершины стека отправляется в выбранный регистр. Инструкция программного прерывания INT будет рассмотрена позже.
Последняя группа инструкций.
Тут есть любимая команда NOP, ничего не делать. На самом деле чуть позже убедимся что она важна. Операции сдвига LSH, RSH, LSH8 содержимого регистра имеют поля кода регистра, остальные без операндов вообще. Ну кроме еще одной, это вызов функции CALL, адрес которой помещен в регистр. Важная операция это RET, возврат из функции. Также важна группа инструкций CF, NF, ZF, NCF, NNF, NZF, выбирающих по какому условию будет осуществлен инструкцией JMP, которую мы рассмотрели в начале.
На этом рассмотрение технических особенностей процессора закончено. Каждый новый аспект работы операционных систем потребует дополнительной уточняющей информации, так если пока ничего не понятно это не страшно. Продолжение следует...