Всем ОС-писателям :) А давайте (+)
Начальные данные:
1. Платформа IA-32
2. Не используем SYSENTER/SYSEXIT комманды
3. Система поддерживает процессы и потоки
4. У каждого процесса свое адресное пространство
5. Пространство процесса разделено пополам: для приклада и системы
6. Один процессор
7. У процессов и потоков нет такого понятия как очередь сообщений (как в виндах)
8. Переключение контекстов может происходить в двух случаях:
- сразу после перехода процессора в режим ядра
- перед выходом из режима ядра
Будем разбирать следующее поведение:
а) конкурентные вызовы прикладами системы
1. Поток1 вызывает систему SysCall1
2. Сохраняем состояние Потока1
3. Что-то делаем
4. Необходимо переключение контекстов (Поток2)
5. Переключаем контекст
6. Востаналиваем состяние Потока2
7. Выходим в пользовательский режим
8. Поток2 вызывает систему SysCall2
b) асинхронный вызов приложения для уведомлении о каком-то событии (вызов CALLBACK функции пользователького приложения из режима ядра)
1. Приходит асинхронное событие (прерывание)
2. Переходим в режим ядра
3. Определяем что надо уведомить Поток1 в Процессе1
4. Переключаемся в Поток1 Процесса1
5. Формируем в ползовательском стеке Потока1 необходимый фрагмент для возврата в режим ядра после окончания CALL BACK функции
6. устаналиваем в контексте Потока1 адрес на CALLBACK функцию
7. выходим из режима ядра
Здесь начинаются варианты:
х1 - код CALLBACK функции правильный, он выполняется и возвращает управление системе.
х2 - код CALLBACK функции правильный, но ему необходимо дернуть систему SysCall3 для получения каких-то данных, после чего вернет управление системе.
п - код CALLBACK функции плохой и не возвращает управление, может дергать систему, а может и нет.
Вот интересно было бы услышать кто и как реализует или планировал это реализовать применительно к архитектуре Интела и с одним TSS для всех приложений. Что храним в стеке, сколько стеков, как они связываются, какие возможности Интела используются, какие данные привязываются к процессу/потоку.
С уважением,
Валерий.
ЗЫ. Сорри, что так много.
айда ось со мной писать..дай асю