Эмуляция нескольких ОС
Подсистемы окружения операционной системы NT реализованы
как системы типа клиент/сервер. Как часть процесса компиляции, прикладные
программы прикрепляются на этапе компоновки к API операционной системы,
который экспортируют подсистемы окружения ОС NT . Связывание на этапе
компоновки подключает прикладную программу к клиентским DLLs подсистем
окружения, которые осуществляют экспорт API. Например, Win32 программа
- это клиент подсистемы окружения Win32, поэтому она связана с клиентскими
DLL Win32, включая Kerael32.dll, gdi32.dll, и user32.dll. Программа POSIX
связана с клиентской DLL POSIX - psxdll.dll.
Клиентские DLL выполняют задачи от имени их серверов, но они выполняются,
как часть клиентского процесса. Как показано рис. 1, в некоторых случаях
пользовательская DLL может полностью реализовывать API без необходимости
обращения к помощи сервера; в других случаях сервер должен помочь. Помощь
сервера обычно необходима только когда должна быть модифицирована общая
информация, связанная с подсистемой окружения. Когда пользовательская
DLL требует помощи от сервера, DLL посылает сообщение, известное, как
вызов локальной процедуры (LPC) на сервер. Когда сервер завершает указанный
запрос и возвращает ответ, DLL может завершить функцию и возвратить управление
клиенту. И пользовательская DLL и сервер могут использовать «родной» API,
когда это необходимо. API подсистем окружения дополняют «родной» API специфическими
функциональными возможностями или семантикой.
Рис. 1