-
Notifications
You must be signed in to change notification settings - Fork 1
1. Управление виртуальной памятью: распределение памяти сегментами по запросам: схема преобразования виртуального адреса, способы организации таблиц сегментов, стратегии выбора разделов памяти для загрузки сегментов, алгоритмы и особенности замещения сегментов.
2. Управление памятью сегментами по запросам в архитектуре X86. Тип организации таблиц сегментов. Формат дескриптора сегмента в таблицах дескрипторов сегментов (GDT и LDT) (код и заполнение дескрипторов GDT из лабораторной работы по защищенному режиму).
Стали делить память на страницы. Можно выполнить программу, которая находится не целиком в памяти. Для этого нужно содержать части кода с которыми в текущий момент работает процессор. Это воплотилось в понятие виртуальная память.
Виртуальная память – память, размер которой превышает размер реального физического пространства.
Страница – является единицей физического деления памяти. Её размер устанавливается системой. У страницы размер не обязательно 4Кб. Просто такой размер оптимален по количеству страничных прерываний.
Сегмент – является единицей логического деления памяти. Его размер определяется объемом кода. Любой сегмент создается такого размера, который требуется программе.
Виртуальный адрес делится на 2 части – сегмент + смещение. В процессоре должен существовать начальный адрес таблицы сегментов.
В дескрипторе сегмента присутствует поле, определяющее размер сегмента. При сегментном преобразовании необходимо проверять, не вышел ли процесс за собственное адресное пространство.
Одна единая таблица которая содержит все дескрипторы сегментов и выполняемых программ, при этом у каждого такого сегмента в системе существует одно единственное имя, которое и является идентификатором дескриптора таблицы. В этом случае такой дескриптор должен содержать список прав доступа для всех процесов которые могут использовать данный сегмент. Такой список прав доступа может быть очень большим. Понятно, что такая система не является гибкой, все процессы обращаются к сегменту по одному единственному его имени.
Локальные таблицы, то есть каждый процесс (его адресное пространство разбито на сегменты, соответсвтенно каждое такое локальное адресное пространство имеет свою локальную таблицу дескрипторов. Для того чтобы другие процессы могли обратиться к этому же сегменту этот сегмент должен иметь дескриптор в соответствующих локальный таблицах. То есть для того чтобы процесс смог обращаться к сегментам других програм, эти сегменты должны быть описаны в их локальных таблицах, но при этом получается, что один сегмент в системе может иметь несколько разных имён. Это безусловно усложняет работу с сегментами в системе.
Локальные таблицы и глобальная таблица. При этом локальные таблицы описывают адресное пространство процессов, но дескрипторы этих локальных таблиц ссылаются на дескрипторы глобальной таблицы.
Если какой-то сегмент нужно загрузить, значит один нужно выгрузить. Выгрузка сегментов выполняется по тем же принципам, что и в страницах.
-
Выталкивание случайного сегмента.
- Самый простой способ реализации - первая попавшаяся
- Недостатки:
- может быть вытолкнут часто использующийся сегмент либо только что загруженный
-
Алгоритм FIFO: вытеснение сегмента, который дольше всего находится в памяти. Способы: временная метка (вытеснение с меньшей временной меткой) либо ведется связный список. Этот алгоритм исключает возможность выгрузки только что загруженного сегмента, но не исключает выгрузку часто использующегося.
-
Алгоритм LRU (Least Recently Used): выталкивание того, что дольше всех не использовался. Можно использовать временные метки (но надо постоянно обновлять при каждом обращении), либо можно использовать связные списки (перемещаем в начало при обращении).
Этот способ обладает свойством включения (Если какой-тое сегмент выбран при реализации с объемом памяти M, то эот же сегмент при той же трактории будет выбран, если память M + 1 страниц)
LRU относится к классу стековых алгоритмов. Затраты на реализацию огромные, в чисто виде не используется.
-
Алгоритм LFU - least frequency used. "Наименее часто использующийся в последнее время". В этом алгоритме есть стратегия - контролируется частота использования страниц. Но, наименее часто использованной может оказаться только что загруженная страница. То есть она еще не успела набрать частоту обращений. Поэтому вероятность того, что она будет вытолкнута весьма.
-
Алгоритм NUR (Not Used Recently): Аппроксимация LRU
Для более простой реализации:
- Когда сегмент загружается в память бит = 1
- При обращении бит = 1
- Периодически все сбрасывается в 0
- Когда требуется вытеснить сегмент, вытесняется первый с битом = 0
В архитектуре x86 в защищенном режиме сегментная адресация памяти. Каждый сегмент описывается дескриптором.
Три вида системных таблиц:
- GDT (глобальная дескрипторная таблица)
- LDT (локальная)
- IDT (таблица векторов прерываний)
GDT (global descriptor table) - таблица глобальных дексрипторов, которые описывают сегменты физической памяти. Линейный адрес начала этой таблицы лежит в регистре GDTR (GDT register).
LDT (local descriptor table) - таблица локальных дескрипторов (для каждого процесса своя), которые описывают сегменты памяти.
Для обращения к какому-либо сегменту используются селекторы: селектор помещается в сегментный регистр и имеет следующий вид:
где TI - table indicator (при значении 0 - GDT, 1 - LDT (local descriptor table)), RPL - requested privilege level (0-3).
Схема получения дескриптора на примере GDT с помощью селектора:
Формат дескриптора сегмента в таблицах дескрипторов сегментов (GDT и LDT) (код и заполнение дескрипторов GDT из лабораторной работы по защищенному режиму).
Структура дескриптора:
Байты атрибутов:
№ | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
2 | G | D | 0 | AVL | lim | |||
1 | P | DPL | S | тип сегмента | A |
G - бит гранулярности (0 - память сегмента измеряется в байтах, 1 - в страницах (по 4кб))
D - разрядность операндов (0 - 16разрядные, 1 - 32разрядные)
AVL - отдан ОС
P - бит присутствия (1 - если сегмент в оперативной памяти, 0 - иначе)
DPL - уровень привилегий (0 - уровень привилегий ядра, 3 - пользовательский/приложений, 1-2 - не используется в системах общего назначения)
S - system (0 - системный объект, 1 - обычный)
A - при первом обращении к сегменту устанавливается в 1
Структура, описывающая дескриптор.
descr struc
limit dw 0
base_l dw 0
base_m db 0
attr_1 db 0
attr_2 db 0
base_h db 0
descr ends
Начальные значение для дескрипторов GDT
;GDT
gdt_null descr <>
gdt_code16 descr <code16_size-1,0,0,98h>
gdt_data4gb descr <0FFFFh,0,0,92h,0CFh>
gdt_code32 descr <code32_size-1,0,0,98h,40h>
gdt_data32 descr <data_size-1,0,0,92h,40h>
gdt_stack32 descr <stack_size-1,0,0,92h,40h>
gdt_video16 descr <3999,8000h,0Bh,92h>
Заполнение дескрипторов GDT (на примере дескриптора code32
. Для остальных линейный адрес начала заполняется аналогично)
; в реальном режиме; code32 - имя сегмента,
; который содержит код для выполнения в защищенном режиме
mov ax, code32
shl eax, 4
mov word ptr gdt_code32.base_l, ax
shr eax, 16
mov byte ptr gdt_code32.base_m, al
mov byte ptr gdt_code32.base_h, ah