Ring0 Shen (_shen_@mail.ru) Спецвыпуск Xakep, номер #035, стр. 035-062-2 Процессор, находясь в защищенном режиме, четко следит, чтобы одновременно работающие программы не имели доступа в сегменты друг друга, таким образом каждая программа работает в своем сегменте (или группе сегментов), не выходя за его пределы. В этом и заключается защита программ от взаимного влияния, которой так не хватало в real mode. Другим важным преимуществом защищенного режима является возможность реализации механизма страничной виртуальной памяти, который позволяет выгружать неиспользуемые страницы памяти на диск и загружать их обратно в оперативку, только когда они потребуются. Тот же механизм кэширует часто используемые страницы для ускорения доступа к ним. Все это существенно повышает производительность системы. Любой, даже самый навороченный, процессор при включении компьютера начинает свою работу в реальном режиме. Переход в PM необходимо осуществлять вручную. Информация о том, в каком режиме в настоящее время работает процессор, хранится в нулевом бите регистра CR0 (0 – реальный, 1 - PM), таким образом, перевод процессора в защищенный режим заключается в установке этого самого нулевого бита в значение 1: mov eax, cr0 ; как и к большинству системных регистров, or al, 1 ; к cr0 нельзя обращаться напрямую mov cr0, eax Но не все так просто: прежде чем переходить в PM, нужно приготовить все необходимые для него структуры: GDT, LDT, IDT. И если без последних двух можно обойтись, GDT должна присутствовать всегда. Так кто же переключает процессор в защищенный режим? При загрузке компьютера, после выполнения тестов памяти и устройств (POST), БИОС передает управление загрузчику ОС, который и осуществляет переход в PM. Добавлю, что процессор позволяет изменять регистр CR0 только программам, работающим на нулевом кольце защиты. Что это за кольцо такое? Плавно переходим к уровням привилегий... Кольца защиты В интеловском процессоре реализован механизм "уровней защиты", заключающийся в том, что каждая программа имеет один из четырех уровней привилегий (0-3, где нулевой - самый привилегированный). Например, возможное распределение: 0 – ядро системы, 1 – драйверы, 2-3 – пользовательские программы. Ты еще помнишь про сегменты, дескрипторы и селекторы? Каждая программа владеет, по меньшей мере, двумя сегментами: кода и данных. При запуске программы операционка создает дескрипторы для этих сегментов и присваивает этой программе определенный уровень привилегий, записывая соответствующее значение в поле DPL (Descriptor Privilege Level) дескриптора сегмента кода. Обычная программа не может изменить это значение, но может узнать его. Поле DPL дескриптора сегмента кода копируется в поле RPL селектора этого дескриптора. Селектор дескриптора кода хранится в сегментном регистре CS, поэтому программа может узнать, какой уровень привилегий она имеет, но не может изменить его. Не поможет даже изменение поля RPL селектора – ОС предоставляет программе доступ куда-либо, основываясь на большем из значений DPL и RPL. Таким образом, программа не сможет обратиться к более привилегированному сегменту, но может сделать запрос на доступ к менее привилегированному. Для этого и существует возможность изменения поля RPL селектора (Requested Privilege Level – запрашиваемый уровень привилегий). |