реализация API

Тема в разделе "WASM.NT.KERNEL", создана пользователем Barbos, 26 май 2008.

  1. Barbos

    Barbos Slavon

    Публикаций:
    0
    Регистрация:
    13 ноя 2007
    Сообщения:
    280
    Адрес:
    Kharkov
    Сижу. Сомневаюсь.
    Начальные условия таковы: есть ядро, есть задачи. Задачи работают на меньшем уровне привелегий. Проблема - предоставить задачам сервисы ядра.
    Вобщем, как реализован механизм апи в той же винде - я не знаю. В доках рыть - некогда. Знаю лишь, что вызовы более привелигированных функций осуществляются через шлюзы. Логически рассуждая, селекторы шлюзов можно свести в общую таблицу и за каждой функцией ядра закрепить соответствующий индекс из этой таблицы. Шлюзы можно расположить как в LDT так и в GDT. И вот тут становится не понятно. Расположение в LDT затянет процесс инициализации задачи, и займет лишнюю память, зато GDT сохранит свою более-менее компактность. Если сделать наоборот, то будет наоборот.
    КАК? %)
     
  2. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Barbos
    Я счел накладным делать для каждой процедуры вентиль в GDT или LDT. Поэтому собрал все в один вентиль и повесил его в IDT. Теперь можно вызывать через int xx
     
  3. Barbos

    Barbos Slavon

    Публикаций:
    0
    Регистрация:
    13 ноя 2007
    Сообщения:
    280
    Адрес:
    Kharkov
    ТОЧНА!
    Тогда само собой напрашивается решение:
    Код (Text):
    1. _DATA    segment
    2. TableOfFunc label dword
    3. dd Func0
    4. dd Func1
    5. ....
    6. dd FuncN
    7. _DATA    ends
    8.  
    9. _TEXT    segment
    10. ImplementAPI    proc ;в EBX номер вызываемой ф-ции
    11.     call [EBX*4+TableOfFunc]
    12.     iretd
    13. ImplementAPI    endp
    14. _TEXT    ends
    Красиво и лаконично:)
     
  4. Barbos

    Barbos Slavon

    Публикаций:
    0
    Регистрация:
    13 ноя 2007
    Сообщения:
    280
    Адрес:
    Kharkov
    И в винде похожая реализация:)
    Немного нашел по теме
    http://www.realcoding.net/article/view/3654
     
  5. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    и в никсах тоже.
     
  6. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    только ebx не мешало бы проверить перед call
     
  7. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Ага и еще ds проинициализировать подходящим селектором или делать вот так.
    Код (Text):
    1. call [CS:EBX*4+TableOfFunc]
     
  8. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Кстати, если аффтар не собирается делать каких-либо сложных завершающих действий или обращаться к данному сервису с помощью близких вызовов, скажем, в пределах ядра, то можно поразмышлять и о такой оптимизации.
    Код (Text):
    1. jmp [EBX*4+TableOfFunc]
     
  9. Barbos

    Barbos Slavon

    Публикаций:
    0
    Регистрация:
    13 ноя 2007
    Сообщения:
    280
    Адрес:
    Kharkov
    ну, проверить EBX, инициировать DS и, на закуску, оптимизировать это уже дело техники:)
    Спасибо