Все. Это последний выпуск... посвященный нудной теории. Со следующего начинаем кодить. Поэтому всем еще раз настоятельно рекомендую перечитать предыдущие выпуски (архив лежит здесь: http://subscribe.ru/archive/comp.soft.prog.intelpm).
Напомню, что при страничной организации линейный адрес (база из дескриптора + offset) не соответствует физическому (т.е. адресу, который проц выставляет на адресную шину). Прежде, чем попасть на адресную шину он проходит ряд преобразований.
Итак, линейный адрес делится на три части в случае 4Кб страниц, и на две в случае 4Мб страниц.
Биты 22-31 линейного адреса – это НОМЕР элемента (записи) в КАТАЛОГЕ СТРАНИЦ. Адрес начала каталога страниц в памяти содержит регистр CR3 (см. предыдущий выпуск). Каждый элемент в каталоге страниц «весит» 32 бита. Рассмотрим его под микроскопом:
Поле «Адрес базы таблицы страниц» содержит адрес базы таблицы страниц… :). Т.е. не адрес элемента из таблицы страниц, а только адрес НАЧАЛА ТАБЛИЦЫ ЭТИХ ЭЛЕМЕНТИКОВ… Сам элемент (его номер в таблице страниц) определяют биты 12-21 линейного адреса. Вот его структура:
Очень похож на элемент каталога страниц, но все же есть отличия…
И заключительный штрих – структура элемента каталога 4Мб старниц.
P-флаг, бит 0: указывает, находится ли страница (или таблица страниц) в физической памяти. Если он равен 1 – то все в порядке, страница в памяти и можно продолжать формирование физического адреса, если же он сброшен – процессор вызывает исключение #PF (Page Fault), обработчик которого должен загрузить ее в память. Вообще то процессор никогда не меняет этот флаг сам – этим должна заниматься ОС.
R/W-флаг, бит 1: определяет привилегии чтения/записи для страницы или группы страниц (в случае, когда элемент каталога страниц указывает на таблицу страниц). Если флаг сброшен – страница доступна ТОЛЬКО ДЛЯ ЧТЕНИЯ. Если установлен – для чтения и записи. Данный флаг тесно связан с флагами U/S и WP из CR0. Об этом в выпуске о защите страниц.
U/S-флаг, бит 2: определяет привилегии пользователя/супервизора для страницы или группы страниц. Если флаг сброшен – страница доступна только для супервизорского уровня привилегий, если установлен – для пользователя и супервизора. Данный флаг связан с флагами U/S и WP.
PWT-флаг, бит 3: контролирует кэширование страницы (write-through и write-back). Если установлен – write-through кэширование разрешено, если сброшен – тогда разрешено write-back кэширование. Проц игнорирует этот флаг, если установлен CD (cache disabled) флаг в CR0.
PCD-флаг, бит 4: контролирует кэширование страницы. Если установлен – кэширование страницы отключено, если сброшен – разрешено. Нужен для страниц, которые не «делают погоды» и по сути могут только засорить кэш. Также, как и с PWT-флагом, значение PCD-флага игнорируется, если установлен CD-флаг в CR0.
A-флаг, бит 5: (аналог флага А в дескрипторе) показывает, было ли произведено обращение к странице с момента загрузки ее в память. По идее, ОС при загрузке страницы в память в первый раз должна сбросить этот бит в ноль. Затем, после ее загрузки в память, проц отлавливает момент, когда к ней в первый раз произойдет обращение и САМ устанавливает этот флаг в единицу. Все. Больше он его не трогает. Флаг А (также как и D) нужны для управления и контроля за страницами и таблицами страниц.
D-флаг, бит 6: показывает была ли произведена запись в страницу. Этот флажок игнорируется в элементах каталога страниц, которые указывают на таблицы страниц, т.е. при 4Кб-страничной организации. ОС должна обнулить данный флаг как только страница загружена в память, затем проц уже САМ установит его, как только в страницу будет произведена первая запись и больше его трогать не будет. Т.е. он будет торчать до тех пор, пока его не скинет ОС. Вообще данный флаг по сути схож с флагом A.
PS-флаг, бит 7 (для 4Кб страниц): определяет размер страницы. Если сброшен – страница 4Кб и элемент каталога страниц указывает на таблицу страниц. Если установлен – страница 4Мб (при 32-х битной адресации) или 2Мб (если используется EPA) и элемент каталога страниц указывает на САМУ СТРАНИЦУ. Если элемент каталога страниц указывает на таблицу страниц, то все страницы, на которые ссылаются элементы таблицы страниц также являются 4Кб-ными.
PAT-флаг, бит 7 в элементе таблицы страниц (для 4Кб страниц) или бит 12 в элементе каталога страниц (для 4Мб страниц): появился только в III-пнях (также есть в Xeon-ах и четвертых пнях). PAT – это таблица, расширение IA-32 архитектуры, вообще это все к MTRR-регистрам и к нам не относится. На процах, не поддерживающих данную фичу этот флаг зарезервирован и должен равняться нулю.
G-флаг, бит 8: появился в Pentium Pro процессорах. Указывает, что описываемая страница является ГЛОБАЛЬНОЙ, если установлен. Теперь смотри, для чего все это нужно. Если данный флаг установлен, а также установлен PGE-флаг в CR4, то соотв. элементы каталога и таблицы страниц никогда не будут выкинуты из TLB-кэша. Страницы, содержащие код ядра ОС и т.п. святые мощи желательно помечать глобальными, тогда их никто не посмеет выкинуть из TLB. Флаг G можно установить/сбросить ТОЛЬКО ПРОГРАММНО. Для элементов каталога, которые указывают на таблицу страниц, этот бит игнорируется, зато точно такой же битик есть и в соотв. элементе таблицы страниц, вот там проц на него уже смотрит.
Зарезервированные и доступные для программ биты: существуют во всех IA-32 процах. Биты 9,10 и 11 доступны для использования программно. Если бит P (бит присутствия сегмента) сброшен, то доступны все 32 бита :). Для элемента каталога страниц, который указывает на таблицу страниц, бит 6 должен всегда равняться нулю! Если PSE и PAE флаги в CR4 – установлены, то проц будет ругаться #PF, если зарезервированные биты не сброшены в нули.
Для вторых пней и более ранних: бит 7 в элементе таблицы страниц зарезервирован и должен равняться нулю. В элементах каталогов страниц для 4Мб страниц биты 12-21 должны быть равны нулю.
Для третьих и более поздних пней: В элементах каталогов страниц для 4Мб страниц биты 13-21 должны быть равны нулю.
Вот и все. Осталось рассмотреть всю эту братию при 36-битной адресации, займемся этим как-нибудь потом. А пока приготовься применить все полученные знания на практике. До следующего выпуска.
p.s. кто-нибудь юзает WinAMP 3.0 full? Действительно ли он такой тормознутый и глючный, или это только у меня подобные траблы?
|