Лекция №16. Структура виртуального адресного пространства процесса

Структура виртуального адресного пространства процесса

А) Серверные версии ОС (Win 2k Advanced Server)

Б) ”Десктопные” (Win NT/2k)

В) Win 95/98/ME

В ОС Windows (32 bit) пользователь может выделить блок памяти, располагающийся по непрерывным адресам, размером ~2-3 ГБ в зависимости от настройки в реестре. Системный код ОС помещается (проецируется) в адресное пространство процесса (в его сегмент 4 ГБ).

В Win 98/ME не используется защита памяти от ошибочных или злонамеренных действий пользователя.

Для выделения памяти в 2 ГБ следует использовать функцию VirtualAlloc.

Пример:

Поиск простых чисел методом решета Эратосфена.

int main (int args, char *args[]){

BOOL bSuccess;

SYSTEM_INFO sSysInfo;

// ввод размера массива флагов в 1MБ

MAXNUM *= numMB; //размер массива в байтах

GetSystemInfo(&sSysInfo);

dwPageSize = sSysInfo.dwPageSize;

/*

Резервирование блока памяти размером MAXNUM в произвольной области виртуальной памяти процесса.

*/

arr = (LPSTR)VirtualAlloc(NULL, MAXNUM, MEM_RESERVE,

PAGE_NOACCESS);

// NULL – адрес, MAXNUM – размер, MEM_RESERVE – область памяти,

// PAGE_NOACCESS – доступ

if (arr = = NULL) ExitProcess(-1);

else printf(“VirtualAlloc Succeeded\n”);

/*

Вся виртуальная память процесса разделена на страницы, которые находятся в следующем состоянии:

· free – свободная (доступ к таким страницам запрещен). При обращении к таким страницам возникает страничное прерывание.

· reserve – зарезервированная (OC подготавливает необходимые управляющие структуры для этих страниц, но физическая память не выделена, и возникает страничное прерывание).

· committed – выделенная (страница присутствует в физической памяти, при обращении прерывание не происходит).

*/

_ _try {

//начало блока структурированной обработки исключений

for (i=0; i<MAXNUM; i++) { num=i; arr[num]=0; }

for (i=2; i<MAXNUM; i++) {

num=i;

if (arr[num]) continue;

printf(“%d\n”, i);

for (j=i*2; j<MAXNUM; j+=i) { num=j; arr[num]=1; }

}

}

/*

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

*/

_ _except(PageFaultException(GetExceptionCode()))

{

ExitProcess(-2)

}

/*обработка исключительной ситуации находится в обработчике

_ _except(PageFaultException())

*/

/*

Стандартная конструкция C++ для перехвата исключений try/catch/finally

catch(ExceptionType C) {…}

В отличие от обработки исключений в языке C++, фильтр исключения (см. _ _except(PageFaultException())) содержит выражение, вычисляемое в момент исключения. Значение этого выражения управляет передачей управления.

Также используются _ _finally, _ _leave.

_ _finally выполняется всегда после try (не смотря на то, произошло ли исключение, или нет).

Специальные ключевые слова, обрабатываемые компилятором:

GetExceptionCode()

GetExceptionInformation()

*/

}

INT PageFaultException(DWORD dwCode) {

LPVOID lpvResult;

DWORD comsize;

if (dwCode!= EXCEPTION_ACCESS_VIOLATION)

return EXCEPTION_EXECUTE_HANDLER;

if (MAXNUM-num>dwPageSize)

comSize = dwPageSize

else comSize=MAXNUM-num;

lpvResult = VirtualAlloc(&arr[num], comSize, MEM_COMMIT,

PAGE_READWRITE);

if (lpvResult = = NULL) return EXCEPTION_EXECUTE_HANDLER;

return EXCEPTION_CONTINUE_ EXECUTION;

}

/* в отличие от обычных обработчиков исключений, здесь определена семантика продолжения обработки (EXCEPTION_CONTINUE_ EXECUTION)

EXCEPTION_CONTINUE_ SEARCH – продолжает искать следующий фильтр.

Глобальная переменная num используется для передачи информации об адресе, в котором возникло исключение. В общем случае получить этот адрес можно с помощью GetExceptionInformation()

*/

Пример:

Файлы, отображаемые в память

1) hMapFile = CreateFileMapping(hFile,

NULL, // безопасность

PAGE_READWRITE, // доступ

0, 0, // размер объекта и файла

''Name'');

2) lpMapAddress = MapVievOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0);

3) *((LPDWORD) pMapAddress)

MapFile можно использовать для доступа к области памяти другого процесса (разделение файла между процессами); упрощает доступ к файлу (не нужно использовать ReadFile, WriteFile, достаточно использовать разадресацию).

Средства ввода/вывода

Классификация устройств:

· Блок-ориентированные

· Байт-ориентированные

· Другие

Как адресовать регистры контроллера?

· Move (отображение на память)

Достоинства: удобство

Недостатки: сокращается объем доступной памяти, устройства ввода/вывода имеют более низкое быстродействие, чем обмен между процессором и памятью, поэтому используются специальные приёмы (представление окружающего адресного пространства как более медленной шины, для чего используются мосты чипсета).

· In/out (специальное пространство ввода/вывода)

Достоинства: упрощается программная организация.

Как организовать программное взаимодействие с устройствами ввода/вывода?

· Циклический опрос

Недостатки: неэффективное использование шины ЦП.

· Прерывания

· Использование DMA (Direct Memory Access)

В задачу контроллера прямого доступа входит передача блока памяти из контроллера внешнего устройства по заданному адресу физической памяти. Эти контроллеры сами обрабатывают прерывания, выполняют захват системной шины и передачу данных, а затем уведомляют ЦП по прерыванию о завершении ввода/вывода.

Архитектура ПО ввода/вывода

Система обработки прерываний должна быть скрыта как можно глубже в недрах ОС.

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

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

Системные вызовы (OpenFile, CreateFile, WriteFile)

Библиотечная функция (RTL). В любом языке программирования имеется поддержка функций библиотеки времени исполнения RunTimeLibrary (printf, scanf и т.д.). Функции библиотеки RTL используют функции вызовов интерфейсов прикладного программирования API. В C++ функции потокового вывода <<, >> основаны на printf, scanf.

Можно сократить размер файла, работая напрямую с вызовами API (если, например, использовать функции ввода/вывода API, не подлинковывая соответствующие функции RTL (scanf, printf)).

Файловая система

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

Файл может идентифицироваться по имени. Обычно файлы могут иметь одинаковые имена. Уникальность файла определяется составным именем, включающим символьные имена каталогов. Файл может идентифицироваться уникальным дескриптором (если файловая система представлена в виде сети, тогда файл может находиться в нескольких каталогах сразу).

Типы файлов:

· Файлы, ассоциированные с устройствами ввода/вывода

· Каталоги

Существует 2 способа управления правами доступа:

· Избирательный

· Мандатный

Логическая и физическая организация файлов

Каталоги файлов хранят атрибуты файла и прочую информацию о нём.

Наполнение файла – логическая организация файла:

· Последовательность байт

· Последовательность блоков переменной длины

· Упорядоченная или неупорядоченная последовательность ключей

 
 


Физическая организация:

· Последовательность блоков (непрерывное размещение)

+: простота

–: фрагментация

· Связанный список блоков

+: простота механизма

–: 1) большое время доступа (все блоки нужно последовательно перебрать)

2) информация о следующем блоке является частью блока

· Связанный список индексов (File Allocation Table – FAT)

+: быстродействие (достигается тем, что все таблицы находятся в памяти)

–: повреждение FAT приводит к повреждению ОС

· Непосредственное перечисление блоков

13 полей описывают размер файла. Если размер не умещается в 10 блоков, то следующее поле указывает адрес следующих 256 блоков. Почти такая же организация присуща NTFS.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: