mov AX,1
xchg AX,[BX]
Если в результате в AX будет 0, то значит, семафор был свободен, и мы его заняли, а если 1 - значит был занят и надо еще подождать.
ОС вынимает из ловушки первый адрес и по call передает туда управление, когда управление вернется, ОС продолжает просмотр ловушки.
Мы можем завершить запрос ввода/вывода (выполнить соответствующие действия). Потом делаем jmp, как будто бы ОС заставила драйвер обработать новый запрос. Все будет так же, как и в первый раз, но после команды старт попадем опять на границу U/S.
Есть соблазн запихнуть в режим ядра как можно больше всего: работу с окнами, графикой, файловый процессор и т.д. для повышения быстродействия. Но тогда время обработки запросов приложений в режиме ядра будет слишком большим, а то и вообще система перестанет работать. Выход - идеология микроядра.
IO$READ + NoWait
Теперь возникает другая проблема - неблокирующий запрос выполнен, а как узнать, успешно ли он завершен? Это знает только драйвер.
Решение - в контексте задачи создается буфер IOSB (Input Output Status Block), в который драйвер помещает результаты выполнения операции. Это же происходит и при блокирующий запросах, но все это делается неявно.
Итак, для выполнения операции нужно следующее:
1. Запрос (код операции, параметры)
2. Координаты запроса (FCB, #LBN, длина)
3. Адрес буфера
4. IOSB
5. Объект синхронизации.
Необходимо присвоить каждому набору данных имя и дать возможность:
1. автору определить это имя
2. по имени найти набор данных
Страницы: 1, 2, 3, 4, 5, 6