Найти в Дзене
Про 1С и не только

Абстрактная модель вычислительной системы “Zero”

Существующие абстрактные модели вычислительных машин, такие как машина Тьюринга, машина Поста, машина Минского и т.д. не обладают достаточной умозрительной наглядностью и не могут служить фундаментом для целостного понимания процессов, происходящих в современных компьютерных системах, а хотелось бы. Сам факт эквивалентности реальных вычислительных систем перечисленным абстрактным моделям и их значимость под сомнение здесь естественно не ставится. Вопрос лежит в плоскости интуитивного понимания основ, на базе которых ожидается возникновение интереса к деталям, возможность если не предугадывать, то уверенно понимать суть конструкций, с объяснения которых как правило начинаются базовые курсы, посвященные основам программирования, операционных систем и т.д. Например, преподавание основ программирования на языке Assembler как правило начинается с рассказа о режимах процессора, перечисления регистров и их назначения, ввода понятий слова, двойного слова объяснения сегментной модели памяти, ст

Существующие абстрактные модели вычислительных машин, такие как машина Тьюринга, машина Поста, машина Минского и т.д. не обладают достаточной умозрительной наглядностью и не могут служить фундаментом для целостного понимания процессов, происходящих в современных компьютерных системах, а хотелось бы. Сам факт эквивалентности реальных вычислительных систем перечисленным абстрактным моделям и их значимость под сомнение здесь естественно не ставится. Вопрос лежит в плоскости интуитивного понимания основ, на базе которых ожидается возникновение интереса к деталям, возможность если не предугадывать, то уверенно понимать суть конструкций, с объяснения которых как правило начинаются базовые курсы, посвященные основам программирования, операционных систем и т.д. Например, преподавание основ программирования на языке Assembler как правило начинается с рассказа о режимах процессора, перечисления регистров и их назначения, ввода понятий слова, двойного слова объяснения сегментной модели памяти, стека, особенностей адресации в разных режимах процессора и т.д., что несколько сбивает с толку пытающихся понять основы. Попытаемся заполнить образовавшийся вакуум.

Модель абстрактной вычислительной системы “Zero”

Пусть есть генератор тактов, выдающий последовательность тактов, подключенный к процессору.

Есть память – плоский конечный набор подключенных к процессору пронумерованных ячеек размером 8, 16, 32 или 64 бита - в соответствии с разрядностью системы. Все ячейки памяти равнозначны, кроме некоторых, речь о которых пойдет далее.

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

Одна из ячеек памяти, адрес которой «жестко» зашит в процессоре называется Указателем команд, эта ячейка в свою очередь содержит в себе адрес ячейки памяти, по которому находится команда, которая выполняется на текущем такте.

Каждая из команд процессора в рамках одного такта генератора может произвольным образом модифицировать память в некотором количестве ячеек памяти - в зависимости от самой команды. В рамках одного такта генератора каждая команда, помимо прочего модифицирует (или не модифицирует) ячейку указателя команд, устанавливает в ней адрес команды, которая будет выполняться на следующем такте. Команда – это известное процессору двоичное число, расположенное в ячейке памяти по адресу, который находится в ячейке указатель команд, в результате выполнения которой процессор производит действия с памятью. Для примера пусть в нашей системе будут такие абстрактные команды:

Zero (0h) – ничего не делает, все ячейки памяти остаются неизменными, в том числе указатель команд.

SpherHorse (2h) – обнуляет ячейку памяти по адресу, отличающемся на плюс единицу от значения в указателе команд, значение указателя команд устанавливается как текущее значение указателя команд плюс два (почему бы и нет?).

Также в системе есть прерывания процессора, образующие Список прерываний, представляющий из себя известный процессору набор ячеек памяти. На каждом такте генератора, перед выполнением очередной команды, процессор производит обход ячеек списка прерываний. Пусть на каждое прерывание списка выделено две ячейки памяти, в первой из которых используется только первый разряд (содержащий 0 или 1) – так называемый флаг прерывания. Во второй ячейке записан адрес, в котором находится команда, которая будет выполнена первой при обработке данного прерывания. Если флаг прерывания равен 0, то процессор или продолжает обход списка или, в случае, если обход списка завершен – выполняет команду, расположенную по адресу в указателе команд (прерывания не происходит). Если флаг прерывания равен 1, то вместо выполнения команды по адресу в указателе команд, выполняется команда по адресу, расположенному во второй ячейке прерывания (на каждое прерывание, как мы помним, отводится две ячейки памяти, в первой из которых находится флаг). При этом, непосредственно перед выполнением первой команды обработчика прерываний, значение указателя команд остается неизменным и соответствует адресу команды, которая должна была выполняться в случае отсутствия прерываний. Это позволяет построить обработчик прерываний таким образом, чтобы после его завершения можно было продолжить выполнение программы с того же места, в котором оно было прервано (эта логика должна быть описана в программном коде самого прерывания – значение указателя команд нужно сохранить в начале и восстановить в конце обработки прерывания).

У процессора есть режим запрета прерываний, который может быть установлен или отменен специальной командой. В режиме запрета прерываний выполнение очередной команды процессором не будет предваряться обходом списка прерываний. Это дает возможность исключить прерывание самого обработчика прерывания. Пусть режим запрета прерываний устанавливается процессором автоматически в начале обработки прерывания, а за выключение режима запрета прерываний отвечает специальная команда AllowInterrupts (3h), выполнение которой должно быть предусмотрено в конце обработчика прерывания.

Обработчик прерывания – это обычным образом устроенная программа, которая дополнительно должна организовать продолжение работы прерванной команды после своего завершения (предварительно сохранив значение указателя команд в одной из ячеек памяти), а также снять режим запрета прерываний процессора. Если в предпоследней команде обработчика прерывания мы будем снимать режим запрета прерывания, а в последней - восстанавливать значение указателя команд адресом прерванной команды, то возможна ситуация, когда непосредственно перед последней командой будет вызвано другое прерывание, чего хотелось бы избежать. Решение – режим запрета прерывания продолжается еще один такт после его снятия.

Еще нам потребуются внешние устройства, которые тоже имеют доступ к ячейкам памяти вычислительной системы. Ассоциируя внешние устройства с определенными ячейками памяти, в том числе с ячейками прерываний, можно организовать взаимодействие с ними, а также ввод и запуск программ. Устройствами могут быть монитор, отображающий содержимое некоторого диапазона ячеек памяти - так называемой видеопамяти (в нашей модели процессор не отличает ее от любой другой памяти), клавиатура, работающая через ячейку памяти и прерывание, принтер, имеющий в своем составе собственную вычислительную систему, ожидающую команды на печать и другие необходимые устройства.

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

Описание нашей модели следует дополнить порядком запуска системы. Процессору должно быть известно (опять же это должно быть в нем жестко «зашито»), где находится первая команда, которая будет выполнена после старта. Пусть для простоты это будет адрес (0h), то есть первой будет выполнена команда, находящаяся по адресу, лежащему в первой ячейке памяти.

Теперь мы можем рассмотреть концепцию простейшей операционной системы, которую мы назовем тоже Zero. Она будет состоять только из ядра, реализованного всего одной командой - Zero (0h), описанной выше. При старте в первую очередь запускается ядро ОС, в результате чего система перейдет в режим ожидания прерывания, так как команда Zero ничего не делает, в том числе и не изменяет указатель команд. Для реализации ядра ОС Zero нам не потребуется ни редактор программного кода, ни компилятор. Логично предположить, что при старте системы все ячейки оперативной памяти пусты, то есть содержат 0h. Первой командой, согласно принятой нами логике работы процессора будет команда, находящаяся по адресу 0h, значение по которому опять-таки тоже пока 0h, что соответствует команде Zero. То есть ядро нашей ОС обеспечит перевод системы в режим ожидания прерывания, что и требовалось.

Собственно на этом все.

«Секундочку!» - возразит внимательный читатель – «а что же это за система, которая ничего не делает, кому нужна такая ОС?» Ответ прост, согласно нашей модели: «Есть внешние устройства, которые имеют доступ к ячейкам памяти вычислительной системы», в том числе к ячейкам списка прерываний, то есть никто не мешает нам с помощью внешних устройств записать в список прерываний нужное прерывание и взвести флаг, запустив таким образом первую программу. Естественно, список команд должен быть расширен. Но это уже, как говорится – дело техники.