Все, о чем пойдет речь в данном выпуске представляет большой интерес для разработчиков ОС и тех, кому просто хочется увидеть все насквозь.
На создание данного выпуска побудила неразбериха, творящаяся в литературе по описанию архитектуры различных ОС. Многие авторы, которые пишут свои книги со слов разработчиков ОС (Хелен Кастер) или являющиеся онными (Мэт Питрек) очень часто недоговаривают и перевирают некоторые наиважнейшие понятия (в некоторых случаях это делается специально, ввиду засекреченности того или иного аспекта), но путать некоторые из них - это просто кощунство. Авторы практически 90% книг копируют друг у друга различные определения, получается нечто вроде «испорченного телефона», а страдаем в конечном итоге мы.
Все дело в взаимосвязи и сути трех наиважнейших понятий в идеологии адресации: ВИРТУАЛЬНОЕ, ЛИНЕЙНОЕ И ФИЗИЧЕСКОЕ адресные пространства. Все эти понятия – отдельные сущности, взаимодействуют между собой, НО НИ В КОЕМ СЛУЧАЕ нельзя путать эти термины, поскольку на совокупности этих трех понятий зиждется любая ОС.
Например, очень часто в литературе по ОС можно встреить такие высказывания: «...виртуальное (линейное) адресное пространство процесса...» или некоторые еще хитрее – не указывают, какое именно адресное пространство имеется ввиду – просто «...адресное пространство процесса...»
Виртуальное адресное пространство процессора Intel (IA32) в защищенном режиме
|
Виртуальный адрес (он же логический) в процессорах с 32-х разрядной архитектурой (IA32) – совокупность ВСЕХ возможных адресов вида:
сегментный регистр:смещение
Например, CS:12345678h – виртуальный (логический) адрес
В старой ОФИЦИАЛЬНОЙ документации (1995 г.) такой адрес назывался интеловцами виртуальным, в новой (2002 г.) они дают новое определение – логический, но по сути – это синонимы.
Почему ВИРТУАЛЬНЫЙ? Где здесь виртуальная сущность? Виртуальная сущность в том и состоит, что глядя на нечто вроде 6666h:12345678h НИКОГДА НЕЛЬЗЯ СКАЗАТЬ НАВЕРНЯКА, ОДНОЗНАЧНО, что на самом деле представляют из себя эти два числа. Знакомые с защищенным режимом сразу определят, что это некий адрес, и по левой части (селектору) можно найти число (базу), прибавя к которой правую часть получится некий другой адрес, вообщем, 6666h:12345678h - это некий виртуальный адрес, на самом деле (физически) его и нет вовсе...
Теперь давайте разберемся, каков размер виртуального (логического) адресного пространства процессора. Многие тут же не задумываясь ответят – 4 Гб, потому что так написано во многих книгах, но, однако, внимательный читатель рассылки не будет делать столь скоропалительных выводов.
Итак, рассмотрим правую часть виртуального адреса. Здесь все и так понятно: 2^32 = 4Гб (т.е. правая часть виртуального адреса) может принять 4Гб различных значений.
НО ЕСТЬ ЕЩЕ И ЛЕВАЯ ЧАСТЬ ВИРТУАЛЬНОГО АДРЕСА!!! (о которой, почему то, авторы многих книг забывают).
Здесь самое время всплыть уже давно забытым картинам:
Селектор – это и есть та самая левая часть виртуального адреса.
Избавимся от битов, которые НИКАКИМ БОКОМ НЕ ОТВЕЧАЮТ за адресацию. Это два бита RPL. Некоторые с горяча подмахнт сюда еще и TI, однако этого делать не стоит, т.к. TI – это индикатор таблицы дескрипторов, и он ЕЩЕ КАК отвечает за адрес, который в конце концов вылезет на адресную шину... (но это забегая вперед).
Теперь:
GDT может содержать 8192 дескриптора.
LDT может содрежать 8192 дескриптора.
Нулевой дескриптор в GDT – недоступен.
Значит, имеем 8191 - в GDT и 8192 – в LDT.
Всего – 16383 дескрипторов. И каждый – 4Гб.
Всего: 16383 * 4Гб = 65532 Гб (64 Тб)
Иначе говоря, виртуальный адрес – НЕ 32-х РАЗРЯДНЫЙ!!!
ОН – 46 РАЗРЯДНЫЙ!!!
2^46 байт = 65536Гб = 64Тб
(но реально, за вычетом нулевого дескриптора из GDT, имеем на 4Гб меньше адресов (65532Гб))
Итог: виртуальное адресное пространство процессора Intel в защищенном режиме составляет 64 терабайта!
Всеобщие заблуждения: 64 терабайтное виртуальное адресное пространство, якобы, получается в Pentium Pro процессорах при исползовании механизма PAE и PSE-36. На самом деле, PSE-36 ЭТО РАСШИРЕНИЕ ФИЗИЧЕСКОГО АДРЕСНОГО пространства (причем, всего лишь до 64 Гб), о нем далее, а на ВИРТУАЛЬНОЕ АДРЕСНОЕ ПРОСТРАНСТВО все эти расширения никак не влияют – оно ВСЕГДА = 64 терабайтам.
А теперь внимание вопрос на засыпку: чему, по вашему мнению, равен размер виртуального адресного пространства процессора Intel в РЕАЛЬНОМ РЕЖИМЕ? Ответы мыльте на ящик внизу.
Линейное адресное пространство процессора Intel (IA32) в защищенном режиме
|
Линейный адрес – это 32-х разрядный адрес, получаемый путем прибавления 32-х разрядного смещения (правая часть виртуального адреса) к базе сегмента.
Линейный адрес – ВСЕГДА 32-х разряден. В этом легко убедиться, попытавшись опровергнуть это утверждение. Попробуйте создать сегмент с базой в 4Гб и сделать что то типа jmp селектор_этого_сегмента:2Гб (т.е. фактически должен возникнуть линейный адрес = 4 Гб (база) + 2 Гб (смещение) = 6 Гб). Вместо этого мы получим #GP. Вот и все.
Поэтому, ЛИНЕЙНОЕ АДРЕСНОЕ ПРОСТРАНСТВО процессора Intel в защищенном режиме составляет 4 Гб.
Физическое адресное пространство процессора Intel (IA32) в защищенном режиме
|
Здесь возможны два варианта:
1. В режиме сегментной адресации физический адрес ВСЕГДА СОВПАДАЕТ с линейным.
2. В режиме сегментно-страничной адресации физический адрес НЕ СОВПАДАЕТ с линейным, а получается путем разбиения линейного адреса на 3 части и путешествия по каталогам и таблицам страниц.
По сути, при включенной сегментно-страничной адресации, линейный адрес также таит в себе некую «виртуальную сущность», потому что в принципе может быть представлен в виде X:Y:Z (действительно, он состоит из трех совершенно разных чисел: номера записи в каталоге страниц, номера записи в таблице страниц и смещения в странице), однако не стоит углубляться в такие дебри.
Физический адрес – это тот адрес, который процессор ВЫСТАВЛЯЕТ НА АДРЕСНУЮ шину процессора.
Вот здесь возникает еще одно заблуждение: многие считают, что физический адрес и адрес в оперативной памяти – это одно и то же. На самом деле, если разобраться, физический адрес – МОЖЕТ соответствовать ячейке оперативной памяти (если она существует), либо НЕ МОЖЕТ (если ячейки по такому адресу не существует). В любом случае, следует помнить, что физический адрес – ЭТО НЕ ЕСТЬ АДРЕС ЯЧЕЙКИ ОПЕРАТИВНОЙ ПАМЯТИ, хотя и может совпадать с ним.
Например, окончательно сформированный процессором физический адрес равен 678 Мб, он выставляется на адресную шину. А оперативной памяти на машине стоит, предположим, 256 Мб. Вот и ответьте сами себе: является ли ВЫСТАВЛЕННЫЙ физический адрес одновременно адресом ячейки в оперативной памяти? Конечно же нет! Такой ячейки попросту НЕ СУЩЕСТВУЕТ! Другой интересный вопрос – ЧТО ПРОИЗОЙДЕТ в таком случае дальше? Здесь уже все зависит от чипсета материнской платы – процессору либо будет послан сигнал #RESET (что и происходит в 90% случаях), либо он просто получит фиктивные данные. Но это не суть важно – важно, что множество АДРЕСОВ ЯЧЕЕК ОПЕРАТИВНОЙ ПАМЯТИ ВХОДИТ в множество ФИЗИЧЕСКИХ АДРЕСОВ.
За бортом остались такие интересные вопросы, как, например: «...А как ОС узнает о размере оперативной памяти, установленной на компьютере? Это число не хранится ни в одной ячейке области данных БИОС». Об этом, надеюсь, мы поговорим в следующих выпусках.
К чему я все это веду...
|
Очень часто, в 99% книг, можно встретить такое:
«...Виртуальное (линейное) адресное пространство процесса состовляет 4Гб...»
В одном предложении – сразу 2 ошибки, причем недопустимые. Первая ошибка – ВИРТУАЛЬНОЕ и ЛИНЕЙНОЕ адресные пространства – взаимосвязаны, но это НЕ ОДНО И ТО ЖЕ!
Вторая ошибка: А ЧЕМУ ЖЕ СОБСТВЕННО, РАВНО ВИРТУАЛЬНОЕ АДРЕСНОЕ ПРОСТРАНСТВО ПРОЦЕССА? Действительно ли 4 Гб? Давайте разберемся...
Как известно, при создании процесса сегм. регистры загружаются такими значениями: CS = X, DS=SS=FS=GS=ES=Y, т.е. CS отличается от всех остальных (что не удивительно – попробуйте загрузить в сегм. регистр кода селектор сегмента данных или наоборот - #GP гарантировано). Поэтому имеем такую картину: ДВА РАЗНЫХ СЕЛЕКТОРА! Какой вывод мы должны сделать из этого? Может, он покажется шокирующим, но это факт – ВИРТУАЛЬНОЕ АДРЕСНОЕ ПРОСТРАНСТВО ПРОЦЕССА В ОС WINDOWS = 8 Гб !!! А если бы значения в DS, SS, FS, GS, ES также различались??? Ну что ж, тогда виртуальное адресное пространство процесса в ОС Windows составляло бы 24 Гб! А все потому, что мы имеем ДВА РАЗНЫХ СЕЛЕКТОРА, а ведь именно они и учавствуют в ФОРМИРОВАНИИ ВИРТУАЛЬНОГО АДРЕСНОГО ПРОСТРАНСТВА, оспорить это невозможно...
А как же обстоит дело с линейным адресным пространством? Здесь все еще проще: линейное адресное пространство процесса ТЕОРЕТИЧЕСКИ могло бы составлять максимум – 4 Гб, но т.к. верхние 2 Гб ОС Win NT защищены от доступа на уровне СТРАНИЦ, то получается, что ЛИНЕЙНОЕ АДРЕСНОЕ ПРОСТРАНСТВО ПРОЦЕССА В ОС Win NT = 2 Гб. В Win 9x – чуть больше, 3 Гб.
Еще заблуждения:
во многих книгах можно прочитать что то типа: «...считать данные из страницы», или «сбросить страницу в файл подкачки». Это некорректно. На самом деле, страница – это блок линейного адресного пространства. Страница НЕ МОЖЕТ СОДЕРЖАТЬ ДАННЫЕ. Данные содержатся в СТРАНИЧНОМ ФРЕЙМЕ (страничный фрейм – это блок физического адресного пространства). Т.е. нужно говорить «считать данные из страничного фрейма».
Таких тонкостей и неоднозначностей – море. Только до конца разобравшийся в них может по праву считаться специалистом.
«Достигнуть» всего вышеизложенного помог один из подписчиков, уважаемый Дмитрий Наумов, за что ему выражается особая благодарность.
Было бы очень недурно, если бы и вы, уважаемые подписчики, включились в эту дискуссию, привнесли свое понятие и развили бы эту тему дальше, т.к. она исключительно важна и почему то еще более исключительно затуманена в литературе...
wasm.ru – сайт, посвященный программированию на ассемблере под Win, много инструментов и статей. Есть своя рассылка, мощный форум и прекрасно отлаженная команда разработчиков :).
rusfaq.ru- задай любой вопрос по асму (и не только...), и тебе ответят, как полагается.
|
©
Broken Sword, 2002 - Рассылка
©
Igoryk, 2002 - Дизайн
| | | |