Архитектура Windows 95/98. Установка и загрузка системы.
Архитектура Windows 9x.
Ядро Windows 3.1 состояло из трех составных частей - Kernel, User и GDI. Все три части были полностью 16-разрядными. В Windows 9х эти модули стали 32-разрядными, хотя система и сохранила в себе часть 16-разрядного кода.
Общая схема ядра Windows 9x показана на рис. ниже:
USER32
User32.dll и User.exe создают и контролируют окна на экране, выполняя все запросы по созданию, перемещению, изменению размеров и уничтожению окон. User.exe, кроме того, обрабатывает запросы, относящиеся к значкам и другим элементам интерфейса пользователя, а также переадресует события, порожденные различными устройствами ввода, соответствующим приложениям.
GDI32
Gdi32.dll и Gdi.exe контролируют интерфейс графических устройств (Graphics Device Interface - GDI). GDI выполняет графические операции при создании изображения на системном дисплее, принтере и других устройствах.
KERNEL32
Kernel32.dll выполняет базовые функции операционной системы, в том числе:
· управление памятью:
· файловый ввод/вывод;
· загрузку программы;
· выполнение программы.
И 16-разрядные компоненты
Из схемы видно, что Kernel32 никогда не обращается к Кеrnе116. Последний модуль задействуется только при загрузке Windows. При запуске Windows 9х загружает 32-разрядные виртуальные драйверы (*.vxd) для всех знакомых ей устройств, в противном случае остается драйвер 16-разрядного реального режима (*.drv).
Комбинация 16-разрядного и 32-разрядного кода позволяет сохранить совместимость с существующими приложениями и драйверами и одновременно увеличить производительность системы по сравнению с Windows 3.х. Для включения в Windows 95 16-разрядных компонентов есть три основные причины:
· код для 16-разрядных систем обеспечивает обратную совместимость с приложениями и драйверами, разработанными для Windows 3.х;
· в некоторых случаях 16-разрядный код выполняется быстрее, чем аналогичный 32-разрядный;
· 32-разрядный код требует больше памяти, чем эквивалентный 16-разрядный.
Подсистемы ввода/вывода и драйверы устройств, включая сетевые и файловые системы, являются полностью 32-разрядными, как и все компоненты управления памятью и планирования. Часто возникающая при этом проблема вызова 32-разрядной функции из 16-разрядного приложения (или наоборот) решается при помощи шлюзования.
Эта операция выполняется, когда операционная система преобразует вызов 16-разрядной функции в вызов 32-разрядной. Процессы Windows 95 и Windows NT не могут содержать одновременно и 16-разрядный, и 32-разрядный код. Шлюз позволяет коду с одной стороны границы вызывать код с другой ее стороны.
Итак, Windows 9х поддерживает два режима многозадачности :
· Кооперативный режим многозадачности является наследием Windows 3.х. Сама ОС не управляет переключением приложений Win16, это делают за нее сами приложения, которые по закольцованной цепочке передают друг другу управление (в этой очереди стоит и сама ОС). Активное в данный момент приложение распоряжается практически всеми системными ресурсами и передает управление другому приложению только по своей инициативе. Таким образом, приложение может выполняться сколь угодно долго, не передавая другим управление (вспомните операции с диском). Если же это приложение еще неправильно работает и может "зависнуть", то другие приложения никогда не получат управления, в т. ч. и ОС, что приведет к краху всей системы;
· Вытесняющий режим многозадачности отличается тем, что ОС может получить контроль над процессом без согласия выполняющего приложения (вытеснение). Процессорное время распределяется при помощи механизма приоритетов (0-32). Приоритеты могут динамичеки изменяться – например, если приложение А с низким приоритетом использует ресурс, нужный приложению В, которое имеет более высокий приоритет, то приоритет приложения А временно повышается, чтобы оно могло как можно быстрее освободить ресурс. Потом приоритет А вновь понижается.
При работе системы Windows 9x создается следующая виртуальная машина (для защиты адресного пространства и повышения стабильности системы):
Из схемы видно, что все приложения Win16 образуют один процесс (в NT каждое 16-разрядное приложение выполняется как отдельный процесс), каждое приложение MS-DOS и Win32 является отдельным процессом. Каждый процесс Win32 может в свою очередь породить несколько потоков.
Так как внутри процесса задачи Win16 выполняются в режиме кооперативной многозадачности (Windows 9x), при крахе одного из приложений Win16 могут "зависнуть" другие приложения Win16, а сама ОС и остальные процессы не должны повредится. Но в некоторых случаях могут "зависнуть" и остальные процессы (см. выше про кооперативный режим многозадачности).