Я просто хочу спросить, я знаю, что стандартные системные вызовы в Linux выполняются инструкцией int, указывающей на таблицу векторных прерываний. Я предполагаю, что это похоже на Windows. Но как вы называете некоторые системные подпрограммы более высокого уровня? Например, как вы указываете Windows для создания окна? Я знаю, что это обрабатывается кодом в dll, но что на самом деле происходит на уровне ассемблерных инструкций? Является ли процедура в dll вызовом программного прерывания с помощью инструкции int или существует какой-либо другой подход для обработки этого? Благодарю.
Системные вызовы в Windows
Ответ 1
Создание вызова Win32 для создания окна на самом деле не связано с прерыванием. Клиентское приложение уже связано с .dll, которое предоставляет вызов, который предоставляет адрес используемого компоновщика. Поскольку вы спрашиваете о разнице в механизме вызова, я ограничиваю здесь обсуждение тех вызовов Win32, которые доступны для любого приложения, в отличие от вызовов на уровне ядра или драйверов устройств. На уровне языка ассемблера он будет таким же, как и любой другой вызов функции, поскольку большинство вызовов Win32 представляют собой вызовы пользовательского уровня, которые внутренне выполняют необходимые вызовы ядра. Линкер предоставляет адрес функции Win32 в качестве цели для какой-либо инструкции ветвления, специфика будет зависеть от компилятора.
[Изменить]
Похоже, вы правы насчет прерываний и int. векторная таблица. CodeGuru имеет хорошую статью с подробностями ОС о том, как работает ядро NT. Ссылка:
http://www.codeguru.com/cpp/w-p/system/devicedriverdevelopment/article.php/c8035
Ответ 2
Win32 API - это слой, который работает в пользовательском режиме (кольцо 3). Windows использовала также поддержку уровня OS/2 и POSIX API, но они были изъяты из употребления и были удалены. Диспетчер окон - это чистый код режима пользователя, не задействованы вызовы ядра. Только вызовы API, которые используют ресурсы ядра (CreateThread, VirtualAlloc и т.д.), Вызывают в "настоящую" операционную систему (ntdll.dll) и ловушку в кольцо 0 с программным прерыванием (int 0x2e).