КомпьютерПресс №5 1991. И. Липкин.
Архитектура микропроцессоров
Эта статья завершает цикл, посвященный архитектуре шестнадцатиразрядных процессоров фирмы Intel. В своем развитии они прошли все этапы - от робкого появления на международном рынке, до полного расцвета и обидно быстрого ухода со сцены. Им на смену пришли могучие 32-битные кристаллы, уже сегодня занявшие практически все "экологические ниши" в компьютерной индустрии. В следующих номерах "КомпьютерПресс" мы постараемся как можно интереснее рассказать об их интимной, скрытой от постороннего взгляда жизни.
Архитектура микропроцессоров
Совершенно секретно, перед прочтением сжечь!
А. и Б.
Стругацкие
Аналогии, аналогии...
Наверное, я не ошибусь, если скажу, что каждый из нас хотя бы раз в жизни слышал из уст "ответственных" работников фразу: "Это вам знать не полагается!" - и немудрено, ведь тайны окружают человека на протяжении всей жизни. Посудите сами - сначала родители, блюдя нравственность своего чада, плетут ему байки про аиста и капусту, затем, уже в школе, на него заводится совершенно секретное личное дело, а потом он попадает во взрослый мир, где таинственные и легендарные тени КГБ, МВД и ВПК грозно реют над несчастным любознательным индивидуумом до конца его дней. Но вот парадокс: соблюдение своих секретов и разгадывание чужих - эта чрезвычайно сложная и очень дорогая игра для серьезных дяденек - приносит, в основном, сугубо отрицательный результат. Мало того, что на обмундирование и прокорм всей этой оравы уходит масса средств, так оказывается и тайны-то отечественные остаются таковыми только для местных жителей, а разгадка чужих требует не нашей технологии и не наших знаний.
Другое дело тайны компьютерные. Многолетний опыт показывает, что на создание секретных зон в ОЗУ потратиться стоит. У некоторых читателей подобный тезис может вызвать удивление, но если вдуматься, действительно начинаешь сомневаться, весь ли объем оперативной памяти машины должен быть доступен для любого пользователя? Давайте попробуем в этом деле разобраться.
Берегите ОС
Грубо говоря, программное обеспечение, расположенное в ОЗУ, можно разделить на две основные части: операционную систему (ОС) и прикладные программы. Первая, как вам известно, служит для управления аппаратными ресурсами компьютера и осуществления взаимодействия между прикладными программами, пользователем и "железом". Она является как бы диспетчером для всех процессов, происходящих в вычислительной системе. Если провести параллель между компьютером и человеческим организмом, то ОС в большинстве случаев выполняет функции вегетативной, а прикладные программы - центральной нервной системы.
Теперь представьте себе на минутку, что написанная вами программа случайно внесла какие-то изменения в один из сегментов ОС. Это почти наверняка приведет к нарушению таких жизненно важных для компьютера функций, как управление памятью, вводом-выводом или файловой системой. Продолжая аналогию с человеком, практически невозможно представить себе ситуацию, когда чтение утренней газеты вызывает расстройство желудка, а разговор по телефону с приятельницей - появление склеротических симптомов.
Для того чтобы избавить вычислительную систему от неминуемой катастрофы, разработчиками процессора i286 были предприняты некоторые меры по обеспечению безопасности модулей ОС. Рассуждали они, очевидно, так: если разделить все программное обеспечение на несколько уровней секретности, причем так, чтобы выполнение процедур с низким уровнем не могло повлиять на состояние программ с более высоким уровнем, то, поставив операционную систему на самую вершину подобной пирамиды, можно уже не бояться неприятностей.
Равняйсь на Бюрократию или "Тайна второго кольца"
Западные изобретатели - народ практичный и изобретать велосипед не в их привычках - куда дешевле воспользоваться чужим опытом. Так вот, подобную схему приоритетов они взяли не с потолка, а "передрали" прямо с системы защиты документов, которой по сию пору пользуется правительство США. Там определено четыре класса секретности для бумаг, проходящих через руки государственных чиновников: совершенно секретный, секретный, конфиденциальный и неклассифицируемый (рис.1). Но это еще "цветочки" - все население Штатов тоже разбито на четыре класса, которые называются "уровнями благонадежности": совершенно секретный, секретный, конфиденциальный и неблагонадежный. При такой постановке дела совершенно ясно, что забулдыга из Куинз вряд ли получит доступ к стратегическим планам Пентагона. (Вот интересно, сколько уровней благонадежности предусмотрел для советских граждан КГБ и в какую группу он включил сотрудников "КомпьютерПресс"?)
Схема защиты наиболее важных сегментов операционной системы как две капли воды похожа на бюрократическую "луковицу", придуманную американским правительством - те же четыре уровня, только называются они уровнями привилегий, а самый центр с нулевым номером уготован для сверхзащищенного "ядра безопасности". Ядро предназначено для небольшой части ОС, отвечающей за управление памятью и доступом, а также за осуществление собственно защиты. Остальные сегменты операционной системы имеют первый уровень привилегий, на долю же прикладных задач выпадает только третий уровень. Может возникнуть резонный вопрос: чем заполнить второе кольцо безопасности и нужно ли оно вообще? Между прочим, четыре уровня получились, как вы, наверное, догадались не столько из-за слепого подражания, сколько потому, что число 4 кодируется двумя битами. Но "лишний" уровень не долго пустовал - нашлось и для него применение: существуют некоторые программные продукты, например базы данных, которые сами занимаются своей безопасностью, вот им-то второе кольцо и пришлось как раз впору (рис. 2).
Остается пока неясным, каким образом процессор распознает уровень привилегии того или иного сегмента. Здесь нам придется ненадолго вернуться к той главе, где мы знакомились с вычислением виртуального адреса и вспомнить, что назначение сорока битов из 64-х разрядов дескриптора так и осталось для нас загадкой. Оказывается, разряды с 40-го по 47-й любого дескриптора занимает так называемый байт доступа, пятый и шестой биты которого несут информацию о номере кольца защиты (рис. 3). Комбинация этих двух разрядов как раз и является уровнем привилегий дескриптора DPL). Если производится запись сегмента в ОЗУ, DPL играет роль определителя класса секретности данных, а в том случае, когда сегмент содержит выполняемый код, уровень привилегий превращается в показатель благонадежности программы.
Откуда же берется содержимое DPL? Давайте вспомним структуру селектора (рис. 4). Из шестнадцати его разрядов старшие тринадцать, как вы помните, отводятся под индекс, один служит индикатором таблицы, а вот два младших бита представляют собой запрашиваемый уровень привилегий (RPL). В процессоре предусмотрен специальный механизм поддержки текущего уровня привилегий (CPL), который соответствует степени "благонадежности" (DPL) выполняемой процедуры.
Для плебеев - отдельный вход
Дальше, вроде бы, все просто: если CPL текущей программы меньше или равен DPL сегмента памяти, то доступ разрешен (вспомним, что нулевой уровень - самый высокий), а если налицо противоположная ситуация, то есть CPL>DPL, доступ запрещен, не так ли? Вы не заметили в этом утверждении ничего странного? Тогда каким же образом прикладной программе достучаться до операционной системы и добиться от нее необходимой поддержки, ведь ее CPL по крайней мере на двойку больше, чем DPL сегментов ОС?
Для того чтобы избежать подобного противоречия, в процессоре реализован механизм вызова более привилегированной процедуры через разрешенные точки входа. Упрощенно это выглядит так: пользовательская программа обращается к специальному дескриптору, определяющему точку входа в процедуру операционной системы (рис. 5). Специальный дескриптор носит название "шлюза вызова", уровень его привилегий достаточно низок для того, чтобы к нему можно было обратиться из любой прикладной программы, а адрес заранее определен. Шлюз, помимо байта доступа, содержит счетчик слов, определяющий количество параметров, передаваемых при вызове, а также селектор и смещение назначения, точно указывающих виртуальный адрес точки входа (рис. 6).
Подобная косвенная передача управления через шлюз вызова имеет свои прелести: можно внести в пользовательскую программу какие угодно изменения или перекомпилировать ее, можно даже установить новую версию операционной системы, если для шлюзов места в GDT (глобальной дескрипторной таблице) остались постоянными, достаточно изменить виртуальный адрес точек входа и можно смело запускать прикладную программу - она не "заблудится".
А теперь - совершенно секретная информация для самых любопытных. Советую читать при плотно закрытых дверях и в полной темноте! В следующем выпуске нашего журнала мы расскажем о том, что делается внутри i860, но это - военная тайна. Тс-с-с...!!!
И. Липкин
КомпьютерПресс 5'91
Продолжение цикла публикаций — архитектура процессора Intel 80486.