Предлагаемая здесь идея появилась довольно давно.
Чтобы было проще понять, что здесь было раньше, а что добавлено позже, ввожу такую систему.
Все старое остается черным.
Подчеркиванием выделяю то что надо по смыслу или то, о чем возникали вопросы в теме.
. То, что новое, но устареет перед новой правкой,
И так далее. Новое будет как бы вспыхивать и постепенно гаснуть.
Косметические, стилистические и т.п. правки выделяться не будут.
Начато 5.06.08
изменения 6.06.08изменения 7.06.08обозначения: 0s00000100 -- системный (абсолютный) адрес разрядность указана условно 32,
может быть как меньше, так и больше. Уменьшение разрядности - отсекание вeдущих нулей,
увеличение - добавление.
Условное название ФорОС. Если сие название занято, прошу сообщить, буду придумывать другое. А пока так.Система работает на некоем форт-процессоре
(ФП) ([color=red]или виртуальной машине (ВМ), далее это уточнение будет опускаться и все рассуждения на счет ФП применяются и к ВМ, если специально не оговорено или логически не подразумевается обратное)[/color], параметры которого пока не
конкретизируются, но предполагается, что п
роцессор может быть не один и различные задачи могут исполняться
разными процессорами одновременно. Так же, некая задача может исполняться несколькими
процессорами одновременно с раздельными блоками данных или с общими данными.
1. Mодель рабочего пространства - плоская память с расположением ядра с нулевого адреса.
В самом нуле - BIOS (возможно, в ПЗУ или защищенном от записи ОЗУ), он и загружает ядро.2. ГЛАВНЫЙ системный интерпретатор (ГСИ) - интерпретатор ФОРТ-ЯДРА со специальным ограниченным набором слов.
Ограниченным для приложений, а не вообще. Вызывается через адрес 0s00000100, на стеке интерпретируемая
строка ( Addr,Len -- )
3. Приложения способны вызывать через ГЛАВНЫЙ системный интерпретатор функции ОС,
по адресу 0x0000100 путем начального запроса адреса вызова и запоминания его в
приложении для последующего использования. (что там ниже 100h сейчас не важно, область BIOS-a).
Перед использованием каждое приложение обязано инициировать для себя или дочерних процессов все
необходимые функции ОС через запрос и запоминание у себя адреса исполнения каждой функции (или группы
функций). 4. Ядро имеет железную защиту от записи до некоего адреса
TASK_FENCE, устанавливаемого системной функцией
SET_TASK_FENCE, так же ядро имеет
защиту от "левых вызовов" и чтения себя. Железно область памяти ядра просто скрыта от задач.
(в случае ВМ - сокрытие программное или с использованием возможностей конкретного процессора, механизма сегментации и защищенный режим, например)5. Всякая запись/чтение в область системных данных может производиться
только системной функцией,
вызванной через полученный от ядра адрес входа.
Если системных данных много, фортово(!) определяется функция,
передающая/принимающая много данных. Если нужна быстрая обработка - аналогично!
Формально, никто не запрещает задаче передать на ГСИ кусок исходника
(фактически, форт-макрос), который затем будет исполняться как часть системы.6. Адреса входов, назначаемые задачам расположены группой с адреса 0s00000100 до адреса
0s00000100+
SYS_FENCE, где
SYS_FENCE - устанавливаемый (через ГСИ!) адрес защиты от
несанкционированного вызова внутренностей ядра. шаг - через 4(8?(16?)) байт.
Кэшируемая ассоциативная память для "разрешения вызовов" - задача делает вызов прямо,
железо проверяет само, можно ли ей делать такой вызов, если можно, идет дальше, если нельзя,
натупает "битье морд" с обработкой системного исключения и "закрытием хулигана".
На нулевом уровне, где "морду бить" некому, такой запрет приведет к возврату
без каких либо действий с установленным флагом ошибки исполнения.6. Ядро загружается в начале работы (BIOS-ом), запускается его инициализация,
а затем производится интерпретация загрузочного AUTOEXEC.FRT,
в котором прописывается подгрузка всех необходимых дальше частей системы.
Тем не менее,все эти части могуть быть подгружены и сразу вместе с ядром,
исключая при этом "тормоза загрузки" аля "виндувс(TM)"
Система может быть и перегружена из консоли:
SYS: " MY.NUC" LOAD-CORE ;SYS и сохранена
SYS: " MY2.NUC" SAVE-CORE ;SYS
для последующего использования или продолжения работы
после сброса подгрузится ядро
DEFAULT.NUC, которое нельзя перезаписать просто так (файл должен быть защищен!)
Чтобы после сброса подгружалось пользовательское ядро, его загрузка прописывается в AUTOEXEC.FRT,
интерпретируемый после загрузки, а для исключения зависания с подгрузкой глючного ядра предусматривается
пауза с подтверждением загрузки пользовательского ядра или его загрузкой по истечении установленного времени паузы.
Вписывается в паузу 0, и будет грузиться все что задано в AUTOEXEC.FRT без возможности это остановить (для систем,
в которые нельзя пускать "шаловливые ручки")
7. Драйвера находятся в области ядра и подгружаются "по мере поступления" на вход интерпретатора,
выстраиваясь в цепочку, организованную подобно словарю Форта. т.е.
Код:
\ все доступно только ядру!
ИМЯ_ДРАЙВЕРА: "NAME"
ПОЛЕ_СВЯЗИ_ДРАЙВЕРА: адрес_предыдущего_драйвера
ПОЛЕ_ИСПОЛНЕНИЯ_ДРАЙВЕРА: адрес_исполняемой_части
ПОЛЕ_ПАРАМЕТРОЕ_ДРАЙВЕРА: параметры_драйвера
......
КОНЕЦ_ДРАЙВЕРА \ формально никак не обозначен.
Вызов драйвера осуществляется по его имени, через ГСИ, с установленным для конкретного драйвера "синтаксисом".
Условный пример для драйвера SYS:
SYS: " DOOM.EXE" START-PROCESS ;SYS Для более быстрого исполнения некоторых функций, устанавливается порядок вызова такой функции через ГСИ,
при котором ГСИ возвращает исполняемый адрес конкретного действия, заданного через интерпретатор -
это фактически есть определение нового системного слова (вызова) с возвращением приложению адреса для EXECUTE
Для защиты, каждое приложение может иметь свой собственный список адресов системных вызовов
При запуске каждому процессу (задаче) выдается некий начальный (стандартный) список системных функций.
Загрузка драйверов:
SYS: " CDROM.DRV" LOAD-DRIVER ;SYS Загрузка драйвера. Формат драйвера должен поддерживать фунцию проверки, которая не позволяет загрузить
неправильный или поддельный драйвер (на первое время - просто некая хэш-функция от содержимого файла)
8. Когда ядро загружено и закончена интерпретация
AUTOEXEC.FRT управление передается в "фортовую консоль", в которой
программист может сам набрать и запустить любую системную команду.
9. Память. Для ОС - память линейная. Для задач необходимо "отделение памяти" для задачи от всей остальной памяти.
Формально, можно сделать сегментами. Пока не придумано что-то лучше, считаем так.
Для каждой задачи выделяется сегмент памяти, описываемый адресом начала и длиной.
Дескрипторами сегментов задач занимается ядро.
Из сегмента задачи доступны извне только разрешенные адреса для вызова функций ОС и, возможно, некая область обмена, через которую передаются данные от одной задачи к другой.
Передаются по принципу, кто управление отдал, тот и данные передает, кто управление принял, тот данные получил.
Т.е. чтобы данные для записи на винт ушли по назначению, задача должна сама передать управление драйверу диска.
Считаем для простоты, что задача не обязана сохранять содержимое буфера обмена, если только эта способность не заложено в ней изначально.
Дескрипторов может быть много, и все они хранятся в памяти ядра, откуда по мере необходимости данные записываются в нужные регистры. (программно или автоматом переключения задач - это сейчас не суть)