− Скрыть
Предисловие:
Идея написания собственного подобия операционной системы появилась во время
очередного сообщения об ошибке какой-то программы. И это заставило задуматься.
Нельзя ли вообще разработать такую операционную среду, где любая ошибка, пусть
даже самая жёсткая, не приводила бы вообще ни к каким последствиям? Словно все
приложения работают каждое на своей виртуальной машине, но при этом не требуют
использования всяких костылей.
Идея стала разворачиваться в нечто совершенно иное, чем просто операционная
система. Возникал ряд простейщих вопросов, на которые ответов и решений вообще
не предоставлялось в обычном контексте рядового программирования.
Ниже предлагаю небольшой FAQ:
Q.01: Какую часть памяти приложения занимает служебная область API-библиотеки?
Сколько всего векторов прерывания выделяется для вызова OS-API процедур?
A.01: Никакого API-интерфейса для приложений не предусмотренно. Вместо этого у
каждого приложения имеется позможность вести прямой диалог с оперативной
памятью на псевдо-языке. Потому, всегда выделяется все 4Гб пространства.
Q.02: Каким образом запрашивается открытие файлов, запись данных или чтение из
файла. Как открывается доступ к дискам или к ресурсам самого приложения?
A.02: Доступ всегда организуется через настройку зеркал памяти на тот или иной
ресурс посредством установки сегментов или регионов памяти. Инструкциями
работы с памятью производятся элементарные операции или установка связи.
Q.03: Почему "Division by zero" разработчиками i8086 выполнено как прерывание?
То же самое и с инструкцией BOUND? Будто вычислительно это - катастрофа!
A.03: Операционная среда эти недостатки устраняет в первую очередь. Так вместо
всяких исключений при подобных операциях мы будем получать установленные
соответствующие флаги процессора. Однако, производительность понижается.
Q.04: Почему операции с портами ввода-вывода запрещены? Когда в среде MS-DOS с
портами работало большинство различных программ без каких-либо запретов.
A.04: Операционная среда предоставляет полностью виртуализированную систему из
портов ввода-вывода, не имеющих ничего общего с реальными. Предназначены
они для высокоуровневых операций пересылки или обработки пакетов данных.
Список постулатов:
P.01: Перед запуском приложениям выделяется до 8192 локальных сегментов памяти
по 4Гб каждый, которые свёрнуты до одной страницы 4Кб, образуя замкнутую
глухую песочницу размером до 32Тб.
yyyyyyyyyyyyy000 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx: Область описания контекстов
yyyyyyyyyyyyy111 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx: Область ресурсов контекстов
Исторически сложилось, что принципы и идеология OS-UNIX являются основой во
всех ведущих проектах. Когда разворачивалась сама идея разработки операционной
среды, ставилась цель использовать большинство проверенных концепций из других
систем как составляющие.
Правило #1:
Файловая система никаким приложениям напрямую недоступна. А сами приложения
не имеют стандартных средств открытия и чтения файлов. И в менеджере процессов
все процессы представлены как сетевые ресурсы с локальной древовидной системой
внутренней иерархии. Достаточно перетащить какой-либо файл в нужную ветку и он
станет доступным из того приложения как часть его ресурсов. Причём есть ветки,
действующие только на чтение, либо на чтение и запись. При этом, реальный путь
файла для приложения остаётся неизвестным. Так, как и серверу не известен путь
фотографии, закачиваемой с компьютера пользователя. Без всяких sandbox'ов.
Правило #2:
Все ресурсы представляются за tar-архив. Анимация или потоки видео доступны
как последовательная группа файлов изображения, упакованных в tar. Любые файлы
с видео контентом, вне зависимости от формата и кодека, представляют собой при
открытии в приложении стандартный tar-ресурс с известным количеством кадров.
Термины идеологии:
Инструкция:
Любая обыкновенная инструкция процессора, обычно не вызывающая исключение в
нормальных условиях выполнения приложения;
Операция:
Инструкция процессора, зарезервированная как обращение к операционной среде
для проверки статуса или смены режима;
Идеология:
1: Операционная Среда предоставляет приложениям полную виртуализацию системных
ресурсов и максимальную инкапсуляцию, даже с ущербом общей производительности:
1.1: Выполнение инструкции BOUND с исключением просто устанавливает флаг OF=1;
1.2: Деление инструкциями DIV и IDIV на ноль попросту устанавливает флаг OF=1;
1.3: Операциями INT предсказывается наличие потока событий выбранного вектора;
1.4: Операции загрузки сегментных регистров организуют доступ к данным файлов;
1.5: Префиксом LOCK запрашивают доступ низкого уровня к файлам через менеджер;
2: Операционная Среда предоставляет приложениям доступ к данным файлов подобно
сетевым ресурсам, с возможностью использовать сценарии высокоуровневых языков:
2.1: ...
Описание особенностей работы с регистрами процессора
Регистры скриптов
В x86-скриптах допускается использовать все регистры, так-как скрипты не имеют таких понятий, как указатель стека, указатель фрейма или строковые указатели.
Для расширения возможностей программирования, в x86-скриптах имеется механизм работы над всеми половинками регистров EAX, EBX, ECX и EDX. Для этого скрипты имеют расширенный набор регистров из восьми 16-разрядных половинок от 32-разрядных:
┌────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┐
│ EAX │ ECX │ EDX │ EBX │ │ EAX │ ECX │ EDX │ EBX │
│ / \ │ / \ │ / \ │ / \ │ │ / \ │ / \ │ / \ │ / \ │
│EAH EAL │ECH ECL │EDH EDL │EBH EBL │или│EAH AX │ECH CX │EDH DX │EBH BX │
│ / \ │ / \ │ / \ │ / \ │ │ / \ │ / \ │ / \ │ / \ │
│ AH AL│ CH CL│ DH DL│ BH BL│ │ AH AL│ CH CL│ DH DL│ BH BL│
└────────┴────────┴────────┴────────┘ └────────┴────────┴────────┴────────┘
При этом x86-скрипт операции должны быть восьми-разрядными, но с 0x66-префиксом. Что самым процессором обычно игнорируется. Вот примерно так компилятор разворачивает такие коды:
EAX=0x01234567 EDX=0x89ABCDEF
-----------------------------
66 86 C4 |XCHG EAL,EAH > EAX=0x45670123
>>> XCHG AL,AH >EAX=0x01236745
>>> BSWAP EAX >EAX=0x45672301
>>> XCHG AL,AH >EAX=0x45670123
66 86 C2 |XCHG EAL,EDH > EAX=0x012389AB EDX=0x4567CDEF
>>> XCHG AL,AH >EAX=0x01236745
>>> BSWAP EDX >EDX=0xEFCDAB89
>>> XCHG DL,DH >EDX=0xEFCD89AB
>>> XCHG AX,DX >EAX=0x012389AB EDX=0xEFCD6745
>>> BSWAP EDX >EDX=0x4567CDEF
66 86 E2 |XCHG EAH,EDH > EAX=0x89AB4567 EDX=0x0123CDEF
>>> BSWAP EAX >EAX=0x67452301
>>> BSWAP EDX >EDX=0xEFCDAB89
>>> XCHG AX,DX >EAX=0x6745AB89 EDX=0xEFCD2301
>>> BSWAP EDX >EDX=0x0123CDEF
>>> BSWAP EAX >EAX=0x89AB4567
66 02 C4 |ADD EAL,EAH > EAX=0x0123468A
>>> XCHG DX,AX |EAX=0x0123CDEF EDX=0x89AB4567
>>> BSWAP EAX |EAX=0xEFCD2301
>>> XCHG AL,AH |EAX=0xEFCD0123
>>> ADD DX,AX |EDX=0x89AB468A
>>> XCHG AL,AH |EAX=0xEFCD2301
>>> BSWAP EAX |EAX=0x0123CDEF
>>> XCHG DX,AX |EAX=0x0123468A EDX=0x89ABCDEF
Кроме того, в скриптах имеется ещё 6 опциональных регистров, доступных через сегментные:
╔════════╦═════════╦═════════════╦═══════════════════════════════════╗
║ Ссылка ║ Имя ║ Доступность ║Описание ║
╠════════╬═════════╬═════════════╬═══════════════════════════════════╣
║ ES ║ Y ║Чтение/Запись║Базовый указатель операции ║
║ CS ║ N ║Только чтение║Непосредственные данные операции ║
║ SS ║ L ║Только чтение║Указатель на метку или смещение ║
║ DS ║ Z ║Чтение/Запись║Регистр-источник/приёмник операции ║
║ FS ║ M ║Чтение/Запись║Флаги, биты режима и код инструкции║
║ GS ║ X ║Чтение/Запись║Индексный регистр ║
║ [EBP-n]║ W127..W0║Чтение/Запись║Локальные переменные подскрипта ║
║ [EBP+n]║ V0..V127║Чтение/Запись║Глобальные переменные всех скриптов║
╚════════╩═════════╩═════════════╩═══════════════════════════════════╝
Так-как прямые операции с памятью в скриптах запрещены, все инструкции работы с памятью работают несколько иначе и расширеннее:
ADD EAX,[EDX+ECX*8-5] >>> EAX += EDX + ECX * 8 - 5
ADD [EDX+ECX*8-5],EAX >>> EAX += EDX - ECX * 8 - 5
XOR EAX,[EDX+ECX*8-5] >>> EAX ^= EDX + ECX * 8 - 5
XOR [EDX+ECX*8-5],EAX >>> EAX ^= EDX - ECX * 8 - 5
Зарезервированны и находятся в разработке:
CALL [EDX+ECX*8+5] >>>
JMP [EDX+ECX*8+5] >>>
POP [EDX+ECX*8+5] >>>
PUSH [EDX+ECX*8+5] >>>