Вопрос № 53490: Добрый день, уважаемые эксперты! Пишу многозадачную ОС (gcc + nasm). У меня вопрос по защищенному режиму x86.
Как я понимаю, все системные регистры (gdtr, idtr, cr3 и др.), указывающие на системные структуры данных должны инициализироваться адрес...
Вопрос № 53.490
Добрый день, уважаемые эксперты! Пишу многозадачную ОС (gcc + nasm). У меня вопрос по защищенному режиму x86.
Как я понимаю, все системные регистры (gdtr, idtr, cr3 и др.), указывающие на системные структуры данных должны инициализироваться адресами в ФИЗИЧЕСКОЙ памяти. Я прав? В руководстве по i486 везде упоминается линейный адрес.
Можно ли, например, tss размещать в виртуальном адресном пространстве или нет?
Отвечает: ASMодей
Здравствуйте, Поливцев Константин!
Регистр CR3 должен содержать физический адрес корневой таблицы страниц.
Регистры GDTR и IDTR инициализируются линейными (виртуальными) адресами. Следовательно при инициализации страничной адресации нужно следить, чтобы виртуальные адреса, на которые указывают эти регистры транслировались на те же самые физические адреса.
Что касается TSS, то он задается дескриптором в таблице GDT и также адресуется виртуально.
Надеюсь понятно объяснил.
Ответ отправил: ASMодей (статус: Профессионал) Россия, Магнитогорск ---- Ответ отправлен: 28.08.2006, 17:40 Оценка за ответ: 5 Комментарий оценки: Да, некоторые моменты прояснились. Как я понял, все, что отвечает за СЕГМЕНТАЦИЮ (или описывает сегменты) адресуется линейным адресом. А вот каталог таблиц страниц (регистр cr3) адресуется именно физическим адресом, т.к. эта часть аппаратуры отвечает за СТРАНИЧНОЕ преобразование адреса.
AMSодей
писал: "Следовательно при инициализации страничной адресации нужно следить, чтобы виртуальные адреса, на которые указывают эти регистры транслировались на те же самые физические адреса." Это, как я понял, делается для того, чтобы GDTR и IDTR "не потерялись" при активизации страничной адресации, поскольку теже самые линейные адреса могут указывать на совершенно иные физические.
Спасибо Вам за ответ, не много поразкинув мозгами, все додумал.
Это я спрашивал к тому, что на данный момент ядро у меня работает по физическим адресам (виртуальные адреса отображаются на теже самые физические), но вот возникла потребность ядро отправить в верний из 4ГБ адресного пространства, а нижние 3 Гб отдать процессам. По этому собственно и возник вопрос по поводу адресации системных структур.