Пока она, естественно, неполная и местами неточная. Но, заглянув сюда, Вы можете представить себе некое подобие будущего творения.
Оглавление
Организация памяти
Организация процессов
Структура исполняемых программ
Состав системы
Обработка многозадачности
Поддержка TR-DOS-программ
Организация памяти
Для ОС будет обязательным наличие диспетчера памяти, который позволил бы в любое из четырёх окон адресного пространства процессора вставить любую страницу памяти. Только с этим устройством возможно написание полноценной ОС для Спектрума. ОЗУ разбито на страницы по 16Кб. Расчётный максимальный объём - 256 Мб (т.е. практически бесконечен :-)). Максимальный объём для каждой задачи - 4 Мб (256 страниц), а минимальный - 32 Кб. Управление памятью производится с помощью драйвера памяти, который, в отличие от остальных драйверов, будет интегрирован в ОС. Общий формат адреса:
#0000 #0002 Номер страницы, бит 15=1, если
адрес находится в той ячейке
памяти, куда указывает этот
адрес, бит 14=1, если для
получения адреса нужно вызвать
процедуру, лежащую по данному
адресу.
#0002 #0002 Адрес, биты 15,14 - номер окна,
в котором откроется страница,
если этот адрес передаётся
драйверу памяти, иначе - 0.
Минимальные требования к компьютеру - 256 Кб: 7 страниц - ОС (максимальная конфигурация), 1 страница - КЭШ и 8 страниц остаётся для задач.
Различаются локальные и глобальные номера страниц. Глобальные - это физические номера, Локальные - номера из таблицы описателя процесса (см. ниже).
Организация процессов
Процесс - это программа, которая может быть исполнена. Таковыми являются:
- exe - Запускаемые файлы
- dll - Динамически загружаемые библиотеки
- sys - Уровни системы
Каждому процессу система выделяет столько памяти, сколько требуется для его загрузки, плюс ещё одну страницу для всевозможных описателей (т.н. головная страница). Её примерное содержимое:
#0000 #0002 Адрес таблицы страниц
#0002 #0002 Адрес таблицы главных окон процесса
#0004 #0002 Адрес области каналов
#0006 #0002 Адрес таблицы очереди сообщений
#0008 #0002 Адрес таблицы открытых файлов
#000A #0004 Точка входа в задачу
#000E #0004 Процедура обработки сообщений
#0012 #0004 Процедура INT
#0016 #0001 Статус:
7,6 - приоритет: 00 - низкий, 01 - средний,
10 - высокий, 11 - очень высокий (только
для процессов типа диспетчера задач,
вызываемого по Alt-Ctrl-Del)
5 - при 1 процессу нельза посылать сообщения
4 - при 1 идёт обработка первого сообщения
3 - при 1 нельзя вызывать функции процесса
2,1,0 - резерв
#0017 #0001 Кол-во открытых страниц
#0018 #0001 Кол-во сообщений в очереди
#0019 #0001 Кол-во каналов
#001A #0001 Кол-во открытых файлов
#001B #0001 Номер канала с параметрами ком.строки
#001C #0001 Номер первого сообщения
#001D #0001 Номер последнего сообщения
#001E #0004 Указатель на иконку задачи
#0022 #0002 Указатель стека
#0024 #0008 Открытые страницы
#002С ..... Резерв
#0080 ..... Имя процесса, заканчивается нулём
#0100 #0100 Номера каналов открытых файлов
#0200 #0200 Таблица открытых страниц
#0400 #0400 Таблица указателей окон задачи
#0800 #0800 Таблица сообщений
#1000 #0400 Буфер стека
#1400 #2C00 Область каналов
Это была головная страница, все данные должна заполнять ОС. В остальные страницы загружена сама программа.
Структура исполняемых программ
Программа представляет собой набор функций, пронумерованных от 0 до 255 и имеющих имена. Существует два вида доступа к ним - по номеру и по имени. У всех исполняемых модулей (*.exe, *.dll и *.sys) общий формат:
#0000 #0001 Количество функций (n)
#0001 #0004 Адрес таблицы имён функций
#0005 n*8 Таблица:
#00 #04 Адрес
#04 #01 Сколько слов добавить в стек
при входе
#05 #01 Сколько слов удалить из стека
при выходе
#06 #01 Кол-во слов входных данных
#07 #01 Кол-во слов выходных данных
Таблица имён: "имя1",0,"имя2",0 и т.д.
Для *.exe 0-я функция всегда главный вход, 1-я - обработка сообщений, 2-я - INT. Как Вы уже, наверное, заметили, параметры во все функции будут передаваться через стек. Вызов функций системы - через RST:
- RST #00 - Аварийное закрытие процесса
- RST #08 - Обработка ошибок
- RST #10 - Вызов системных функций
- RST #18 - Вызов функций процесса
- RST #20
- RST #28
- RST #30
- RST #38 - INT
Вызов системных функций будет происходить так:
PUSH Параметры
RST #10
DB Номер функции
DB Номер уровня
POP Результат
Вызов функций процесса будет происходить так:
PUSH Параметры
RST #18
DB Номер функции
POP Результат
Сначала, конечно, процессу, вызывающему другой процесс, следует настроиться с помощью одной из функций системы.
Система и другие процессу могут послать программе сообщение. Сначала сообщение попадает в буфер. Если оно срочное, то ставится вперёд предыдущих (т.е. обрабатывается вне очереди), иначе ставится в её конец. Сообщения имеют общий формат:
#0000 #0002 Код сообщения, биты:
15 - срочное при 1
14 - 0 - системное,
1 - пользовательское
#0002 #0001 Номер процесса, создавшего
сообщение (0 - система)
#0003 #0001 Номер окна процесса или
номер уровня, если система
#0004 #0002 Какой код сообщения
возвратить при получении
(0 - не нужно)
#0006 #0001 Номер канала с доп.
данными (0 - нет)
#0007 #0001 Какому окну этого процесса
послано сообщение
(0 - без указания)
Вот примерный список некоторых системных сообщений:
Код | Имя | Назначение |
#0001 | Paint | Прорисовка графических объектов |
#0002 | Close | Требование закрыть объект |
#0003 | OnClick | Клик на графическом объекте |
#0004 | OnDbClick | Двойной клик на графическом объекте |
И так далее...
Состав системы
Система делится на уровни. Базовый вариант системы будет состоять из трёх уровней: 0 - base, 1 - file-os, 2 - GUI. В base находятся самые необходимые функции: работа с памятью, драйверами, устройствами, управление процессами и т.п. В него же вставляются драйвера внешних устройств. File-os - работа с блочными устройствами на уровне файлов. в него встраиваются драйверы файловых систем: TR-DOS, IS-DOS, MS-DOS, CP/M, которые обеспечат прозрачную поддержку всего этого. Кроме того, мыслится прозрачная поддержка архивов, т.е. работа с *.rar, *.zip и т.п. как с обычными папками. Кстати, предположительный максимальный объём блочного устройства - 1 Тб, а объём одного файла - 4Мб. Длина имени и расширения не ограничена. GUI - оно и в Африке GUI: содержит функции рисования окошек, кнопочек, примитивов и всего прочего. Будет иметь два режима работы: ZX и RULEZ. ZX - обычная спековская графика, RULEZ - расширенная, вроде ATM-овской или SPRINTER-овской. Также будут иметься внеуровневые компоненты: диспетчер, в котором лежит обработчик всего этого, RST и INT, а также стек, и КЭШ блочных устройств, который даже по самым неприхотливым прикидкам может достигать 4 Мб, но ничто не мешает его увеличить...
Обработка многозадачности
А где же многозадачность? - спросит внимательный читатель. Она описана здесь:
- Запускаем *.exe. Вызывается его 0-я функция;
- Система и/или другие процессы посылают задаче сообщения, которые складываются в очередь;
- Как только система получила управление, она просматривает в порядке приоритета все процессы на предмет наличия сообщений. Если находит, то передаёт управление этому процессу;
- Процесс берёт сообщение и исполняет его;
- 50 раз в секунду, после выполнения всех 2-х функций всех задач, система переключает процессы: сохраняет все регистры в стеке, копирует его в буфер стека процесса и запускает другой процесс.
Поддержка TR-DOS-программ
Основная проблема состоит в том, что эти программы обращаются к памяти через #7FFD. Т.е. на время работы TR-DOS-программ диспетчер отключается, и многозадачность недоступна. Выход из программы - только NMI. При NMI
компьютер вываливается в ZX-OS, а TR-DOS-программа находится в висящем состоянии. Её можно закрыть, можно запустить с того места, где была остановлена, а можно поковыряться в ней чем-нибудь. Можно запустить ещё одну TR-DOS-программу - это уже псевдомногозадачность. Но тут возникает ещё одна проблема - каждой TR-DOS-программе нужны страницы 0..7. Их, конечно, можно копировать, но это большой расход времени и памяти. Лучше решить это аппаратно. Как? Смотрите схему диспетчера, которая будет здесь в ближайшем будущем.
|