Расширение функций доски отладки (или уже консоли)
Posted: Sat Mar 11, 2017 1:08 am
Я уже заикался на форуме про эти расширения. И так. Раньше у нас была доска отладки с функциями записи и чтения байта. Теперь же, при желании, программа может попросить свою личную доску отладки, причём получит сразу две
Аналог stdin и stdout. В одну пишет, из другой читает. Ну и, конечно, ядро запустит приложение kcon, которому даст те же stdin и stdout, только в обратном направлении. Если наша консольная прога запустит ещё кого-то, то потоки в/в наследуются, и прога будет писать в ту же консоль. Так же прога может запустить кого-то с другими stdin/out, если укажет флаг 4 в структуре ФС. Ну и если окно консоли закрыли, то все приложения, связанные с ней(хоть через 10 перенаправлений) получат событие 4.
Теперь оно извещает о том, что нужно завершиться. Правда его нужно вечно проверять, когда ждёшь ввод от юзера. Не очень мне это нравится, но лучше не придумал.
kcon по сути является тем же board, только оно сначала регистрируется как консоль(иначе не будут посылаться сообщения 4) и весь ввод переправляет в stdout.
В архив положил ядро, kcon, исходники изменённых файлов в ядре(ревизия ядра 6843, в свн сейчас была ревизия 6877 - не очень пока понял, что важнее указывать
). Так же примеры консольных прог - ввод с клавы, увеличение символа на 1 и вывод (прога T); дважды запуск предыдущего T с перенаправление(то есть ввод будет на 2 увеличиваться) (прога TS). Что бы всё работало нужно скопировать в /sys/ новое ядро и прогу KCON.
Ну и тут выложу основную часть моего "TODO" листа. С API, надеюсь, понятней будет. Где стоит V - то уже работает.
V.1 запись байта
V.2 чтение байта
V.3 попросить консоль(создаёт в/в, запускает процесс-консольГУИ(KCON) с тем же
в/в(но в обратном направлении))
V.4 узнать свои потоки в/в(*) out: al = output board, ah = input board
V.5 освободить консоль(даёт проге доску 0) in: ecx=0/1 - out/inp
V.6 зарегиcтрироваться как консоль(если завершиться, то пошлёт всем с
этими же в/в сообщ 4)
V.7 создать доску (без создания консоли. если просто создать, но не никому
не дать, то она так и будет занимать место в памяти, пока
кто-то не захочет создать ещё доску)
V.8 установить свои стд в/в. (ch - inp, cl - out)
.9 запись потока(эн байт или до 0) (ecx=size or 0(asciiz), edx=pointer)
.10 чтение потока(всё или до 0) (ecx= 0/1 << 31 + max size,
edx= pointer)
V модификация ф70.7 - наследовать в/в новым процессам
V сообщение 4 о завершении приложения
V модификация функции завершения процесса: если это была консоль, то послать всем прогам с той же доской
сообщение 4 о завершении работы (**)
V модификация при создании процесса: если доска не 0, то увеличить число процессов у доски
V модификация ф70.7 - запустить с другими стд потоками в/в и флаг перенаправления в/в
flags = 0x04 - redirect std output/input (boards)
byte fs+12 - доска вывода
byte fs+13 - доска ввода
новая функция - проверить код выхода для процесса N (eax = SLOT или PID)
модификация ф-1 - завершиться с кодом
массив кодов выхода для слотов(256*dword). Когда прога звершилась, то записывается 0 или код выхода
маловероятно, чтобы программа завершилась, а вторая(с тем же слотом!!!) успела так же завершиться
перезаписать код выхода до того, как кто-то прочитает код выхода первой
Что ещё... Совместимость осталась. В свн пока рановато - слишком сыро. В планах устроить чтение-запись массивов байт(подфункции 9, 10), сделать возможность вернуть код по завершению проги. KCON пока - это просто чуть-чуть доделанная и заметно подрезанная довольно старая версия board(что нашёл на компе
), потому нужно её доводить до ума. Перевести на UTF8(я так понял, потихоньку переходим?), новее шрифты, настройки и прочее... только если честно - никакого желания этим заниматься. Пока просто планирую ядерные функции довести до ума.
![Smile :)](./images/smilies/icon_smile.gif)
Теперь оно извещает о том, что нужно завершиться. Правда его нужно вечно проверять, когда ждёшь ввод от юзера. Не очень мне это нравится, но лучше не придумал.
kcon по сути является тем же board, только оно сначала регистрируется как консоль(иначе не будут посылаться сообщения 4) и весь ввод переправляет в stdout.
В архив положил ядро, kcon, исходники изменённых файлов в ядре(ревизия ядра 6843, в свн сейчас была ревизия 6877 - не очень пока понял, что важнее указывать
![Smile :)](./images/smilies/icon_smile.gif)
Ну и тут выложу основную часть моего "TODO" листа. С API, надеюсь, понятней будет. Где стоит V - то уже работает.
Spoiler:
ядро:V.1 запись байта
V.2 чтение байта
V.3 попросить консоль(создаёт в/в, запускает процесс-консольГУИ(KCON) с тем же
в/в(но в обратном направлении))
V.4 узнать свои потоки в/в(*) out: al = output board, ah = input board
V.5 освободить консоль(даёт проге доску 0) in: ecx=0/1 - out/inp
V.6 зарегиcтрироваться как консоль(если завершиться, то пошлёт всем с
этими же в/в сообщ 4)
V.7 создать доску (без создания консоли. если просто создать, но не никому
не дать, то она так и будет занимать место в памяти, пока
кто-то не захочет создать ещё доску)
V.8 установить свои стд в/в. (ch - inp, cl - out)
.9 запись потока(эн байт или до 0) (ecx=size or 0(asciiz), edx=pointer)
.10 чтение потока(всё или до 0) (ecx= 0/1 << 31 + max size,
edx= pointer)
V модификация ф70.7 - наследовать в/в новым процессам
V сообщение 4 о завершении приложения
V модификация функции завершения процесса: если это была консоль, то послать всем прогам с той же доской
сообщение 4 о завершении работы (**)
V модификация при создании процесса: если доска не 0, то увеличить число процессов у доски
V модификация ф70.7 - запустить с другими стд потоками в/в и флаг перенаправления в/в
flags = 0x04 - redirect std output/input (boards)
byte fs+12 - доска вывода
byte fs+13 - доска ввода
новая функция - проверить код выхода для процесса N (eax = SLOT или PID)
модификация ф-1 - завершиться с кодом
массив кодов выхода для слотов(256*dword). Когда прога звершилась, то записывается 0 или код выхода
маловероятно, чтобы программа завершилась, а вторая(с тем же слотом!!!) успела так же завершиться
перезаписать код выхода до того, как кто-то прочитает код выхода первой
![Smile :)](./images/smilies/icon_smile.gif)