Системные вызовы в Windows - PullRequest
13 голосов
/ 03 мая 2010

Я просто хочу спросить, я знаю, что стандартные системные вызовы в Linux выполняются командой int, указывающей на таблицу векторов прерываний. Я предполагаю, что это похоже на Windows. Но как вы называете некоторые высокоуровневые системные подпрограммы? Например, как вы говорите Windows, чтобы создать окно? Я знаю, что это обрабатывается кодом в DLL, но что на самом деле произошло на уровне инструкции ассемблера? Подпрограмма в dll вызывает программное прерывание по инструкции int, или есть другой подход для обработки этого? Благодарю.

1 Ответ

7 голосов
/ 03 мая 2010

Выполнение вызова Win32 для создания окна на самом деле не связано с прерыванием. Клиентское приложение уже связано с .dll, предоставляющей вызов, который предоставляет адрес для использования компоновщиком. Поскольку вы спрашиваете о разнице в механизме вызовов, я ограничиваю здесь обсуждение теми вызовами Win32, которые доступны любому приложению, в отличие от вызовов уровня ядра или драйверов устройств. На уровне ассемблера это будет то же самое, что и любой другой вызов функции, поскольку большинство вызовов Win32 являются вызовами уровня пользователя, которые внутренне выполняют необходимые вызовы ядра. Компоновщик предоставляет адрес функции Win32 в качестве цели для некоторой инструкции ветвления, специфика будет зависеть от компилятора.

[Изменить] Похоже, вы правы насчет прерываний и инт. таблица векторов. У CodeGuru есть хорошая статья с подробностями ОС о том, как работают вызовы ядра NT. Ссылка:
http://www.codeguru.com/cpp/w-p/system/devicedriverdevelopment/article.php/c8035

...