MATRIX - многозадачная система с моделью вытесняющей многозадачности.
Назначение системы:
возможность разработки ПО,независимого от используемого вида дисковых накопителей
(т.е. другими словами попытка создать такую среду разработки,чтобы "отвязать" вновь разрабатываемое ПО от дискет TR-DOS и от использования ПЗУ TR-DOS).
Описание системы(версия 1.01 от 29.08.2009).
В этой системе программа представляет собой исполняемый файл, состоящий в общем случае из трёх частей.
1-я часть - это заголовок, 2-я часть - основной код, 3-я часть - все остальное (дополнительный код,данные,графика,музыка,т ексты и пр). В частных случаях 3-я часть отсутствует и располагается в других файлах.
Ядро системы предоставляет минимум функций,разделенных на 5 групп (засорение ядра системы дополнительными функциями "на всякий случай, вдруг кому-нибудь понадобится" не имеет смысла и катагорически запрещено).
Группы функций:
1-работа с памятью
2-работа с распределением процессорного временеми
3-работа с файловой системой (использование дисковых устройств)
4-работа с графической подсистемой (вывод на экран)
5-работа с периферийными устройствами
Для вызова функций используется такой метод.Программа имеет так называемые почтовые ящики -
для входящих сообщений и для исходящих сообщений.
Чтобы вызвать функцию программа размещает номер функции в ящике для исходящих сообщений и там же указывается дополнительная информация: адрес памяти с таблицей параметров и тип вызова - с ожиданием или без ожидания.
В случае вызова с ожиданием, система приостанавливает работу программы до момента окончания выполнения функции.В случае вызова без ожидания,программа продолжает работать, при этом она САМА
периодически (когда захочет) проверяет почтовый ящик на предмет,а выполнена ли функция.
Почтовых ящиков 2 пары - одна пара для общения программы с ядром системы и ещё одна пара специально выделена для общения программы с графической подсистемой.
Во время работы программа периодически просматривает почтовый ящик для входящих сообщений
как от графической подсистемы,так и от ядра системы, и по своему(как ей захочется) реагирует,если есть сообщения.
Это метод позволяет не усложнять ядро процедурами создания очередей запросов,процедурами обработки и оптимизации очередей запросов, а также снизить расход памяти и ресурсы процессора на обработку вызовов от программ.
1. О памяти, которую использует программа.
1-я область памяти - это та память,куда будет загружен основной код.Это определяется самим
кодером и указывается в заголовке программы специальным битом mem, а именно 0-код в нижней памяти,1-код в странице памяти,начиная с адреса #C000. В первом случае длина кода не должна
быть слишком большой (например не более 8 кБ, а лучше не более 4-х), чтобы не заставлять
систему освобождать нижнюю память от других программ,так как в этом случае другие программы должны быть приостановлены.
После загрузки кода в память система настраивает код на адрес загрузки, при этом используется информация из заголовка программы.
Во втором случае (код в странице) - длина кода не превышает 16 кБ, но может быть и меньше.
Система загружает код в страницу без дополнительной настройки.
>
Основной код имеет свой заголовок, в котором
расположены почтовые ящики (4 шт по 8 байт), стэк,место для сохранения контекста программы при переключении (туда сохраняются регистры и номер последней включенной страницы )
>
2-я область памяти - это дополнительные куски в нижней памяти - о том будет ли программа их использовать, указано в заголовке отдельным битом lowmem (0- не будет, 1- будет)
3-я область памяти - это дополнительные страницы в верхней памяти -аналогично,- о том будет ли программа их использовать, указано в заголовке отдельным битом himem(0- не будет, 1- будет)
Для работы с памятью необходим следующий минимум функций(названия функций условны):
-Запросить область для использования в нижней памяти или странице:
getmem (in-кол-во блоков по 256 байт; out - адрес или сообщение об ошибке)
getpage (in-ничего; out - номер страницы или сообщение об ошибке)
-Освободить область в нижней области или странице
freemem (in-адрес; out - ок или сообщение об ошибке)
freepage (in - номер страницы,ранееполученный этой программой; out - ок или сообщение об ошибке).
-Отобразить в адресное пространство в адрес #C000 страницу с указанным номером
onpage (out - ок или ошибка)
В результате программа может использует все три области (или меньше).
2. О распределении процессорного времени.
exit - завершает программу.
sleep N - приостанавливает программу на N - периодов (длительностью по 1/50 сек).
wait - функция позволяет приостановить выполнение программы до прихода следующего прерывания.(оставшееся время до прерывания будет использовано системой по своему усмотрению).
waitmes - функция позволяет приостановить выполнение программы до прихода любого сообщения.
fork NN - запустить программу с именем по адресу NN (будет создан новый процесс),(out:- PID процесса запускаемой программы или ошибка)
kill PID - уничтожить процесс с номером PID,ранее созданный этой программой
onback - включить вызов фоновой задачи для этой программы
offback - выключить вызов фоновой задачи для этой программы
Количество времени,в течение которого программе будет предоставлено процессорное время для её работы частично определяется кодером, пожелание об этом указывается в заголовке исполняемого файла в виде приоритетов от 1 до 7, при этом 7 - самый высокий приоритет.
Оценить время работы программы в единицу времени можно приблизительно,так, если работает несколько программ, то при прочих равных условиях программе с приоритетом 7 процессорное время
будет предоставляться в 7 раз чаще, чем для программы с приоритетом 1.
Если в данное время выполняются программы с одинаковым приоритетом - то можно условно считать, что они получают примерно одинаковое количество единиц процессорного времени
По умолчания предлагаеться указывать приоритет 2.
3. Работа с файловой системой(использование дисковых устройств).
open NN,M - открыть файл с именем по адресу NN в памяти.(out: ID - открытого файла или код ошибки)
opendir NN,M - открыть каталог с именем по адресу NN в памяти.(out: ID - открытого каталога или код ошибки)
в этих функциях M-это флаг,значением битов которого определяется режим открытия файла (для чтения, для записи,или для создания нового файла или каталога)
chdir NN - установить текущим каталог с именем по адресу NN
close ID - закрыть файл или каталог (определяется системой по ID),(out: - ок или ошибка)
read ID,NN,MM - читать из файла с номером ID последующие MM байт в адрес памяти NN
bread ID,NN,MM - то же самое, но MM - это количество блоков по 2048 байт
write ID,NN,MM - записать в файл с номером ID последующие MM байт из адреса памяти NN
bwrite ID,NN,MM -то же самое, но MM - это количество блоков по 2048 байт
lseek ID,MMMM - передвинуть указатель внутри файла на позицию MMMM байт
blseek ID,MMMM - то же самое, но MMMM - это количество блоков по 2048 байт
readdir ID,NN,MM - читать последующие елементы каталога в буфер по адресу NN, длина буфера MM
rename ID,NN - переименовать файл или каталог с номером ID - новое имя по адресу NN (out: - ок или ошибка)
erase ID - удалить файл или пустой каталог с номером ID (out: - ок или ошибка)
getattr ID,NN - получить атрибуты файла или каталога с номером ID в буфер по адресу NN
setattr ID,NN - установить новые атрибуты файла или каталога с номером ID из буфера по адресу NN
Примечание: - как уже было сказано выше, никаких очередей запросов нет, поэтому если например 3 программы запросят чтение блока данных из 3-х файлов (каждая из своего) - то сначала будет прочитан блок для 1-й программы (при этом система до окончания этой операции не будет отвлекаться на просмотр почтовых ящиков других программ и не узнает о том, что другие программы запрашивают чтение блока данных), далее система обработает вызов второй программы и уже потом вызов третьей программы.
Соответсвенно рекомендуется читать/записывать байты или блоки данных небольшого размера.