Сижу. Сомневаюсь. Начальные условия таковы: есть ядро, есть задачи. Задачи работают на меньшем уровне привелегий. Проблема - предоставить задачам сервисы ядра. Вобщем, как реализован механизм апи в той же винде - я не знаю. В доках рыть - некогда. Знаю лишь, что вызовы более привелигированных функций осуществляются через шлюзы. Логически рассуждая, селекторы шлюзов можно свести в общую таблицу и за каждой функцией ядра закрепить соответствующий индекс из этой таблицы. Шлюзы можно расположить как в LDT так и в GDT. И вот тут становится не понятно. Расположение в LDT затянет процесс инициализации задачи, и займет лишнюю память, зато GDT сохранит свою более-менее компактность. Если сделать наоборот, то будет наоборот. КАК? %)
Barbos Я счел накладным делать для каждой процедуры вентиль в GDT или LDT. Поэтому собрал все в один вентиль и повесил его в IDT. Теперь можно вызывать через int xx
ТОЧНА! Тогда само собой напрашивается решение: Код (Text): _DATA segment TableOfFunc label dword dd Func0 dd Func1 .... dd FuncN _DATA ends _TEXT segment ImplementAPI proc ;в EBX номер вызываемой ф-ции call [EBX*4+TableOfFunc] iretd ImplementAPI endp _TEXT ends Красиво и лаконично
Ага и еще ds проинициализировать подходящим селектором или делать вот так. Код (Text): call [CS:EBX*4+TableOfFunc]
Кстати, если аффтар не собирается делать каких-либо сложных завершающих действий или обращаться к данному сервису с помощью близких вызовов, скажем, в пределах ядра, то можно поразмышлять и о такой оптимизации. Код (Text): jmp [EBX*4+TableOfFunc]