Распределение оперативной памяти Для загрузки операционная система Windows 98 используют операционную систему MS DOS 7.0 (MS DOS 98), и в случае если в секции [Options] файла MSDOS.SYS имеется строка BootGUI = 0, процессор работает в обычном реальном режиме. Распределение памяти в MS DOS 7.0 такое же, как и в предыдущих версиях DOS. Однако при загрузке интерфейса GUI перед загрузкой ядра Windows 98 процессор переключается в защищенный режим работы и начинает распределять память уже с помощью страничного механизма.
Приложения и подсистемы Windows 98 (за исключением ядра) никогда не работают с физической памятью. Разделение на виртуальную и физическую память является ключевым аспектом работы системы. Приложения и подсистемы Windows 98 имеют дело с определенными интерфейсами прикладного программирования и виртуальными адресными пространствами. Базовая система работает как с физической памятью, так и с виртуальными адресными пространствами.
В основе поддержки виртуальных машин и виртуального адресного пространства, которую обеспечивает операционная система Windows 98, лежит работа с реальной (физической) памятью компьютера, ограниченной в своих размерах. Операционная система выгружает неактивные страницы памяти виртуальных адресных пространств выполняющихся процессов из оперативной памяти на диск и загружает страницу, запрошенную при выполнении текущей команды. Другими словами, загрузка страницы в оперативную память осуществляется по требованию, как это принято в большинстве операционных систем, использующих страничный механизм организации виртуальной памяти. В то же время, освобождается оперативная память от неактивных страниц группами по нескольку страниц за одну операцию. Реализованный в операционной системе Windows 98 алгоритм замещения представляет собой стандартную дисциплину LRU (Least Recently Used — дольше других неиспользуемый), заключающуюся в освобождении тех страниц физической памяти, которые дольше других не использовались.
Многие страницы физической памяти компьютера не участвуют в замещении, они распределены постоянно. Их занимают, в частности, резидентные компоненты ядра. На эти цели отводится примерно один мегабайт памяти. За оставшуюся физическую память конкурируют различные программы: динамически загружаемые компоненты системы и загружаемые виртуальные драйверы устройств, код и данные приложений, а также динамически размещаемые данные, такие как области кэширования, необходимые для работы файловой системы, и буферы прямого доступа к памяти (DMA).
В отличие от тех мультитерминальных систем, в которых операционная система должна заботиться о равноправном совместном использовании ресурсов, в системе Windows 98 сделано иначе. Поскольку это однопользовательская ОС, она позволяет заполнять память так, как это нужно пользователю и его программам. Динамически загружаемые компоненты системы конкурируют за память с прикладными программами. Если пользователь хочет, чтобы его приложение работало быстрее, ему будет позволено занять столько памяти, сколько вообще возможно. Система накладывает ограничение на максимальный объем памяти, который может быть отдан в распоряжение отдельных приложений, — если не следить за этим, становится возможным возникновение тупиковых ситуаций. После того как вся физическая память заполнена, первый же новый запрос на выделение памяти инициирует замещение страниц. Интересным побочным эффектом такого подхода является то, что у приложений нет надежного способа определения объема памяти, доступного в системе. Функция API GlobalMemorySatus() возвращает целый ряд параметров, характеризующих состояние системной памяти, однако это не более чем «мгновенный снимок» текущей обстановки — еще один вызов этой функции вполне может дать другие значения.
Страницы поступают в память и уходят из нее по-разному: в большинстве случаев они либо непосредственно размещаются в выделенной для этого памяти (как результат соответствующих запросов), либо загружаются при старте программы из ЕХЕ-файла приложения. Впоследствии эти страницы начинают перемещаться между физической памятью и файлом подкачки. Страницы, в которых содержится только код 32-разрядных приложений и динамически связываемых библиотек (DLL), система всегда загружает только из исходных исполняемых файлов.
Для того чтобы облегчить управление всем разнообразием типов страниц памяти, каждая активная страница, то есть каждая страница, которая является частью выполняющегося в данный момент системного модуля или приложения, снабжена хранящимся совместно с ней страничным дескриптором (Page Descriptor, PD). В этом дескрипторе содержатся адреса процедур, которые занимаются перемещением страницы из памяти на диск и обратно. Независимо от того, что именно находится в данной странице, диспетчер физической памяти, чтобы переместить страницу в оперативную память или из нее, просто вызывает соответствующую функцию, адрес которой определен в поле дескриптора страницы. В случае, если некоторая страница еще никогда не заполнялась, она называется абсолютно чистой (virgin). Например, именно так обозначаются страницы, содержащие код, использующий вызовы Win32. После того как с момента размещения страницы в памяти в нее будет в первый раз произведена запись данных, она считается испорченной (tainted) и может быть либо грязной (dirty), либо чистой (clean), в зависимости от того, осуществлялась ли в нее запись с момента последней ее подкачки в физическую память. Если запись в эту страницу производилась, и в этой физической странице требуется разместить иную виртуальную страницу, ее содержимое должно быть сохранено в файле подкачки.
Использование так называемой плоской модели памяти, когда программист может использовать только один сегмент кода и один сегмент данных, которые имеют максимально возможные размеры, определяемые системными соглашениями операционной системы, приводит к тому, что с точки зрения программиста память получается неструктурированной. Программы используют классическую малую (small) модель памяти. Каждая прикладная программа определяется 32-разрядными адресами, в которых сегмент кода имеет то же значение, что и сегменты данных. Единственный сегмент программы отображается непосредственно в область виртуального линейного адресного пространства, которая, в свою очередь, состоит из 4-килобайтных страниц.
В операционной системе Windows 98 младшие адреса виртуального адресного пространства совместно используются всеми процессами. Это сделано для совместимости с драйверами устройств реального режима, резидентными программами и некоторыми 16-разрядными программами Windows. Безусловно, это плохое решение с точки зрения надежности, поскольку оно приводит к тому, что любой процесс может непреднамеренно (или же, наоборот, специально) испортить компоненты, находящиеся в этих адресах.
В Windows 98 каждая 32-разрядная прикладная программа выполняется в собственном адресном пространстве, но все они используют совместно один и тот же 32-разрядный системный код. Доступ к чужим адресным пространствам в принципе возможен. Другими словами, виртуальные адресные пространства не задействуют всех аппаратных средств защиты, заложенных в микропроцессор. В результате неправильно написанная 32-разрядная прикладная программа может привести к аварийному сбою всей системы. Все 16-разрядные прикладные программы Windows разделяют общее адресное пространство, поэтому они уязвимы друг для друга.
Модель распределения адресного пространства в Windows 98 такова:
Собственно системный код Windows 98 размещается выше границы 2 Гбайт. В пространстве с отметками 2 и 3 Гбайт находятся системные библиотеки DLL, используемые несколькими программами. В 32-разрядных микропроцессорах семейства i80x86 имеется четыре уровня защиты, именуемые кольцами с номерами от 0 до 3. Кольцо с номером 0 является наиболее привилегированным, то есть максимально защищенным. Компоненты операционной системы Windows 98, относящиеся к кольцу 0, отображаются на виртуальное адресное пространство между 3 и 4 Гбайт. К этим компонентам относятся собственно ядро Windows, подсистема управления виртуальными машинами, модули файловой системы и драйверы виртуальных устройств (VxD).
Область памяти между 2 и 4 Гбайт адресного пространства каждой 32-разрядной прикладной программы совместно используется всеми 32-разрядными прикладными программами. Такая организация позволяет обслуживать вызовы API непосредственно в адресном пространстве прикладной программы и ограничивает размер рабочего множества. Однако за это приходится расплачиваться снижением надежности. Ничто не может помешать программе, содержащей ошибку, произвести запись в адреса, принадлежащие системным библиотекам DLL, и вызвать крах всей системы.
В области между 2 и 3 Гбайт также находятся все запускаемые 16-разрядные прикладные программы Windows. С целью обеспечения совместимости эти программы выполняются в совместно используемом адресном пространстве, где они могут испортить друг друга.
Адреса памяти ниже 4 Мбайт также отображаются в адресное пространство каждой прикладной программы и совместно используются всеми процессами. Благодаря этому становится возможной совместимость с существующими драйверами реального режима, которым необходим доступ к этим адресам. Это делает еще одну область памяти не защищенной от случайной записи. К самым нижним адресам (менее 64 Кбайт) этого адресного пространства 32-разрядные прикладные программы обращаться не могут, что дает возможность перехватывать неверные указатели, но 16-разрядные программы, которые, возможно, содержат ошибки, могут записывать туда данные.
Вышеизложенную модель распределения памяти можно проиллюстрировать с помощью рисунка:
4 Гбайт
Системные компоненты, относящиеся к кольцу защиты 0
Адреса между 2 и 4 Гбайт отображаются в адресное пространство каждой 32-разрядной программы и используются совместно
3 Гбайт
Системные библиотеки DLL, прикладные программы Win16, совместно используемые библиотеки DLL
2 Гбайт
Прикладные 32-разрядные программы
В этой области адресного пространства у каждой прикладной программы располагается свое собственное адресное пространство, невидимое для других программ
4 Мбайт
Компоненты реального режима
Эта область используется всеми процессами
64 Кбайт
Особенности файловой системы Основной файловой системой для Windows 98 является FAT32. Эта файловая система является расширением файловой системы FAT.
Файловая система FAT (File Allocation Table — таблица размещения файлов) получила свое название благодаря простой таблице, в которой указываются:
непосредственно адресуемые участки логического диска, отведенные для размещения в них файлов или их фрагментов;
свободные области дискового пространства;
дефектные области диска (эти области содержат дефектные участки и не гарантируют чтение и запись данных без ошибок).
В файловой системе FAT дисковое пространство любого логического диска делится на две области: системную область и область данных.
BR
RSec
…
FAT1
FAT2
RDir
Каталоги и файлы
Системная область
Область данных
Системная область логического диска создается и инициализируется при форматировании, а в последующем обновляется при работе с файловой структурой. Область данных логического диска содержит обычные файлы и файлы-каталоги; эти объекты образуют иерархию, подчиненную корневому каталогу. Элемент каталога описывает файловый объект, который может быть либо обычным файлом, либо файлом-каталогом. Область данных, в отличие от системной области, доступна через пользовательский интерфейс операционной системы. Системная область состоит из следующих компонентов (расположенных в логическом адресном пространстве друг за другом):
Вся область данных разбивается на кластеры. Кластер представляет собой один или несколько смежных секторов в логическом дисковом адресном пространстве (точнее — только в области данных). Кластер — это минимальная адресуемая единица дисковой памяти, выделяемая файлу (или некорневому каталогу). Кластеры введены для того, чтобы уменьшить количество адресуемых единиц в области данных логического диска.
Каждый файл занимает целое число кластеров. На дискетах кластер занимает один или два сектора, а на жестких дисках его размер зависит от объема раздела. В таблице FAT кластеры, принадлежащие одному файлу (или файлу-каталогу), связываются в цепочки. Для указания номера кластера в файловой системе FAT32 используется 32-разрядное слово, в котором учитываются фактически только 28 разрядов, следовательно, можно иметь до 228 = 268435456 кластеров (с номерами от 0 до 268435455). Номера кластеров соответствуют элементам таблицы размещения файлов.
Логическое разбиение области данных на кластеры как совокупности секторов взамен использования одиночных секторов имеет следующий смысл:
прежде всего, уменьшается размер самой таблицы FAT;
уменьшается возможная фрагментация файлов;
ускоряется доступ к файлу, так как в несколько раз сокращается длина цепочек фрагментов дискового пространства, выделенных для него.
Однако слишком большой размер кластера ведет к неэффективному использованию области данных, особенно в случае большого количества маленьких файлов. В среднем на каждый файл теряется около половины кластера. Следовательно, что при размере кластера в 32 сектора, то есть 16 Кбайт, средняя величина потерь на файл равняется 8 Кбайт, и при 20000 файлов потери могут составлять около 155 Мбайт.
В связи с тем, что таблица FAT используется при доступе к диску очень интенсивно, она обычно загружается в оперативную память (в буферы ввода-вывода или в кэш) и остается там настолько долго, насколько это возможно. Если таблица большая, а файловый кэш, напротив, относительно небольшой, в памяти размещаются только фрагменты этой таблицы, к которым обращались в последнее время.
В связи с чрезвычайной важностью таблицы FAT она обычно хранится в двух идентичных экземплярах, второй из которых непосредственно следует за первым. Обновляются копии FAT одновременно. Если первый экземпляр по каким-либо причинам окажется разрушенным, то произойдет обращение ко второму экземпляру.
Структура загрузочной записи для FAT32:
Смещение поля, байт
Длина поля, байт
Обозначение
поля
Содержимое поля
00h (0)
3
JUMP 3EH
Безусловный переход в начало системного загрузчика
03h (3)
8
Системный идентификатор
0Bh (11)
2
SelectSize
Размер сектора, байт
0Dh (13)
1
ClastSize
Число секторов в кластере
0Eh (14)
2
ResSecs
Число зарезервированных секторов, для FAT32 равно 32
10h (16)
1
FATcnt
Число копий FAT
11h (17)
2
RootSize
0000h
13h (19)
2
TotSecs
0000h
15h (21)
1
Media
Дескриптор носителя
16h (22)
2
FATsize
0000h
18h (24)
2
TrkSecs
Число секторов на дорожке
1Ah (26)
2
HeadCnt
Число рабочих поверхностей
1Ch (28)
4
HidnSecs
Число скрытых секторов (располагаются
перед загрузочным сектором). Используется при загрузке для вычисления абсолютного смещения корневого каталога и данных.
20h (32)
4
Число секторов на логическом диске
24h (36)
4
Число секторов в таблице FAT
28h (37)
2
Расширенные флаги
2Ah (38)
2
Версия файловой системы
2Ch (39)
4
Номер кластера для первого кластера корневого каталога
34h (43)
2
Номер сектора с резервной копией загрузочного сектора
36h (54)
12
Зарезервировано
Загрузочная запись для диска с FAT32 занимает три сектора. Резервная загрузочная запись располагается, как правило, в секторах 7-9.
Загрузчик ос windows Vista/7 Одно из них — способ управления загрузчиком Windows, программой, которая обеспечивает хранение более одной операционной системы на...
Как установить программу Skype на компьютер Если Вы устанавливаете Skype для Windows, то для работы Skype на Вашем компьютере должна быть установлена операционная система Windows...