|
В защищенном режиме , доступ к памяти осуществляется либо через глобальную таблицу дескрипторов GDT ,
либо через локальную таблицу дескрипторов LDT . Эти таблицы представляют из себя массивы сегментных
дескрипторов . В состав дескриптора входит сегментный селектор . Для доступа в сегмент на уровне байтов ,
нужен селектор и смещение . Адрес самой GDT находится в регистре GDTR , адрес LTD - в LDTR .
Кроме сегментов кода , данных и стека , имеется также т.н. сегмент TSS - task-state segment .
Также имеется набор из 4 групп специальных дескрипторов , называемых гейтами :
call gate, interrupt gate, trap gate, task gate.
Процедуры могут располагаться в различных кодовых сегментах , которые имеют различные уровни привилегий.
Проверка соответствия этих уровней , прав и выдача сегментных адресов в соответствии с этими правами
осуществляется через гейты .
TSS включает в себя информацию о регистрах , сегментных селекторах и указателей на стековые регистры .
Сегментный селектор для текущего процесса хранится в регистре TR . При переключении задач процессор
выполняет следующее :
1. Сохраняет состояние текущего процесса в текущей TSS.
2. Загружает TR , в котором находится селектор новой задачи .
3. Загружает TSS
4. Грузит регистры из ТСС
Внешние прерывания , программные прерывания и исключения управляются из таблицы IDT .
IDT - это коллекция гейтов .
Доступ в память осуществляется либо напрямую , с помощью линейного адреса , либо через виртуальную
память . Виртуальная память имеет постраничную организацию . Адрес виртуальной страницы состоит из 2 частей :
одной page directory и набора page tables . Адрес page directory помещается в регистр CR3 .
При виртуальной адресации,линейный адрес разбивается на 3 части - page directory, the page table, page frame.
Каждый процесс имеет свою собственную page directory.
Существуют 4 базовых регистра для управления памятью :
GDTR, LDTR, IDTR, TR
В GDTR хранится адрес GDT.
В LDTR хранится адрес LDT. При переключении задач адрес сегмента новой задачи загружается
из этой таблицы .
Контрольные регистры
CR0, CR1, CR2, CR3,CR4
определяют режим работы процессора и характеристику текущего процесса .
Приложение , которое выполняется не в привилегированном режиме , не может читать или писать из этих регистров.
|
|
MEMORY MANAGEMENT
На рисунке показано , как логический адрес переводится в физический .
Логический адрес состоит из сегментного селектора и смещения . Сегментные селекторы хранятся в GDT .
В состав сегментного селектора входит структура , которая называется сегментным дескриптором .
В эту структуру входят размер сегмента , права и привилегии сегмента и адрес самого сегмента.
Смещение логического адреса добавляется к адресу самого сегмента - получили линейный адрес .
Если пэйджинга нет , линейный адрес равен физическому адресу.Каждый сегмент разделен на страницы по 4 кб .
В модели памяти,называемой basic flat model , нет сегментов . В этой модели нужно создать 2 дескриптора -
на сегмент кода и сегмент данных . Размер сегмента ограничен 4 гигами . ROM располагается в верхних адресах
памяти , RAM - в нижних
В модели памяти , называемой protected flat model . Минимально здесь определены 4 сегмена - код и данные
c 3-м уровнем привилегий , а также код и данные c 0-м уровнем привилегий .
В модели памяти , называемой multisegment model , каждый процесс имеет собственную таблицу сегментных
дескрипторов и собственные сегменты .
При пэйджинге происходит разбиение адресного пространства на страницы . В защищенном режиме оно ограничено
сверху 4 гигами . Адреса находятся в диапазоне от 0 до FFFFFFFFH . Память может быть как на чтение , так и на
запись . Логический адрес состоит из 16-битного сегментного селектора и 32-битного смещения .
Логический адрес переводится в 32-битный линейный адрес .
Существуют 6 сегментных регистров - кодовый CS , дата DS ,стек SS , 3 кодовых ES , FS , GS .
Хотя в системе могут одновременно существовать тысячи сегментов , одновременно доступ можно иметь не более
чем к 6 . Загрузку сегментных регистров можно делать 2 способами :
1. Прямая загрузка через MOV,POP,LDS,LES,LSS,LGS,LFS.
2. Через вызовы CALL,JMP,RET
Сегментные дескрипторы - это структуры данных в GDT или LDT . Обычно они генерятся компиляторами , загрузчиками,
операционными системами , но не приложениями . Может быть только 1 GDT и несколько LDT . Дескриптор каждой LDT
входит в GDT .
Линейное адресное пространство , доступное в линуксе , простирается до 4 гигов . Физической памяти , как правило ,
меньше , а иногда значительно меньше . Линукс тем не менее благодаря принципам виртуальной памяти позволяет
делать маппинг этого линейного пространства на доступную физическую память . При недостатке физической памяти
происходит своппинг с диска .
Для перевода линейного адреса в физический нужны 4 структуры :
1. page directory
2. page table
3. page
4. page-directory-pointer table
|
|
|