Я просто хочу спросить, я знаю, что стандартные системные вызовы в Linux выполняются инструкцией int, указывающей на таблицу векторных прерываний. Я предполагаю, что это похоже на Windows. Но как вы называете некоторые системные подпрограммы более высокого уровня? Например, как вы указываете Windows для создания окна? Я знаю, что это обрабатывается кодом в dll, но что на самом деле происходит на уровне ассемблерных инструкций? Является ли процедура в dll вызовом программного прерывания с помощью инструкции int или существует какой-либо другой подход для обработки этого? Благодарю.Системные вызовы в Windows
ответ
Создание вызова Win32 для создания окна на самом деле не связано с прерыванием. Клиентское приложение уже связано с .dll, которое предоставляет вызов, который предоставляет адрес используемого компоновщика. Поскольку вы спрашиваете о разнице в механизме вызова, я ограничиваю здесь обсуждение тех вызовов Win32, которые доступны для любого приложения, в отличие от вызовов на уровне ядра или драйверов устройств. На уровне языка ассемблера он будет таким же, как и любой другой вызов функции, поскольку большинство вызовов Win32 представляют собой вызовы пользовательского уровня, которые внутренне выполняют необходимые вызовы ядра. Компоновщик предоставляет адрес функции Win32 в качестве цели для какой-либо инструкции ветвления, специфика будет зависеть от компилятора.
[Изменить] Похоже, вы правы в отношении прерываний и инт. векторная таблица. CodeGuru имеет хорошую статью с подробностями ОС о том, как работает ядро NT. Ссылка:
http://www.codeguru.com/cpp/w-p/system/devicedriverdevelopment/article.php/c8035
Win32 API - это слой, который работает в пользовательском режиме (кольцо 3). Windows использовала также поддержку уровня OS/2 и POSIX API, но они были изъяты из употребления и были удалены. Диспетчер окон - это чистый код режима пользователя, не задействованы вызовы ядра. Только вызовы API, которые используют ресурсы ядра (CreateThread, VirtualAlloc и т. Д.), Вызывают в «настоящую» операционную систему (ntdll.dll) и ловушки в кольцо 0 с программным прерыванием (int 0x2e).
Это не совсем вся история. Поскольку NT4 оконный менеджер был в модели ядра (win32k.sys), и у него есть целая куча системных вызовов, чтобы вызвать его. Еще до этого он жил в CSRSS, и вам приходилось звонить через ядро, чтобы добраться до него (используя LPC), поэтому был задействован ядро. Кроме того, Windows не использовала int 0x2e для перехода в режим ядра некоторое время. Это зависит от того, на какой архитектуре вы находитесь, но обычно она использует sysenter для перехода в режим ядра на x86. – Stewart
- 1. Системные вызовы Windows-программ
- 2. Системные вызовы в windows & Native API?
- 3. Все системные вызовы требуют SSDT в Windows?
- 4. Системные вызовы и системные программы
- 5. Системные вызовы в Perl
- 6. Системные вызовы в Unix
- 7. Сборочные и системные вызовы
- 8. Системные вызовы завершаются
- 9. windbg log системные вызовы
- 10. Системные вызовы, управляющие каталогами
- 11. Системные вызовы с c
- 12. Системные вызовы, сделанные KVM
- 13. Системные вызовы C++ «SED»
- 14. Системные вызовы от php
- 15. Системные вызовы труб
- 16. Параллельные системные вызовы в Linux
- 17. Системные вызовы ОС в x86
- 18. Системные вызовы в OS/161
- 19. Как анализировать системные вызовы в Windows с помощью Java?
- 20. C системные вызовы, удалите файл
- 21. Системные вызовы Linux возвращают значение
- 22. Как системные вызовы прерываются сигналом?
- 23. qtscript engine - делать системные вызовы
- 24. Linux: Системные вызовы для кого
- 25. Как использовать системные вызовы C++
- 26. LTTng 2.0: системные вызовы sys_unknown
- 27. Дескрипторы файлов и системные вызовы
- 28. C Системные вызовы и сообщения
- 29. Системные вызовы используют какой режим?
- 30. OS-независимые системные вызовы LLVM IR
Да, я знаю, что у dll есть необходимые звонки внутри, я написал это. Но, в основном, все, о чем я прошу,: есть ли процедура dll для рисования системных вызовов Windows в виде программных прерываний или, если нет, как это сказать ядру окна, чтобы сделать окно? Поймите, насколько я знаю, вы не можете переключаться с места, в котором ваша программа работает иначе, чем int-инструкция, связанная с ringl evel limitaion. –
b-gen-jack-o-neill: AFAIK ядро не несет ответственности за управление окнами. –
На новых процессорах вместо команды прерывания программного обеспечения с инструкцией INT используются команды sysenter/sysexit. Концепция такая же, это способ переключения в режим ядра. Окно не управляется в ядре, но вы не найдете системный вызов CreateWindow, вместо этого он построен поверх множества других системных вызовов, включая связь с другими процессами - например, оконный менеджер – nos