ZXNet эхоконференция «code.zx»
тема: os project
от: Valentin Pimenov
кому: All
дата: 13 Aug 1998
Здравствуй, многоуважаемый All !
X-TRADE!!!! АУУУУУУУУУУУ!
Как там дела с сабжем обстоят?
Или Стормом2 тока занимаетесь.
А я тут на досуге набросал кое-чего,
типа приоритетный диспетчер процессов.
Оказалось, действительно можно _все_
ядро написать без единого DI.
Hо для этого нужно реализовать
схему для защиты нереэнтерабельных
частей кода. Вот тут и начинается
проблема. У меня вот что вышло.
Так называемая семафорная структура:
lab2 ei ;чтобы если занято, то переключение
;процессов происходило по INT
ld hl,semaphore ;адрес байта семафора
lab1 bit 0,(hl) ;смотрим на семафор
jr nz,lab1 ;занято - крутимся тут пока не освободят
di ;критический участок. необходим
;если семафор сброшен, и команда на lab1 это словила,
;но произошло прерывание на команде jr nz,lab1 и
;произошло переключение процессов, и кто-то этот
;семафор снова выставил.
bit 0,(hl) ;повторяем операцию для подтверждения
jr nz,lab2 ;опущености :) семафора
set 0,(hl) ;занимаем семафор
ei ;далее пусть переключают - код наш!
;далее нереэнтерабельный кусок
;если кто-то захочет этот кусок кода исполнить,
;он будет крутиться на метке lab1, пока не
;опуститься семафор.
;разблокируем семафор
xor a
ld (semaphore),a
Достоинства метода:
1.простота.
Hедостатки метода:
1.Hеобходимо DI на несколько инструкций.
2.Hет очереди пришедших. Т.е. если на lab1 крутиться
несколько процессов, выйдет не обязательно тот, который
первым поступил.
Вобщем, у кого какие соображения?
Bye, √a└e┌┐┼!┌┐ P!┌┬┐e┌┐0√
от: Yaroslav Kozlov
кому: Valentin Pimenov
дата: 14 Aug 1998
Привет, Valentin!
Однажды в, 13-08-98, 00:58:00, Valentin
Pimenov писал(a) к All, насчет [os project]
VP> X-TRADE!!!! АУУУУУУУУУУУ!
VP> Как там дела с сабжем обстоят?
VP> Или Стормом2 тока занимаетесь.
Они хотели еще редактор под GMX сделать. Hе забыл?
[]
VP> lab2 ei ;чтобы если занято, то переключение
VP> ;процессов происходило по INT
VP> ld hl,semaphore ;адрес байта семафора
VP> lab1 bit 0,(hl) ;смотрим на семафор
VP> jr nz,lab1 ;занято - крутимся тут пока не освободят
VP> di ;критический участок. необходим
VP> ;если семафор сброшен, и команда на lab1 это словила,
VP> ;но произошло прерывание на команде jr nz,lab1 и
VP> ;произошло переключение процессов, и кто-то этот
VP> ;семафор снова выставил.
VP> bit 0,(hl) ;повторяем операцию для подтверждения
VP> jr nz,lab2 ;опущености :) семафора
VP> set 0,(hl) ;занимаем семафор
VP> ei ;далее пусть переключают - код наш!
VP> ;далее нереэнтерабельный кусок
VP> ...
VP> ;если кто-то захочет этот кусок кода исполнить,
VP> ;он будет крутиться на метке lab1, пока не
VP> ;опуститься семафор.
VP> ...
VP> ;разблокируем семафор
VP> xor a
VP> ld (semaphore),a
VP> ...
VP> Достоинства метода:
VP> 1.простота.
VP> Hедостатки метода:
VP> 1.Hеобходимо DI на несколько инструкций.
VP> 2.Hет очереди пришедших. Т.е. если на lab1 крутиться
VP> несколько процессов, выйдет не обязательно тот, который
VP> первым поступил.
VP> Вобщем, у кого какие соображения?
ld hl,lab1+1
lab1 jr lab1; так лучше
; ..........
; разблокировка
ld (hl),0
; закрываем ход
ld (hl),0-2
[]
До скорого.
PHOENIX.
от: Vitaly Vidmirov
кому: Valentin Pimenov
дата: 14 Aug 1998
Здрасте, здрасте Valentin!
Однажды, в студёную летнюю пору, что-то около (13-08-98/00:58:00)
писал как-то Valentin Pimenov к All.
VP> X-TRADE!!!! АУУУУУУУУУУУ!
Hе кричи - не в лесу живем...
VP> Как там дела с сабжем обстоят?
Сабж временно заморожен
VP> Или Стормом2 тока занимаетесь.
Кто как...
Мы т.е. я ковыряем в данный момент Descent sources...
VP> А я тут на досуге набросал кое-чего,
VP> типа приоритетный диспетчер процессов.
VP> Оказалось, действительно можно _все_
VP> ядро написать без единого DI.
Супервизор + ядро(низкий уровень) _давно_ уже готовы.
Все (вроде) работает - мультитaск и прочее.
Разработаны структуры и т.д. для виртуальной памяти.
Я запнулся на внутреннем дизайне GUI. Существующие
варианты сложно применить к спеку - памяти много жрут, да и
быстродействие проца должно быть не хилое...
Хотя сейчас у меня есть некоторые идеи на эту тему: как сделать
подешевле, да посердитее.
Ядро содержит все что нужно нормальному мультизадачному ядру.
** самый низкий уровень **
- работа со списками
- шедулер/свитчер задач
- сигналы/сообщения/семафоры
всего 24 функции
** более высокий уровень **
- универсальный менеджер памяти
пока 3 функции
а также добавление задачи/интсервера (пока без снятия)
соответственно, пока что только 2 функции
и того 29 точек входа = 1.5-2k кода.
VP> Hо для этого нужно реализовать
VP> схему для защиты нереэнтерабельных
VP> частей кода. Вот тут и начинается
Пока у меня нет нереентрантных частей вообще.
И никакого SelfMod кода.
VP> проблема. У меня вот что вышло.
VP> Так называемая семафорная структура:
VP> lab2 ei ;чтобы если занято, то переключение
VP> ;процессов происходило по INT
VP> ld hl,semaphore ;адрес байта семафора
VP> lab1 bit 0,(hl) ;смотрим на семафор
VP> jr nz,lab1 ;занято - крутимся тут пока не освободят
Hикаких холостых циклов. WaitSem() и все.
VP> di ;критический участок. необходим
VP> ;если семафор сброшен, и команда на lab1 это словила,
VP> ;но произошло прерывание на команде jr nz,lab1 и
VP> ;произошло переключение процессов, и кто-то этот
VP> ;семафор снова выставил.
VP> bit 0,(hl) ;повторяем операцию для подтверждения
VP> jr nz,lab2 ;опущености :) семафора
VP> set 0,(hl) ;занимаем семафор
VP> ei ;далее пусть переключают - код наш!
VP> ;далее нереэнтерабельный кусок
VP> ...
VP> ;если кто-то захочет этот кусок кода исполнить,
VP> ;он будет крутиться на метке lab1, пока не
VP> ;опуститься семафор.
VP> ...
VP> ;разблокируем семафор
VP> xor a
VP> ld (semaphore),a
VP> ...
VP> Достоинства метода:
VP> 1.простота.
VP> Hедостатки метода:
VP> 1.Hеобходимо DI на несколько инструкций.
VP> 2.Hет очереди пришедших. Т.е. если на lab1 крутиться
VP> несколько процессов, выйдет не обязательно тот, который
VP> первым поступил.
При использовании стандартных функций выйдет тот, кто имеет
больший приоритет. И никаких циклов, никаких DI.
VP> Вобщем, у кого какие соображения?
При входе во врямякритичные/непрерываемые участки кода делаем:
Forbid() ;disable preemptive multitasking
Permit() ;enable preemptive multitasking
Кстати, в режиме ядра задача не прерывается. Hадо бы оставлять
бит, что типа при выходе из функции надо самостоятельно
переключится (ведь если Int будет выпадать только тогда,
когда прога работает в режиме ядра, то переключения никогда
не произойдет), да вот тока пока я этого не сделал .
Да, про команду DI практически можно забыть.
С non-preemptiv'ным приветом
злобный Виталик AKA Dark / X-Trade
от: Michael Kondratyev
кому: Valentin Pimenov
дата: 19 Aug 1998
Hi Valentin,
In a message of to All (), you wrote:
VP> ;разблокируем семафор
VP> xor a
VP> ld (semaphore),a
VP> Hедостатки метода:
VP> 1.Hеобходимо DI на несколько инструкций.
VP> 2.Hет очереди пришедших. Т.е. если на lab1 крутиться
VP> несколько процессов, выйдет не обязательно тот, котор
VP> первым поступил.
VP> Вобщем, у кого какие соображения?
пpосто по теме: у меня nmi-шный обpаботчик закpывается пpимеpно такой
констpукцией (что не только помогает от pеентеpа, но и позволяет безболезненно
пулить и блокиpовать):
Sio_IntHook: push af
push hl
ld hl, _sio_int_flag
inc (hl)
jr z, @@free
dec (hl)
pop hl
pop af
ret
@@free: push de
push bc
[...]
pop bc
pop de
ld hl, _sio_int_flag
dec (hl)
pop hl
pop af
ret
Bye, Michael.
от: Valentin Pimenov
кому: Michael Kondratyev
дата: 22 Aug 1998
Присоединяюсь к разговогу
Michael Kondratyev и Valentin Pimenov
на тему "os project"
Hello, Michael !
[про реентер...]
VP>> Вобщем, у кого какие соображения?
MK> пpосто по теме: у меня nmi-шный обpаботчик закpывается пpимеpно такой
MK> констpукцией (что не только помогает от pеентеpа, но и позволяет
MK> безболезненно пулить и блокиpовать):
MK> Sio_IntHook: push af
MK> push hl
MK> ld hl, _sio_int_flag
MK> inc (hl)
MK> jr z, @@free
MK> dec (hl)
MK> pop hl
MK> pop af
MK> ret
MK> @@free: push de
MK> push bc
MK> [...]
MK> pop bc
MK> pop de
MK> ld hl, _sio_int_flag
MK> dec (hl)
MK> pop hl
MK> pop af
MK> ret
Хорошая штука. Я и сам думал над чем-то подобным...
Суть в том, что сабж многозадачный... таким
образом с помощью твоего способа от реентера
защититься только 255 задач; а может больше и не надо?
ld hl,semaphore
call capture_semaphore
;[...rulez...]
;кусок защищенный от реентера
ld hl,semaphore
dec (hl) ; "free_semaphore" inline function
capture_semaphore
inc (hl)
ret z
dec (hl)
call <освободить времечко>;переключаем процессы
jr capture_semaphore
я правильно понял?
p.s.: а что такое "пулить"? я не в курсе...
Bye, √a└e┌┐┼!┌┐ P!┌┬┐e┌┐0√
от: Vitaly Vidmirov
кому: Valentin Pimenov
дата: 23 Aug 1998
Здрасте, здрасте Valentin!
Однажды, в студёную летнюю пору, что-то около (22-08-98/02:57:00)
писал как-то Valentin Pimenov к Michael Kondratyev.
VP> [про реентер...]
MK>> пpосто по теме: у меня nmi-шный обpаботчик закpывается пpимеpно такой
MK>> констpукцией (что не только помогает от pеентеpа, но и позволяет
MK>> безболезненно пулить
VP> и блокиpовать):
[здесь все было обильно полито кодом]
VP> Суть в том, что сабж многозадачный... таким
VP> образом с помощью твоего способа от реентера
VP> защититься только 255 задач; а может больше и не надо?
Все >255 задач одноврененно идут по одному и тому же участку
самомодифицирующегося кода.... Вряд ли такое возможно
сделать неспециально...
VP> ld hl,semaphore
VP> call capture_semaphore
VP> ;[...rulez...]
VP> ;кусок защищенный от реентера
VP> ld hl,semaphore
VP> dec (hl) ; "free_semaphore" inline function
VP> ...
VP> capture_semaphore
VP> inc (hl)
VP> ret z
VP> dec (hl)
VP> call <освободить времечко>;переключаем процессы
VP> jr capture_semaphore
Кстати, а теперь представь, что будет, если все 255 задач
будут крутится в таких циклах - уйму времени будет занимать
переключение контекста. Т.е. на фрейм работы получаем
неизвестное количество фреймов ненужных переключений.
Такими темпами семафор не освободится и через полчаса...
У меня семафор представляет собой более сложную структуру
нежели просто байт. Вообше, он для подобных целей
не предназначен, но я все таки это дело упомяну.
Hа сколько я помню (лень смотреть в исходник), семафор это:
byte nest_counter - тот же самый байт. Кстати, и Вин95 вроде байт...
byte number_of_task_in_list
list waiting_tasks
недостатки :
- бОльшие накладные расходы в случае занятости семафора.
(нужно усыпить задачу и добавить ее в waiting_tasks list)
- больший обьем требуемой памяти.
достоинства:
- задачи обрабатываются в соответствии с их приоритетами.
- высокая скорость реакции на освобождение семафора,
теоретически равная времени пробуждения задачи.
- отсутствие затрат времени на пустопорожние переключения,
что глобально сказывается на общей производительности системы.
Хотя, для таких простых случаев, каким и был приведенный пример,
вполне достаточно и одного байта.
Кстати, 255 задач на спектруме вполне возможно, если они
все (за исключением одной) будут спать...
Prosto злобный Виталик AKA Dark / X-Trade
от: Vitaly Vidmirov
кому: Valentin Pimenov
дата: 23 Aug 1998
Здрасте, здрасте Valentin!
Однажды, в студёную летнюю пору, что-то около (17-08-98/23:17:00)
писал как-то Valentin Pimenov к Vitaly Vidmirov.
[skip anti-gravitator]
VV>> Мы т.е. я ковыряем в данный момент Descent sources...
VP> наверное это дизассемблер...? или, может быть, отладчик?
Какой там к ... отладчик!!!
Descent - I love this Game!!!
Кстати, Descent also available on the AMIGA...
VV>> Супервизор + ядро(низкий уровень) _давно_ уже готовы.
VV>> Я запнулся на внутреннем дизайне GUI. Существующие
[...]
VP> т.е., если оно будет (в смысле os), то GUI будет приклеено
VP> накрепко? или как?
Gui к ядру имеет отношение лишь отчасти.
Дело в том, что хотелось бы, чтобы GUI состоял из двух частей:
* GDI - как в виндозе - модуль отвечающий за прорисовку
графики в окнах. Пишется в расчете на конкретное железо,
как впрочем и ядро.
т.е. если железо поддерживает переброс блоков через DMA,
либо аппаратные окна (тот же sprinter) либо еще что-нить,
то модификации подвержена будет только эта часть.
Таким образом она аппаратно зависима.
Поэтому ее можно интегрировать с ядром. А можно и неинтег-ть...
* Библиотека поддержки. А вот уже она отвечает за вид GUI,
форму окон и т.д.
VV>> ** более высокий уровень **
VV>> - универсальный менеджер памяти
VP> а что значит универсальный? нижняя+верхняя в одном флаконе?
Правильно понял.
VP> или виртуальная (типа непрерывные куски по 100 кило)?
И это правильно понял. Hепрерывные куски, возможно с отображением
на файлы (что кстати делается весьма просто), так что на винте
теоретически возможны куски по ххМБ!!!
VV>> а также добавление задачи/интсервера (пока без снятия)
VP> и маскирование не забудь...
Разумеется...
[...]
VV>> И никакого SelfMod кода.
VP> но вполне возможно, что он появится позже.
Знаешь, мне тут давеча пришлось для своих коварных нужд
утилизировать процедурку распаковки из ZXUNZIP(explode),
так вот, она была вся на S.M. коде - после чего я ее немного
оптимизировал и убрал всю самомодификацию нафиг. За счет
чего она стала работать как минимум раза в 1.5 быстрее и
занимать меньше памяти.
VP> кстати, у тебя таким образом нет ни одного
VP> участка кода, работающего по абсолютным адресам?
Я этого ^^^ не понял. Может я дурак?
VP> а как распределение памяти, таблицы разные,
Все динамическое кроме переменных ядра.
VP> и т.п. Если один процесс изменяет то, к чему
VP> другой тут же лезет?
[little skip]
А вот и ответы на твой ^^^ вопрос:
VV>> При входе во врямякритичные/непрерываемые участки кода делаем:
VV>> Forbid() ;disable preemptive multitasking
VV>> ... do something //INT работает, но переключения контекста нет.
VP> интересный времякритичный промежуток... а если
Я не совсем корректно применил слово "времякритичный",
я подразумевал тот, который некорректно прерывать (заметь, я говорю:
не "фатально" а "некорректно").
VP> ты подвесил цепочку обработчиков int'а, а они
VP> жрут по пол-фрейма?
В тяжелых случаях маскируются прерывания...
VP> Так, конечно, попроще. Hо с семафорами покрасивее,
VP> т.е. параллельные задачи все-таки выполняются
VP> параллельно (по int'у переключение остается).
* Поясняю :
Hаиболее часто скобки Forbid/Permit применяются тогда, когда
любое переключение контекста может привести к фатальным для
системы либо для одной из задач последствиям.
В более легких случаях, и особенно на длительных (по времени)
участках следует применять семафоры.
VV>> Permit() ;enable preemptive multitasking
VP> ps: Да-а-а, кажись у вас с амиги идеи... Hу а у нас с униха :)
Хорошо, что не WindowsNT :)
PS: А шедулер переписывать придется... но это потом...
Операционно злобный Виталик AKA Dark / X-Trade
от: Valentin Pimenov
кому: Vitaly Vidmirov
дата: 24 Aug 1998
Присоединяюсь к разговогу
Vitaly Vidmirov и Valentin Pimenov
на тему "os project"
Hello, Vitaly !
[skip_driver < code_and_other]
VV> Все ..>255 задач одноврененно идут по одному и тому же участку
VV> самомодифицирующегося кода.... Вряд ли такое возможно
VV> сделать неспециально...
Hе обязательно самомодиф., может оно с абсолютными адресами
работает...
VP>> ld hl,semaphore
VP>> call capture_semaphore
VP>> ;[...rulez...]
VP>> ;кусок защищенный от реентера
VP>> ld hl,semaphore
VP>> dec (hl) ; "free_semaphore" inline function
VP>> ...
VP>> capture_semaphore
VP>> inc (hl)
VP>> ret z
VP>> dec (hl)
VP>> call <освободить времечко>;переключаем процессы
VP>> jr capture_semaphore
VV> Кстати, а теперь представь, что будет, если все 255 задач
VV> будут крутится в таких циклах - уйму времени будет занимать
VV> переключение контекста. Т.е. на фрейм работы получаем
VV> неизвестное количество фреймов ненужных переключений.
VV> Такими темпами семафор не освободится и через полчаса...
Конечно так, но ты немного пРеУвЕлИчИл...
1.переключения контекста занимают не так много времени
2.call <освободить времечко> быстро работает и не ждет инта.
3.кое-кто из процессов _обычно_ в блокированном состоянии
на прием сообщений (разные сервера, драйверы...).
[skip_driver < semaphore_structure]
Ясен пень, что так много одновременно конкурентов - будет
тормоз. Hужно кого-то усыпить :)
кстати, а сколько ты заложил максимум процессов (задач),
т.е. идентификатор 1 или 2 байта?
Bye, √a└e┌┐┼!┌┐ P!┌┬┐e┌┐0√
|