art_zh ! Вы то как раз хорошо выразили свою мысль, только Вас несколько "неудачно" поняли, что и привело к несколько странному спору! Но речь не об этом ... Вашу идею не так уж трудно реализовать - надо в таймер добавить код вроде (только на ассемблере
):
Code: Select all
extern timer_callback_t timer_cb[TIMER_CB_MAX]; /* TIMER_CB_MAX == 16 : вполне достаточно */
void timer_iirq_handler()
{
/*... */
for (int i = 0; i < TIMER_CB_MAX; i++)
{
if (timer_cb[i] != NULL) timer_cb[i]();
}
/* ... */
}
А для драйверов ввести функцию, позволяющую добавлять и удалять обратные вызовы в timer_cb[TIMER_CB_MAX].
Если же говорить о конкретной теме, то я за системный вызов, позволяющий мультиплексировать обработчик таймера по принципу:
Code: Select all
static int multiplex_index = 1; /* Предполагается, что таймер работает с частотой multiplex_index*100 */
static int multiplex_i = 0;
void timer_iirq_handler()
{
if (multiplex_i == 0)
{
multiplex_i = multiplex_index - 1;
... Старый код здесь ...
... А также новый:
if (timer_cb[i] != NULL) timer_cb[i]();
} else {
multiplex_i--;
if (timer_cb[i] != NULL) timer_cb[i]();
} /* if ... else */
}
P.S.
Что касается безопасности, то у меня приходят на ум три меры:
-1- вынести из корневой директории всё, что не запускается по умолчанию, но поместить туда все драйверы;
-2- на уровне файловой системы запретить какой-либо иной доступ к этой директории, за исключением запуска приложений и загрузки драйверов (т.е. файловый менеджер даже не должен видеть содержимое корневой директории загрузочного диска);
-3- запретить что-то грузить в ring-0 приложениям, не загруженным из корневой директории методом авто-загрузки;