2 Slaval
Все впорядке. Если я обидел - извините. Рилакс. Это просто текст. ТЕКСТ на экране. Кучка разноцветных пикселей. А я просто не могу спокойно обсуждать животрепещущую тему.
А может быть
It's just one of those days. Where ya don't wanna wake up Everything is fu*ed, everybody su*s. You don't really know why. But you wanna justify rippin' someone's head off. It's just one of those days! It's all about the he said she said bull shit...
забудьте про модулу и аду =) и про паскаль=)). И не надо вспоминать это.
Да и камень жирный больно нужен для таких целей
0. Контроллер прерывания (если много источников прерывания).
1. Буфер со страничной организацией (лучшее решение для сетевых систем) в возможностью переключать заданную страницу буфера на отображенную память. Или использовать DMA (чаще для сетевых) т.к. не известны физические страницы - буфера юзер.мод. - типа запросов receive().
2. фифо менеджер буфера.
3. Синхронизация доступа памяти девайс - драйвер и синхронизация с завершением обработки иср.
и собственно pci ядро.
Но к сожалению жирность камня на котором это реализуется такая большая, что он не помещается на pci карте.
тяжко весь сетевой стек реализовывать на ПЛИС
А придется.
хотелсь все попростецки
По простецки все хорошо выходит на Visual Basic.
Да вы скажите наконец какой камень то?
Ну нихрена себе кусок рилтайм ОС!!!!
Блин, ну написано же в заголовке - InterruptController!!
Вам правда нужен кусок ос? Зачем вам это так нада?=)) Ок. Режим работы процессора - анреал. Дата производства кода - 2001 =)) упрощенная аналогия DPC-IRQ.
7. Менеджер прерываний
У контроллера прерываний есть недостаток: он блокируется при выполнении ISR для менее приоритетных прерываний. И получается, что ISR менее приоритетного прерывания должно ожидать завершение работы ISR более приоритетных прерываний.
При поступлении прерывания нужно лиши фиксировать факт прихода прерывания, разблокировать контроллер а затем уж приступать к обработке прерывания в обычном потоке , который может прерываться IRQ любого уровня.
это реализуется моим менеджером прерываний: (см kernel.asm)
сформируем в памяти стек, например в сегменте 5000h следующим образом
Стек задач (2 задачи добавлены в стек)
ES->+--------------+
| |
+--------------+ <==SI-6 флаги будующей задачи
|
?? |
+--------------+ <==SI-4 сегмент будующей задачи
|
?? |
+--------------+ <==SI-2 смещение будующей задачи
|
?? |
+--------------+ <==SI (Указатель стека задач)
| TASK2 FLAGS |
+--------------+ <==SI+2 сегмент задачи
| TASK2 SEGMENT|
+--------------+ <==SI+4 смещение задачи
| TASK2 OFFSET |
+--------------+ <==SI+6 флаги предидущей задачи
| TASK1 FLAGS |
+--------------+
| TASK1 SEGMENT|
+--------------+
| TASK1 OFFSET |
+--------------+ <= 0FFFFh
рис. 5
сегмент ES - сегмент где располагается стек прерываний
этот сегмент заполняется снизу - со смещения FFFFh вверх
параметры прерывания - элементарная ячейка состоит из
а)флагов прерывания
б)сегмента, где располагается драйвер
в)смещения драйвера
переменная TSP - (Task Stask Pointer) указывает на позицию прерывания, которое было
добавленно в стек последним
@SYSLOOP:
; jmp @SYSLOOP
@EMPTYTEST:; проверка на наличие задач
cmp TSP,0FFFFh ; нет задач? (стек задач пуст)
je @HALT
jmp @PROCESS
@HALT: ; задач нет - останавливаем процессор и ждем прерываний
hlt
jmp @EMPTYTEST
обработка задач. Прочессор в свободное время будет занят двумя вещами:
поиск, исполнение и удаление завершившихся задач
@PROCESS: ; ищем поставленные задачи и чистим стек задач от завершившихся
test ES:[TSP],WORD PTR TASK_TERMINATED ; смотрим флаги задачи
jc @REMTASK
@EXEC: ; запуск дравера
mov ES:[TSP],WORD PTR TASK_TERMINATED ; пометим задачу как завершившуюся
call CS:[TSP+2] ; дальний косвенный вызов драйвера
jmp @SYSLOOP
@REMTASK: ; удаление задачи из стека задач
add TSP,6
jmp @EMPTYTEST
листинг 3 Реализация менеджера прерывания.
каждый ISR должен быть составлен по следующему правилу, которое
заключается в добавлении "записи" в стек задач.
ISRX proc
PUSHA
MOV AX,5000h
MOV ES,AX
; резервируем место для задачи
sub TSP,6
; добавляем задачу
mov ES:[TSP+4],offset DRIVERX
mov ES:[TSP+2],CS ; WORD PTR SEG DRIVERX
mov ES:[TSP+0],WORD PTR TASK_RING0
;
POPA
; завершающие действия ISR
; ...
iret
ISRX endp
листинг 4. добавление задач.