Глава 31. Управление памятью в NetWare 4.0

NetWare 4.0 предусматривает упрощенную архитектуру управления памятью, которая позволяет более эффективно использовать память и выполнять ее быстрое распределение/освобождение. Кроме того, упрощенный API позволяет разработчикам быстрее писать программы.

Как уже упоминалось, NetWare 4.0 предусматривает кольцевую и доменную защиту на основе сегментации и страничной организации процессоров Intel 386/486. Кольцевая защита - это принцип построение логической модели в виде концентрических колец, где в каждое кольцо допускаются только NLM с определенными привилегиями. Доменная защита - это логическое адресуемое пространство для процесса или NLM, где каждый домен определяется и ограничивается таблицами страниц.

Кольцевая защита

Используя для реализации кольцевой защиты архитектуру с сегментацией, NetWare присваивает селекторам сегмента уровни привилегий. В текущей реализации защиты памяти NetWare используется только два уровня привилегий: уровень 0 для операционной системы NetWare и уполномоченных NLM и уровни 1, 2 и 3 для тех NLM, которые нужно изолировать от операционной системы.

Отметим, однако, что хотя вы можете загружать NLM на уровни 1, 2 или 3, защита памяти NetWare рассматривает эти уровни как идентичные. Домен, где на уровне 0 выполняется операционной система и уполномоченные NLM-модули, называется системным доменом (домен OS). Домен, в котором на уровне 1, 2 или 3 работают другие NLM, называется защищенным доменом (домен OS_Protected).

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

Кроме уровней защиты сегментация обеспечивает для сегментов памяти физические ограничения, если программный код получает доступ к памяти вне границ дескриптора памяти сегмента, аппаратное обеспечение Intel генерирует прерывание.

Доменная защита

Используя для реализации доменной защиты страничную архитектуру, NetWare и NLM-модули NetWare могут адресоваться к 4-килобайтовым блокам памяти или страницам оперативной памяти (ОЗУ). Каждая страница памяти может быть помечена как присутствующая или отсутствующая, защищенная от чтения, от записи, доступная для чтения или доступная для записи.

NLM-модули или процессы получают доступ к памяти, используя двухуровневую таблицу страниц, показанную на следующем рисунке. Первый уровень - это таблица каталога страниц Page Directory Table, которую имеет каждый домен. Page Directory Table каждого домена содержит адреса таблиц страниц домена, которые составляют второй уровень. Таблицы страниц содержат адреса 4-килобайтовых блоков или страниц памяти, используемых NLM.

На основе адреса таблицы в таблице страниц аппаратное обеспечение Intel транслирует линейный адрес в соответствующий физический адрес. Использование двухуровневой таблицы страниц позволяет процессу адресоваться к памяти, которая физически не является непрерывной, как к логически непрерывному диапазону памяти.

Двухуровневая таблица страниц


                                   2-ой уровень: таблица

            1-ый уровень: таблицы  страниц Page Table,

            Page Directory Table   содержащая блоки     4-килобайтовые

            (одна на каждый домен) памяти по 4К.        страницы памяти,

            +---------------+      +--------------+     используемые NLM

            ¦Запись каталога¦--+   ¦              ¦     или процессом.

            ¦    страниц    ¦  ¦   ¦              ¦     +--------------+

            +---------------+  ¦   +--------------+ +-->¦              ¦

            ¦               ¦  ¦   ¦              ¦ ¦   ¦              ¦

            ¦               ¦  ¦   ¦              ¦ ¦   +--------------+

            +---------------+  ¦   +--------------+ ¦   +--------------+

            ¦               ¦  ¦   ¦Запись таблицы¦-+ +>¦              ¦

            ¦               ¦  ¦   ¦    страниц   ¦   ¦ ¦              ¦

            +---------------+  ¦   +--------------+   ¦ +--------------+

            ¦Запись каталога¦-+¦   ¦Запись таблицы¦---+ +--------------+

            ¦    страниц    ¦ ¦¦   ¦    страниц   ¦  +->¦              ¦

            +---------------+ ¦¦   +--------------+  ¦  ¦              ¦

            ¦               ¦ ¦¦   ¦Запись таблицы¦--+  +--------------+

            ¦               ¦ ¦¦   ¦    страниц   ¦     +--------------+

            +---------------+ ¦¦   +--------------+   +>¦              ¦

            ¦               ¦ ¦+-->¦Запись таблицы¦---+ ¦              ¦

            ¦               ¦ ¦    ¦    страниц   ¦     +--------------+

            +---------------+ ¦    +--------------+     +--------------+

            ¦               ¦ ¦    +--------------+ +-->¦              ¦

            ¦               ¦ ¦    ¦              ¦ ¦   ¦              ¦

            +---------------+ ¦    ¦              ¦ ¦   +--------------+

            ¦               ¦ ¦    +--------------+ ¦   +--------------+

            ¦               ¦ ¦    ¦              ¦ ¦+->¦              ¦

            +---------------+ ¦    ¦              ¦ ¦¦  ¦              ¦

            ¦               ¦ ¦    +--------------+ ¦¦  +--------------+

            ¦               ¦ ¦    ¦Запись таблицы¦-+¦  +--------------+

            +---------------+ ¦    ¦    страниц   ¦  ¦+>¦              ¦

                              ¦    +--------------+  ¦¦ ¦              ¦

                              ¦    ¦Запись таблицы¦--+¦ +--------------+

                              ¦    ¦    страниц   ¦ +-+ +--------------+

                              ¦    +--------------+ ¦ +>¦              ¦

                              ¦    ¦Запись таблицы¦-+ ¦ ¦              ¦

                              ¦    ¦    страниц   ¦   ¦ +--------------+

                              ¦    +--------------+   ¦

                              +--->¦Запись таблицы¦---+

                                   ¦    страниц   ¦

                                   +--------------+

Каждый диапазон памяти или домен в NetWare 4.0 отображается с помощью своей таблицы. Таким образом, эта таблица страниц определяет адреса физической памяти, доступные для этого домена. Работающий в домене процесс не может видеть адреса памяти, не отображенные явно на этот домен. Следовательно, для одного домена пространство памяти (адресов) других доменов логически не существует.

Как уже упоминалось, NetWare поддерживает в данный момент только домены OS и OS_Protected, однако в будущих версиях NetWare, где домены будут реализованы полностью, коммуникации между доменами будут осуществляться с помощью механизма копирования, который называется междоменным обращением XDC (Cross-Domain-Call). Средство копирования XDC моделируют технологию вызова удаленной процедуры RPC (Remote Procedure Call).

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

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

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

Каждый домен в Page Directory Table и таблицы страниц, на которые он указывает, используются для отображения различных диапазонов памяти в различные домены. Эти таблицы и флаги, обеспечивающие защиту по чтению и записи для отдельных страниц, предотвращают доступ любого домена к страницам памяти другого домена.

Команды защиты памяти

Первые четыре команды, описанные в данном разделе, доступны только как часть домена NLM. Остальные команды являются частью операционной системы и доступны в любое время. Каждую команду защиты памяти определяют следующие соглашения:
Пример
Описание
команда Слова, набранные в командной строке.
число-число Диапазон допустимых значений.
одно_слово Текст, введенный без пробелов.
"одно или более слов" Текст, введенный с пробелами.
(необязательное) Необязательное слово или число.
[on / off] Список допустимых в командной строке параметров.




                                    domain

Данная команда перечисляет текущий домен и все другие существующие домены. Когда вы загружаете NLM-модуль, он всегда будет загружаться в текущий домен. При запуске по умолчанию назначается домен OS. Эта команда перечисляет также NLM-модули, загруженные в каждый домен.


                              domain={имя_домена}

Данная команда устанавливает текущий домен в имя_домена (внутренние пробелы в этом имени не допускаются).


                                domain ring 1-3

Данная команда изменяет номер кольца защиты домена OS_Protected на 1, 2 или 3. По умолчанию домен OS_Protected имеет номер кольца 1. Помните о том, что в настоящее время NetWare поддерживает только домены OS и OS_Protected. Таким образом, не важно, зададите вы 1, 2 или 3, поскольку все три кольца представляют домен OS_Protected.


                                  domain_help

Данная команда выводит на экран основную информацию о доменных командах.


                       set read fault emulation={on/off}

Данная команда определяет действие, которое будет выполнять операционная система, когда в известной памяти происходит обращение к отсутствующей странице. Обращение к отсутствующей странице происходит, когда процесс пытается считать адрес памяти, не отображенный в его домен. Если в этой команде установлено ON, операционная система временно отображает страницу памяти в текущий домен и считывает ячейку памяти. Затем страница отображается вне домена. Получение уведомления об отсутствии страницы зависит от установки флага "set read fault notification".

Если эта команда устанавливается в OFF, а "set allow invalid pointers" также установлено в OFF, то попытка считать несуществующую память дает в результате ситуацию чтения отсутствующей страницы. Предпринимаемое доменом NLM действие зависит от флага "set developer option", но может включать в себя карантин процесса, NLM и/или весь домен. Кроме того, может произойти аварийное завершение работы сервера. По умолчанию устанавливается OFF.

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


                     set read fault notification={on/off}

Данная команда определяет, когда операционная система выводит сообщение на консоль или записывает его в файл регистрации. Если команда "set read fault emulation" или "set allow invalid pointers" установлены в ON, и происходит чтению по отсутствующему адресу, то, если эта команда установлена в ON, операционная система посылает на экран консоли и в файл регистрации сообщение, описывающее детали по чтению отсутствующей страницы.


                      set write fault emulation={on/off}

Данная команда определяет действие, выполняемое операционной системой, когда в известной памяти происходит запись в несуществующую страницу. Когда данная команда устанавливается в ON, операционная система временно отображает запрошенную страницу памяти в текущий домен, и операционная система выполняет инструкцию записи. Затем операционная система отменяет отображение страницы в текущем домене. Уведомление об обращении к несуществующей странице зависит от флага "set write fault notification".

Если эта команда установлена в OFF, и "set alloow invalid pointers" также установлено в OFF, то попытка записи в отсутствующую страницу памяти приводит к ситуации обращения к несуществующей странице. Предпринимаемое доменом NLM действие зависит от состояния флага "set developer option", но может включать в себя карантин процесса, NLM и/или всего домена. Кроме того, может происходить аварийное завершение работы сервера. По умолчанию устанавливается значение OFF.


                     set write fault notification={on/off}

Данная команда определяет, когда операционная система записывает сообщение на экран консоли или в файл регистрации. Если "set write fault emulation" или "set allow invalid pointers" устанавливается в ON, и происходит запись в несуществующую страницу, то, если данная команда установлена в ON, операционная система посылает сообщение, описывающее детальную информацию по обращению к несуществующей странице, на экран консоли и в файл регистрации.


                      set allow invalid pointers={on/off}

Данная команда определяет действие, выполняемое операционной системой при чтении или записи в несуществующую страницу, и эта ситуация не обрабатывается эмуляцией чтения или записи в несуществующую страницу. Если данный параметр установлен в ON, то операционная система отображает недопустимую (несуществующую) страницу памяти по данному адресу, что позволяет обработать обращение к памяти. Отсутствующая страница остается отображенной, пока данный параметр не будет выключен, или пока отображенная станица памяти не будет повторно использована для отображения другого отсутствующего адреса. Уведомлением пользователя о ситуации обращения по несуществующему адресу управляют команды "set read fault notification" и "set write fault notification".

Если данная команда установлена в OFF, то попытка чтения или записи отсутствующей страницы дает ситуацию обращения к несуществующей странице. Выполняемое доменом NLM действие зависит от состояния флага "set developer option", и может включать в себя карантин процесса, NLM и/или всего домена. Кроме того, может происходить аварийное завершение работы сервера. По умолчанию устанавливается значение OFF.


                            set developer={on/off}

Данная команда позволяет вам разрешить или запретить параметр, связанный с операционной средой разработчика. Если эта команда установлена в ON, то необработанная исключительная ситуация или прерывание приводит к аварийному завершению или вызову отладчика. Если эта команда установлена в OFF, то необработанная исключительная ситуация или прерывание будет вызывать карантин текущего домена.

Команды отладчика

Средства защиты памяти включают в себя команды отладчика, предназначенные для работы со средой защиты памяти и получения информации об этой среде. Команды отладчика кратко поясняются и описываются ниже.
Команда
Действие
.A Выводит на экран причину аварийного завершения или прерывания программы.
B Выводит все текущие точки останова.
BC номер Очищает заданную точку останова.
BCA Очищает все точки останова.
B = адрес{условие} Устанавливает точку останова при выполнении по заданному адресу.
BW = адрес{условие} Устанавливает точку останова при записи по заданному адресу.
BR = адрес{условие} Устанавливает точку останова по чтению/записи по заданному адресу.
C адрес Изменяет содержимое памяти в интерактивном режиме.
С адрес=числа Изменяет содержимое память в соответствии с заданным значением (значениями).
C адрес="текст" Изменяет содержимое памяти по указанному адресу на заданные текстовые значения (ASCII).
.C Выполняет диагностический дамп памяти на дискету.
D адрес{длина} Выполняет дамп памяти нужной длины.
DL{+смещение_связи} адрес{длина} Выполняет дамп памяти, начиная с заданного адреса, с возможным указанием длины и с перебором связанного списка (по умолчанию смещение в поле связи равно 0).
REG=значение Изменяет содержимое заданного регистра на новое значение. Здесь REG - это EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP, EIP или EFL.
F флаг=значение Изменяет бит флага на заданное значение (0 или 1). Здесь флаг может принимать значения CF, AF, ZF, SF, IF, TF, PF, DF или OF.
G{адеса(а)_прерыв} Начинает выполнение по текущему EIP и устанавливает необязательные временные точки останова.
H Выводит справочный экран по основным командам отладчика.
HB Выводит справочный экран по работе с точками останова.
HE Выводит справочный экран по выражениям.
.H Выводит справочный экран по командам с точкой.
/h Выводит справочных экран по отладки областей (для команд, связанных с защитой памяти).
I[B;W:D}PORT Вводит значения типа BYTE, WORD или DWORD из указанного порта PORT (по умолчанию вводится BYTE).
M начало{длина} байтовый_шаблон(ы) Ищет в памяти указанный байтовый шаблон (длина не обязательна; если она не указывается, то поиск выполняется во всей оставшейся памяти).
.M Выводит на экран имена и адреса загруженных модулей.
N имя адрес Определяет новый идентификатор с указанным именем по заданному адресу.
N -имя Удаляет идентификатор с заданными именем.
N-- Удаляет все определенные идентификаторы.
O{B;W;D}PORT=знач Выводит в указанный порт значение типа BYTE, WORD или DWORD.
P Продолжает выполнение со следующей инструкции.
.P Выводит все адреса и имена процессов.
.P<адрес> Выводит <адрес> как блок PCB (Process Control Block).
Q Выполняет выход и возврат в DOS.
R Выводит регистры и флаги.
.R Выводит блок PCB (Process Control Block).
S Выполнение по шагам.
.S Выводит все имена и адреса экранов.
.S<адрес> Выводит в качестве структуры экрана <адрес>.
T Пошаговое выполнение.
U адрес {счетчик} Дизассемблирует указанное число инструкций, начиная с заданного адреса.
V Просмотр экранов сервера.
.V Выводит на экран версию сервера.
Zвыражение Вычисляет выражение (см. справочный экран HE).
?{адрес} Если загружена информация об идентификаторах, то на экран выводятся идентификаторы, ближайшие к указанному адресу (по умолчанию EIP).

Для повторения команд D, DL, M, P, S, T и U используйте клавишу Enter.

Команды защиты памяти

Ниже перечислены команды защиты памяти.
Команда
Действие
RC Выводит на экран связанные с защитой командные регистры. Эти регистры доступны только по чтению; в настоящее время отладчик не имеет команд для их изменения.
.D Выводит экран таблицу страницы первого уровня для текущего домена.
.D<адрес> Выводит на экран таблицу страниц второго уровня для текущего домена по данному адресу.
.D={"имя_домена"} Устанавливает текущий домен отладчика в указанный домен. Это влияет на все команды отладчика, которые ссылаются на память. Эти команды ссылки на память могут видеть только ту память, которая доступна в команде консоли как "текущий домен".
/d Выводит на экран информацию о домене, включая имя, номер кольца, CR3, статус и список загруженных NLM.
/d=<имя_домен> Устанавливает текущий домен в соответствии с заданным доменом.
/h Выводит на экран справочный экран отладки домена.
/f Выводит на экран текущий кадр стека RPC.
/s Выводит на экран другие кадры стека RPC.
/r Выводит на экран содержимое псевдорегистров RPC.
/q<имя_идентиф> Выводит на экран данные RPC для заданного идентификатора.
/q<адр_псевдокод> Выводит на экран данные RPC для заданного адреса псевдокода.
/u[<адрес >] Дизассемблирует псевдокод RPC по заданному адресу или, если адрес не задается, по текущему IP псевдокода.
/t Выводит на экран текущий буфер трассировки.
/tc Очищает текущий буфер трассировки.
/x Выводит на экран статус трассировки RPC и останова.
/y Выводит на экран статус трассировки IBT, останова и трассировки прерываний.
/x+/x-/xt+/xt-/xb+/xb- Выключают/выключают трассировку RPC и останов.
/y+/y-/yt+/yt-/yb+/yb-/yi+/yi- Выключают/выключают трассировку IBT, трассировку прерывания и/или останов по IBT.
.F Включает/выключает параметр разработчика.
.G Выводит на экран глобальную таблицу дескрипторов (GDT).
.I Выводит на экран таблицу дескрипторов прерываний (IDT).
.M Выводит на экран список предыдущих модулей и (если он существует) адрес глобального кода и его длину, а также адрес глобальных данных и их длину.
.R Выводит на экран и выполняет текущий блок PCP (Process Control Block). Эта команда идентична команде .P<адрес>, где адрес - это адрес выполняющегося процесса.
.T<адрес> Эта и следующая команда выводит на экран адреса TSS (Task State Segment) в памяти и все регистры, записанные в TSS. Команда .T выводит TSS по заданному адресу. По умолчанию она выводит кадр текущего стека.
.TS<селектор> Эта и предыдущая команда выводит на экран адреса TSS (Task State Segment) в памяти и все регистры, записанные в TSS. Команда .TS выводит TSS по заданному селектору. По умолчанию она выводит кадр текущего стека.
.L<смещение_PDE> [<смещение_PTE>] Команда преобразования линейного адреса. Она позволяет выполнять преобразование линейных/физических адресов и работать с таблицами страниц. Эта команда для получения полного линейного адреса комбинирует смещение страницы каталога (PAGE Directory) и необязательное смещение страницы/таблицы.
.LA<лин_адрес> [<CR3>] Команда преобразования линейного адреса. Она позволяет выполнять преобразование линейных/физических адресов и работать с таблицами страниц. Эта команда транслирует линейный адрес в физический и выводит на экран все записи таблицы страницы, которые отображаются в этот физический адрес. Если адрес опущен, то по умолчанию используется ESP.
.LP<физ_адрес> [<CR3>] Команда преобразования линейного адреса. Она позволяет выполнять преобразование линейных/физических адресов и работать с таблицами страниц. Эта команда идентичная команде .LA, но воспринимает в качестве ввода физический адрес.
.LX<лин_адрес> Команда преобразования линейного адреса. Она позволяет выполнять преобразование линейных/физических адресов и работать с таблицами страниц. Эта команда воспринимает линейный адрес и разбивает его на компоненты каталога страниц/записи.

[Назад] [Содержание] [Вперед]