Основные сведения об операционной системе Windows



Windows – это операционные системы защищенного режима (32-битные и 64-битные версии). Система безопасности этих операционных систем построена на разделении кода пользователя и системного кода. Код пользователя работает в режиме «user mode» и на него наложено множество ограничений. Системный код работает в режиме «kernel mode» и почти ничем не ограничен.

Основанная единица выполнения в Windows – это поток (по терминологии защищенного режима – задача). Потоки объединяются в процессы. В общем случае одна программа – это один процесс. В процессе может быть сколько угодно потоков. Каждый процесс обособлен от всех остальных. Это достигается за счет того, что у каждого процесса своя собственная виртуальная память. Тем не менее, если программе надо получить доступ в памяти других процессов, она может осуществить это через специальные системные сервисы.

Диспетчеризация потоков осуществляется на основе приоритетов. Приоритеты у потоков являются динамическими, т. е. могут меняться в зависимости от того, что делает поток. В некоторый момент времени процессором всегда выполняется поток с наибольшим приоритетом.

 

Память в Windows

Каждый процесс имеет свое собственное виртуальное адресное пространство. Адресное пространство любого процесса разбито на две равные части: память процесса и память системы. Младшие 2 Гбайт памяти являются памятью процесса, старшие 2 Гбайт – памятью системы. Память системы одна для всех процессов, она недоступна из режима пользователя «user mode» даже для чтения. Любое обращение к ней приводит к ошибке доступа и завершению приложения.

В некоторых случаях под память процесса выделяется 3 Гбайт памяти, а под память системы – 1 Гбайт. Так делается тогда, когда используются приложения, требовательные к памяти, которым 2 Гбайт памяти недостаточно. Для 64-битных систем этот метод потерял актуальность.

Адреса в диапазоне 0h – FFFFh никому не доступны. Эта память нужна для выявления нулевых указателей. Любой указатель, значение которого меньше 100000h, считается нулевым. Таким образом, каждому процессу в Win32 в общем случае доступно 2 Гбайт (за вычетом 64 Кбайт) виртуальной памяти.

 

Исполняемые компоненты Windows

В операционных системах (ОС) Windows имеется несколько типов исполняемых файлов. Все они имеют формат РЕ (Portable Executable). Наиболее часто используемые исполняемые компоненты в Windows: EXE (приложение), DLL (динамическая библиотека), SYS (драйвер). 

EXE-файлы – это самый распространенный тип исполняемых файлов в Windows. В них находятся программы. 

DLL-файлы – это динамически загружаемые библиотеки. В них хранятся функции и процедуры, которые могут использовать другие исполняемые компоненты. 

SYS-файлы – это файлы драйверов режима ядра. В них находится код нулевого кольца операционной системы.

Файлы формата РЕ состоят из заголовка и секций. Секция в РЕ-файле – это его основная составляющая единица. В заголовке содержатся основные характеристики файла и таблица секций. 

Рассмотрим базовые характеристики исполняемых файлов. Самые главные характеристики файла – точка входа и база образа, т. е. указание, по какому адресу должен быть загружен данный модуль. 

При создании исполняемого файла компоновщик должен вставить в код программы вместо меток конкретные адреса и подразумевает, что этот код будет загружен по некоторому базовому адресу. Загрузчик Windows должен знать, по какому адресу надо загрузить данный исполняемый файл, и именно для этого используется поле базы образа в заголовке исполняемого файла. Очень часто при загрузке файлов DLL и SYS адрес, указанный в поле базы образа, является уже занятым или просто недоступным. Если при загрузке исполняемого файла адрес, указанный в поле базы образа, уже занят, то он грузит файл по другому адресу и при этом загрузчику надо подправить в коде программы все обращения к данным. Для этого загрузчику будут нужны релокейшены. Релокейшены содержат информацию о командах, в которых есть обращения к памяти для поправки адресов. Точкой входа содержит адрес, с которого начнется выполнение исполняемого файла.

Каждый файл может иметь таблицу импорта и экспорта. С помощью таблицы импорта исполняемый файл может импортировать функции, которые находятся в других модулях, загруженных в текущее адресное пространство, и использовать эти функции как свои. Для того чтобы другие модули могли использовать функции из данного модуля, адреса этих функций должны быть прописаны в таблице экспорта.

Как было сказано выше, в заголовке PE-файла содержится таблица секций, она описывает каждую секцию в РЕ-файле: начало данных в секции, размер данных, адрес, куда должна быть спроецирована данная секция и ее характеристики. Наиболее часто в секциях находятся данные, код, импорты, экспорты и релокейшены.

Итак, файлы с расширением .EXE являются обычными программами. В 99,99 % случаев ЕХЕ-файл представляет процесс, в память которого он загружен. Файлы с расширением .DLL являются библиотеками, где содержатся функции, которые могут использовать другие программы или другие DLL. Файлы с расширением .SYS являются драйверами режима ядра. Код, содержащийся в них, выполняется на нулевом уровне привилегий, в режиме ядра. В файлах DLL и SYS точка входа указывает на инициализирующую функцию.

 

Системные библиотеки и подсистемы

В коде Win32, выполняемом в режиме пользователя, запрещены любые прямые обращения к устройствам и портам ввода-вывода. Это значит, что любые обращения к портам ввода-вывода, вызов прерываний и выполнение привилегированных инструкций приведут к ошибке и завершению программы. Обращение к памяти, на которую спроецированы регистры устройств, обращение к другим важным областям памяти (например, 0B8000h) ничего не даст. Без обращения к внешним устройствам и портам ввода-вывода польза от программ, работающих в третьем кольце, нулевая. Для того чтобы они могли обратиться к внешним устройствам и наладить взаимодействие с «окружающим миром», операционная система предоставляет программам API-функции (Application Program Interface).

Программирование в Windows основывается на использовании интерфейса прикладного программирования API. Он предоставляет программисту набор готовых классов, функций, структур и констант. Их количество составляет около двух тысяч. API-функции обеспечивают взаимодействие приложения с внешними устройствами и ресурсами операционной системы.

Все API-функции содержатся в системных DLL-библиотеках. Самые главные из DLL-библиотек: 

1) kernel32.dll – взаимодействие с системой;

2) user32.dll – пользовательский интерфейс;

3) gdi32.dll – графика.

Библиотека kernel32.lib предназначена для работы с объектами ядра операционной системы, ее функции позволяют управлять памятью и другими системными ресурсами. Библиотека user32.lib отвечает за окна и интерфейс пользователя, в ней сосредоточены функции для управления окнами, обработки сообщений, работы с меню, таймерами и т.п. Библиотека gdi32.dll обеспечивает графический интерфейс операционной системы. В состав библиотеки входят функции управления выводом на экран монитора, управления выводом принтера, функции для работы со шрифтами и т. п.

Функции библиотеки kernel32.dll в основном являются оболочками вокруг функций из ntdll.dll.

Функции из библиотеки ntdll.dll являются переходниками к функциям ядра Windows. Эти функции принимают параметры, подготавливают их к вызову команды «sysenter». Библиотека ntdll.dll – важнейший компонент пользовательской подсистемы Windows и является основополагающей для всех подсистем, так как именно через нее пользовательский код может взаимодействовать с кодом ядра. Эта библиотека загружается в память любого процесса одной из первых и всегда по одному и тоже адресу. Библиотека kernel32.dll является основополагающей для подсистемы Win32. Она загружается во все процессы Win32 одной из первых (после ntdll) и всегда по одному и тому же адресу.

 

Модель вызова функций в Win32

В системах Win32 при вызове всех системных функций используется модель вызова stdcall. 

Согласно этой модели параметры функций передаются через стек в обратном порядке. При этом за очистку стека от параметров ответственна вызываемая функция. Например, если у функции есть три параметра, то вызов по соглашению stdcall будет выглядеть так:

Push param3

Push param2

Push param1

Call FunctionAddr

Результат выполнения функции будет содержаться в регистре ЕАХ.

При использовании API-функций следует помнить, что они сохраняют значение не всех регистров общего назначения. Соглашение stdcall предусматривает сохранение содержимое регистров ЕВХ, ESI, EDI и ЕВР. При написании функций обратного вызова также надо обязательно сохранять содержимое этих регистров, поскольку код системных функций не ожидает их изменения.

 

Выполнение программ в Win32

При загрузке исполняемого файла загрузчик Windows выполняет такие действия:

1) создает для файла виртуальное адресное пространство размером 4 Гбайт, причём нижние 2 Гбайт из них доступны приложению;

2) загружает системные библиотеки ntdll.dll, kernel32.dll и библиотеки, указанные в таблице импорта файла;

3) создает первичный поток процесса, который начинает свое выполнение с точки входа программы.

Во время выполнения процесса, вернее, его потоков, ему запрещены какие-либо обращения к портам ввода-вывода и вызов каких-либо прерываний, запрещена работа с привилегированными регистрами и выполнение привилегированных команд. Чтобы программы могли работать с внешними устройствами, Windows предоставляет им API-функции, позволяющие им работать с внешними устройствами, взаимодействовать с системой, а также друг с другом. API-функции находятся в системных библиотеках. Каждая функция, которая работает с ресурсом, охраняемым системой (файлы, процессы, устройства и т. д.), вызывает соответствующую функцию ядра системы.

Резюмируем все вышесказанное. Операционная система помещает программу в некоторое изолированное адресное пространство, разрешая ей взаимодействовать с «внешним миром» посредством функций (системных сервисов), которые сама же и предоставляет. Операционная система избавляет программиста, который пользуется ассемблером, от множества забот, которые вообще-то не должны его касаться. Например, от работы с системными регистрами и структурами, взаимодействия с внешними устройствами, реализации работы с файловой системой и т. д. 

В связи с этим программирование на ассемблере под Win32 намного легче. Например, при работе с файлами программисту не нужно заботиться о том, какая же модель жесткого диска установлена на компьютере: достаточно просто вызывать функции, которые предоставляет операционная система, а она уже сама разберется со всеми проблемами.

 

Типы структур программ Windows

Возможны три типа структур программ для Windows:

1) диалоговая (основное окно – диалоговое);

2) консольная;

3) классическая (GUI, graphical user interface).

Диалоговые приложения для Windows имеют минимальный интерфейс связи с пользователем и передают информацию посредством диалоговых окон (например, окна сообщения MessageBox).

Консольные приложения представляет собой программу, работающую в текстовом режиме. Работа консольного приложения напоминает работу MS-DOS. Но это лишь внешнее впечатление. Консольное приложение обеспечивается специальными функциями Windows. Диалог с пользователем ведется посредством консоли. Примером консольного приложения является Far.

Оконные приложения строится на базе набора функций API, составляющих графический интерфейс пользователя GUI. Главным элементом такого приложения является окно. Окно может содержать элементы управления: кнопки, списки, окна редактирования и др. Эти элементы, по сути, также являются окнами, но обладающими особыми свойствами. События, происходящие с этими элементами (и самим окном), приводят к приходу сообщений в процедуру окна. Диалог с пользователем ведется посредством графического интерфейса.

 


 


Дата добавления: 2018-06-27; просмотров: 2101; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!