Привет, LOR!
У меня небольшой творческий крысис, суть такова:
- в течение нескольких месяцев планирую зарелизить BuguRTOS-1.0.0 и окончательно перейти на семантическое версионирование;
- сделано это будет на основе текущей ветки (0.9.х);
- в будущем BuguRTOS будет представлять собой что-то вроде xenomai, только для микроконтроллеров;
- то есть будет относительно маленькое портируемое ядрышко, к которому можно будет прикручивать разные RTOS API;
- дальше хочу но основе BuguRTOS сделать микроядро b4 (набор костылей и велосипедов в духе L4);
Почему?
Интересно же!
Так вот на пути к b4 есть определенные проблемы:
- есть системные вызовы BGRT_SYSCALL_SYNC_OWN и BGRT_SYSCALL_SYNC_TOUCH, которые повышают приоритет задачи до высшего и делаются перед вызовом BGRT_SYSCALL_SYNC_SLEEP;
- есть итерационные системные вызовы BGRT_SYSCALL_SYNC_SLEEP, BGRT_SYSCALL_SYNC_WAKE, BGRT_SYSCALL_SYNC_WAIT, их надо вызывать в цикле, пока завершаются со статусом BGRT_ST_ROLL;
- пока все это работает в закрытой системе (монолитная прошивка микроконтроллера) и использыется API ядра, проблем нет;
- но это не годится для проекта микроядра, т.к. «неправильное использование» этих системных вызовов может приветси к DoS;
Решение этой проблемы я вижу в том, чтобы:
- не использовать BGRT_SYSCALL_SYNC_TOUCH в микроядре;
- переписать BGRT_SYSCALL_SYNC_OWN так, чтобы в случае неудачи происходил вызов BGRT_SYSCALL_SYNC_SLEEP и задача блокировалась;
- скрыть от пользователя итерационную природу BGRT_SYSCALL_SYNC_SLEEP, BGRT_SYSCALL_SYNC_WAKE, BGRT_SYSCALL_SYNC_WAIT, то есть пользователь должен делать один вызов, а цикл должен делать диспетчер системных вызовов без участи пользователя;
С последним пунктом самое интеерсное, ибо цикл можно сделать за счет:
- подмены адреса возврата в стеке прерванной задачи (грязненько!!!);
- в ядре с вытеснением в одной точке (замедлит обработку некоторых прерываний);
- сделать ядро полностью вытесняемым с исполнением в отдельном потоке(надо писать слой виртуализации прерываний, замедлит обработку нектороых прерываний, надо память под стек потока ядра);
Что из этого выбрать???
Можете считать голосовалкой...