Как приложение общается с Windows

Смотрите. Я пишу Win32 приложение. Обращаюсь к функциям Win API. Для меня все просто - компилятор сам обеспечивает вызов. Но - суть вопроса - а как компилятор узнает, где живут функции API? Я вижу два варианта - либо есть какой-то фиксированный адрес. Но это вряд ли, в защищенной-то системе. И вторая версия - при запуске Windows передает приложению какой-то указатель. Короче, кто-нибудь знает, как это устроено?

Дополнено (1). Еще раз акцентирую внимание. Мне нужно узнать именно то, что многоуважаемый Дед Мазай в своем ответе (см. Ответ многоуважаемого Деда Мазая) обозначил как "программисту не обязательно это знать". Я, в общем-то, с ним до сегодняшнего дня был согласен. Но сегодня мне эта информация как раз понадобилась. К тому и вопрос. Считайте, что я хочу написать программу без компилятора, в машинных кодах (могу я себе позволить маленький такой каприз). И мне нужно получить доступ к функциям WIN API.

Программа на C/C++ через библиотеки импорта ссылается на стандартные системные DLL Windows. Функции в этих DLL описаны в документации как функции Windows API. Посмотри описание функций в документации, там всегда указана DLL.

Как эти DLL вызывают ядро ОС - это тема внутреннего устройства Windows. Программисту не обязательно это знать.

Компилятор не знает, где находятся библиотечные функции. Компилятор видит только заголовочные файлы. Из них он узнаёт о существовании этих функций, об их параметрах и о способе передачи параметров. Для компилятора это внешние функции. Подключение библиотек (в том числе библиотек импорта) - это работа линковщика.

В интернете есть книга
Рихтер Джеффри. Создание эффективных Win32-приложений с учетом специфики 64-разрядной версии Windows
Там подробно рассказано о способах подключения DLL. И ещё много чего (что я не знаю).

Типичная информация из документации по WinAPI:
Library Kernel32.lib -- библиотека импорта. Через неё подключается DLL
DLL Kernel32.dll -- DLL, в которой содержится функция.

Условная адресация. Обращается по смещению наасколько я помню.

Функции WinAPI в библиотеке WinAPI. Куда они дальше обращаются вряд ли известно это уже внутренняя архитектура ОС. Может это даже каким копирайтом защищено. Но принцип тот же - цепочка библиотек (включая драйверы), вызывающих друг друга.
Есть еще стандартные функции BIOS для работы с железом. Они в справочниках есть. Винда их мало использует, у нее свои драйвера для этого. Но если самому систему писать, то можно использовать для стандартных операций.

Добавить комментарий