проверка предела сегмента в 64-битном режиме AMD

Я пишу свою ОС для 64-битных процессоров и застрял с проблемой общей защиты. Моя ОС не будет полагаться на ошибку страницы для реализации механизма защиты пространства пользователя, поэтому я обнаружил, что есть способ сделать это с помощью проверки ограничения сегмента:

Эта презентация от VMWare

http://download3.vmware.com/vmworld/2005/pac346.pdf

на странице 20 говорится:

  • Первоначальная архитектура AMD64 не включала сегментацию в 64-битном режиме

    • Segmentation also missing from EMT64T

    Как мы защищаем VMM?

    • Для поддержки 64-битных гостей требуется дополнительное оборудование.
    • Проверки ограничения сегмента доступны в 64-битном режиме на новых процессорах AMD

Теперь у меня более новая модель процессора AMD, и мой вопрос: как мне выполнить проверку ограничения сегмента на процессоре AMD в 64-битном (длинном) режиме? Я скачал (самую последнюю) версию руководства разработчика за сентябрь 2011 г. и нигде не могу найти, как это сделать, пожалуйста, помогите.


person Nulik    schedule 22.10.2011    source источник


Ответы (3)


Я думаю, они, вероятно, говорят о бите включения ограничения сегмента длинного режима (LMSLE бит 13) в «Регистре включения расширенных функций» (EFER) в Том 2 3.1.7 стр. 55. Это описано более подробно в «4.12.2 Проверка пределов данных в 64-битном режиме» на стр. 114. Обратите внимание, что EFER - это регистр, зависящий от модели (подробнее в «6.2.5 Доступ к регистру, зависящему от модели», стр. 156 также в томе 2).

person user786653    schedule 22.10.2011
comment
Благодарю. это как раз особенность. но, к сожалению, я не могу его использовать, потому что он проверяет ограничения только в первых 4 ГБ памяти. Мне нужно проверить ограничения сегмента для каждого процесса, и он должен работать с адресами выше 4 ГБ. - person Nulik; 22.10.2011
comment
К сожалению, как также указано в ответе @PaulBetts, вы работаете против машины (и скоро вы будете в ярости), если попытаетесь навязать сегментированный доступ к памяти в своей 64-битной ОС. Проверка предела, вероятно, была добавлена ​​в ответ на то, что VMWare и другие хотели ее для своих целей, а не для разработчиков ОС. - person user786653; 22.10.2011

Сегментация - это старый и очень медленный способ защиты памяти. Даже когда он вышел, никто не использовал его, потому что он был слишком медленным - это изобрела Intel, но на самом деле не разговаривала с поставщиками ОС, чтобы сначала узнать, чего они хотят. Вам действительно нужно использовать страничный сбой, как и в других современных операционных системах.

person Ana Betts    schedule 22.10.2011
comment
Я думаю, что использование разбиения по страницам приведет к гораздо большему снижению производительности, когда будет выполнено обход страниц. Лучше иметь сегмент и проверять его пределы, это можно сделать за 1 цикл. Обход страницы приведет к доступу к DRAM, что намного хуже и может вытеснить данные из кеша. - person Nulik; 22.10.2011
comment
@Nulik: Не все циклы одинаковы. В то время как проверка сегмента может происходить за один цикл в вашей программе использования, этот цикл может занять намного больше, чем 30 (или тысячи) других тактовых циклов, которые не выполняют ту же операцию. Точно так же, как mov eax, [addr] может потребовать только N пользовательских тактов, но миллионы циклов ядра для страницы. (Все сводится к компромиссу. С сегментацией вам придется исправить указатели, если вы когда-нибудь захотите переместить код / ​​данные) . - person user786653; 22.10.2011
comment
Нулик: Ухудшение производительности происходит, когда вам приходится постоянно переключать сегменты при каждом переключении контекста, это медленная часть - person Ana Betts; 23.10.2011
comment
@PaulBetts, но, как я понимаю, при переключении контекста ядро ​​должно сохранять все регистры задачи, включая DS. Или это означает, что он сохраняет только некоторые регистры? Если да, то что, если моя программа сборки использует DS для хранения некоторых вспомогательных данных, а не в качестве указателя данных? Программа вылетает при первом переключении контекста. - person Nulik; 24.10.2011
comment
@Paul Betts: некоторые люди на форуме osdev указали, что переключение контекста подразумевает переключение TLB, но с сегментацией этого не происходит, поэтому я сомневаюсь, что разбиение на страницы быстрее, чем сегментация. - person Nulik; 24.10.2011
comment
Да, переключение контекста требует сброса TLB - person Ana Betts; 24.10.2011

Хотя это не отвечает на вопрос, это связано с удалением проверок ограничения сегмента в 64-битном режиме, что, предположительно, делает защиту обработчиков прерываний гипервизора «невозможной» без аппаратной виртуализации, что является обсуждением, которое люди могут ожидать, увидев этот заголовок вопроса. "нарушение некоторых существующих реализаций" я согласен, но не "невозможно".

Первоначальная версия x86-64 (AMD64) не допускала программной полной виртуализации из-за отсутствия поддержки сегментации в длинном режиме, что делало невозможной защиту памяти гипервизора, в частности, защиту обработчика ловушек. который выполняется в адресном пространстве гостевого ядра.

Я вижу это повсюду, но я не уверен. Для защиты обработчиков прерываний гипервизора или IDT сегментация не требуется. Вы можете сделать это с помощью подкачки.

Сделайте так, чтобы определенный диапазон виртуальных адресов в SPT всегда отображал обработчики прерываний гипервизора и IDT по виртуальному адресу, по которому он находится на хосте. Для IDT требуется 1 страница 4 КиБ. Эти страницы в SPT сделаны супервизорами, то есть гостевое ядро ​​в кольце 1 не может писать на них, потому что это вызовет ловушку прямо в IDT, которая отображается на гостевую. Теперь позвоните 0, код может быть выполнен. Когда гость выполняет чтение / запись в эти зарезервированные диапазоны виртуальных адресов, он не должен знать, что они зарезервированы, то есть драйвер гипервизора молча перенаправляет доступ с определенными CR3 на чистую страницу. Чтение / запись из гостевого ядра кольца 1 вызовет GPF, а CR2 будет содержать адрес, на который была предпринята попытка записи. Обычно происходит ошибка страницы, а затем отправляется RIP с инструкцией на повторную попытку, но в данном случае он не может этого сделать. Ему необходимо декодировать и выполнить чтение / запись в RIP в кадре прерывания на новую физическую страницу хоста, преобразовав ее с помощью специальной внутренней таблицы исключительно для тех зарезервированных областей, созданных, когда гость изменяет PTE, а затем увеличить RIP .

person Lewis Kelsey    schedule 29.04.2020