Встроенные средства защиты. Принципы модульности и перемещаемости. Проверка привилегированности сегмента, страница 12

Поясним назначение и использование отдельных (собственных) стеков  для каждого уровня привилегий более подробно. Перед вызовом более привилегированной процедуры в стеке вызывающей (менее привилегированной) процедуры могут находится параметры вызываемой процедуры и другая информация, относящаяся к вызывающей программе. Если вызываемая  (более привилегированная) процедура будет использовать стек вызывающей (менее привилегированной) процедуры, а он оказался мал, то может произойти сбой вызываемой (более привилегированной) процедуры, что конечно недопустимо. Кроме того, в случае использования общего стека он может быть разрушен менее привилегированной процедурой, которая вызывает более привилегированную процедуру через шлюз. (Именно по этому программы супервизора большинства компьютеров используют собственные стеки).

При выполнении команды CALL вызова процедуры в более привилегированном кольце для вызываемой процедуры создается новый стек (в регистры SS:(Е)SP из сегмента состояния задачи TSS загружаются значения, определяющие начальный адрес стека для вызываемого уровня привилегий). В этот стек последовательно вводятся старые значения SS:(Е)SP (вершины стека вызывающей программы), параметры вызываемой программы (переносятся из стека вызывающей программы) и адрес возврата (значения CS:(Е)IP вызывающей программы). В качестве передаваемых параметров, как правило, используются параметры вызываемой процедуры. Число переносимых параметров определяется полем WC дескриптора шлюза вызова, причем выбираются последние из загруженных в старый стек слов-параметров. Кадры стека, иллюстрирующие вызов процедуры с более высоким уровнем привилегий, показаны на рис.

После заполнения нового стека параметрами из старого стека команда CALL, используемая для вызова более привилегированной программы через шлюз, загружает адрес перехода в регистры CS:(Е)IP, и далее осуществляется обычное выполнение вызванной процедуры. Завершение вызванной программы осуществляется с помощью команды RET, которая производит восстановление адреса возврата и вершины стека вызывающей программы (старых значений CS:(Е)IP) и SS:(Е)SP из стека). Кроме того, команда возврата сбросит содержимое сегментных регистров данных DS, ES, FS, GS или SS, если любой из них адресует сегмент более привилегированный, чем вызывающая программа. Благодаря этому в вызывающей программе запрещается доступ к привилегированным сегментам, случайно оставленным вызываемой более привилегированной программой. Команда RET сравнивает значение CPL завершенной программы и значение CPL селектора CS для старой программы, извлекаемое из стека. Если возврат осуществляется к программе с меньшим или таким же уровнем привилегий, команда RET выполняется. В противном случае формируется исключение (нарушение общей  защиты). Если межсегментный переход осуществляется на одном уровне привилегий, то используется единственный стек того же уровня, в котором для правильной работы достаточно просто сохранить адрес возврата (CS:(Е)IP).

Начальные значения SS:(Е)SP для стеков с уровнями привилегий 0, 1, 2 только считываются и никогда не изменяются при работе процессора

Новый стек более привилегированного кольца после вызова

                                                                            SS:(Е)SP

Стек вызывающей                         старый SS             из TSS

процедуры до вызова                                                               Стек вызывающей

                                               старый SP                      процедуры после возврата

                                                                                                     

параметр 1                              параметр 1                                                     (Е)SP

 


параметр 2                             параметр 2