Предотвращение выполнения памяти MIPS - PullRequest
5 голосов
/ 18 ноября 2011

Я занимаюсь исследованием архитектуры MIPS, и мне было интересно, как реализованы операционные системы с ограниченными инструкциями и защитой памяти, которую предлагает MIPS. Мне особенно интересно, как операционная система будет препятствовать выполнению определенных диапазонов адресов. Например, как операционная система может ограничить работу ПК в определенном диапазоне? Другими словами, предотвратить что-то такое, как выполнение из динамически выделенной памяти?

Первое, что пришло в голову, это TLB, но TLB предлагают только защиту от записи в память (а не выполнение).

Я не совсем понимаю, как она может быть обработана операционной системой, потому что это будет означать, что каждая инструкция приведет к исключению, и тогда будет выполнено МНОГО циклов, просто проверяя, находится ли ПК в нормальном диапазоне адресов. .

Если кто-нибудь знает, как это обычно делается? Обрабатывается ли это каким-либо образом оборудованием во время инициализации (например, ему дается диапазон адресов и возникает исключение, если он выходит за пределы диапазона?)

Ответы [ 2 ]

2 голосов
/ 18 ноября 2011

Это действительно сделано с TLB. No Execute Bits (биты NX) стал популярным всего несколько лет назад, поэтому старые процессоры MIPS его не поддерживают. Последняя версия архитектуры MIPS (выпуск 3) и SmartMIPS специфичное для приложения расширение поддерживают его в качестве дополнительной функции под именем XI (Execute Inhibit) .

Если у вас есть чип без этой функции, вам не повезло. Как уже сказал Алекс, простого способа эмулировать эту функцию не существует.

2 голосов
/ 18 ноября 2011

Большинство проверок защиты выполняются аппаратно, самим ЦП, и не требуют особого участия со стороны ОС.

ОС устанавливает некоторые специальные таблицы (таблицы страниц или дескрипторы сегментов или некоторые другие), в которых диапазоны памяти имеют связанные разрешения на чтение, запись, выполнение и пользователь / ядро, которые затем внутренний процессор кэширует.

Затем ЦП каждой инструкции проверяет, соответствуют ли обращения к памяти установленным ОС разрешениям и, если все в порядке, продолжается. Если есть попытка нарушить эти разрешения, CPU выдает исключение (форму прерывания, аналогичного внешнему по отношению к устройствам ввода-вывода CPU), которое обрабатывает ОС. В большинстве случаев ОС просто завершает работу приложения-нарушителя, когда получает такое исключение.

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

Также могут быть определенные жестко заданные диапазоны памяти ЦП, недоступные для программного обеспечения, работающего вне ядра ОС, и ЦП также может легко выполнить проверку здесь.

Это, похоже, относится к MIPS (из "Замечания по применению 235 - Миграция с MIPS на ARM") :

3.4.2 Защита памяти MIPS предлагает защиту памяти только в той степени, как описано ранее, то есть адреса в верхних 2 ГБ адресного пространства не допускается в режиме пользователя. Нет более детального режима защиты.

enter image description here

В этом документе перечислены «MEM - сбой страницы при получении данных; неправильный доступ к памяти; нарушение защиты памяти» среди других исключений MIPS.

Если конкретная версия ЦПУ MIPS не имеет более детальных проверок защиты, они могут быть эмулированы только ОС и требуют значительных затрат. Операционная система должна будет выполнить инструкцию кода по инструкции или преобразовать ее в почти эквивалентный код со вставленным адресом и проверками доступа и выполнить его вместо исходного кода.

...