Отправляет email-рассылки с помощью сервиса Sendsay

Внутренее устройство Windows

  Все выпуски  

Внутренее устройство Windows


Для предотвращения доступа приложений к критически важным данным операционной системы и устранения риска их модификации Windows использует два режима доступа к процессору (даже если он поддерживает более двух режимов):пользовательский (user mode) и ядра (kernel mode).Код приложений работает в пользовательском режиме,тогда как код операционной системы (например,системные сервисы и драйверы устройств) - в режиме ядра.В режиме ядра предоставляется
доступ ко всей системной памяти и разрешается выполнять любые машинные команды процессора.Предоставляя операционной системе более высокий уровень привилегий,чем прикладным программам,процессор позволяет разработчикам операционных систем реализовать такие архитектуры,которые не дают возможности сбойным приложениям нарушать стабильность работы всей системы.
 В архитектуре процессора Intel x86 определено четыре уровня привилегий,или колец (rings),предназначенных для защиты кода и данных системы от случайной или умышленной перезаписи кодом с меньшим уровнем привилегий.Windows использует уровень привилегий 0 (или кольцо 0) для режима ядра и уровень 3 (или кольцо 3) для пользовательского режима.Почему Windows использует только 2 уровня?Дело в том,что на некоторых из ранее поддерживавшихся аппаратных платформ (например,Compaq Alpha и Silicon Graphics MIPS) реализовано лишь два уровня привилегий.
 Хотя каждый Windows-процесс имеет свою (закрытую) память,код операционной системы и драйверы устройств,работающие в режиме ядра,делят единое виртуальное пространство.Каждая страница в виртуальной памяти помечается тэгом,определяющим,в каком режиме должен работать процессор для чтения и/или записи данной страницы.Страницы в системном пространстве доступны лиш в режиме ядра,а все страницы в пользовательском адресном пространстве - в пользовательском режиме.Страницы только для чтения (например,содержащие лишь исполняемый код) ни в каком режиме для записи недоступны.
 Windows не предусматривает никакой защиты системной памяти от компонентов,работающих в режиме ядра.Иначе говоря,код операционной системы и драйверов устройств в режиме ядра получает полный доступ к системной памяти и может обходить средства защиты Windows для обращения к любым объектам.Поскольку основная часть кода Windows выполняется в режиме ядра,крайне важно,чтобы компоненты,работающие в этом режиме,были тщательно продуманы и протестированы.
 Это также подчеркивает,насколько надо быть осторожным при загрузке драйвера устройства от стороннего поставщика: перейдя в режим ядра,он получит полный доступ ко всем данным операционной системы.Такая уязвимость стала одной из причин,по которым в Windows введен механизм проверки цифровых подписей драйверов,предупреждающий пользователя о попытке установки неавторизованного (неподписанного) драйвера.Кроме того,механизм Driver Verifier (верификатор драйверов) помогает разработчикам драйверов устройств находить в них ошибки (вызывающие,например,утечку памяти или переполнения буферов).
 Прикладные программы могут переключатся из пользовательского режима в режим ядра,обращаясь к системному сервису.Например,Windows-функции ReadFile в ходе своего выполнения приходится вызывать внутренюю подпрограмму Windows - она тои считывает данные из файла.Так как эта подпрограмма обращается к внутрисистемным структурам данных,она должна выполнятся в режиме ядра.Переключение из пользовательского в режим ядра осуществляется специальной командой процессора.Операционная система перехватывает эту команду,обнаруживает запрос системного сервиса,проверяет аргументы,которые поток передал системной функции,и выполняет внутренюю подпрограмму.Перед возвратом управления пользовательскому потоку процессор переключается обратно в пользовательский режим.Благодаря этому операционная система защищает себя и свои данные от возможной модификации пользовательскими процессами.
 Переключение из пользовательского режима в режим ядра (и обратно) не влияет на планирование потока,так как контекст в этом случае не переключается.
 Так что ситуация,когда пользовательский поток часть своего времени работает в пользовательском режиме,а часть - в режиме ядра,совершенно нормальна.А поскольку подсистема,отвечающая за поддержку графики и окон,функционирует в режиме ядра,то приложения,интенсивно работающие с графикой,большую часть времени действуют в режиме ядра,а не в пользовательском режиме.Самый простой способ проверить это - запустить приложение вроде Microsoft Paint и с помощью одного из счетчиков оснастки Performance (Производительность) понаблюдать за показателями времени работы в пользовательском режиме и в режиме ядра.
 
 Двойной щелчек по процессу.
 
 Processor: %Privileged Time - Процентная доля времени,в течение которого отдельный процессор (или все процессоры) работал в режиме ядра.
 Processor: %User Time - Процентная доля времени,в течение которого отдельный процессор (или все процессоры) в пользовательском режиме.
 Process: %Privileged Time - Процентная доля времени,в течение которого потоки данного процесса выполнялись в режиме ядра.
 Process: %User Time - Процентная доля времени,в течение которого потоки данного процесса выполнялись в пользовательском режиме.
 Thread: %Privileged Time - Процентная доля времени,в течение которого данный поток выполнялся в режиме ядра.
 Thread: %User Time - Процентная доля времени,в течение которого данный поток выполнялся в пользовательском режиме.
 
 ЭКСПЕРИМЕНТ: наблюдение за активностью потоков с помощью Qslice.exe (скачать http://www.catalog3.ru/soft/index1.html)
 Qslice.exe позволяет в динамике наблюдать за соотношением времени,проведенного каждым процессом в режиме ядра и в пользовательском режиме.На диаграмме красная часть столбца отражает количество процессорного времени в режиме ядра,а синяя - в пользовательском режиме.Сумма всех показателей,отображаемых столбцами в окне Qslice.exe,должна соответсвовать 100% процессорного времени.Например,попробуйте запустить такое интенсивно использующее графику приложение,как Mspaint.exe.Откройте Qslice.exe,расположив его окно рядом с окном Paint,и нарисуйте в Paint несколько кривых.В это время вы сможете наблюдать за выполнением Mspaint.exe в окне Qslice.exe.
 Чтобы получить дополнительную информацию о потоках процесса,дважды щелкните имя нужного процесса или соответсвующий цветной столбик на диаграмме.Вы увидите список потоков этого процесса и относительное процессорное время,используемое каждым потоком (в рамках процесса,а не всей системы).
 
 ЭКСПЕРИМЕНТ: режим ядра и пользовательский режим
 С помощью оснастки Performance вы можете выяснить,сколько времени ваша система работает в режиме ядра и в пользовательском режиме.
 1.Запустите оснастку Performance,открыв панель управления/администрирование/производительность (Performance).
 2.Щелкните на панели инструментов кнопку Add (добавить) (на этой кнопке изображен большой знак плюс).
 3.Выберите в списке объект Processor,щелкните счетчик %Privileged Time (%работы в привилигированном режиме) и,удерживая клавишу Ctrl в нажатом состоянии,щелкните счетчик %User Time (% работы в пользовательском режиме).
 4.Щелкните кнопку Add,а затем Close.
 5.Быстро подвигайте мышью.При этом вы должны заметить всплеск на линии %Privileged Time,который отражает время,затраченное на обслуживание прерываний от мыши,и время,понадобившееся подсистеме поддержки оконна отрисовку графики (эта подсистема работает преимущественно как драйвер устройства в режиме ядра).
 6.Закончив,щелкните на панели инструментов кнопку New Counter Set (новый набор счетчиков) (или просто закройте оснастку).
 За той же активностью можно наблюдать через Task Manager (диспетчер задач).Просто перейдите в нем на вкладку Performance,а затем выберите из меню View (вид) команду Show Kernel Times (вывод времени ядра).Процент загруженности процессора отражается зеленым цветом,а процент времени работы в режиме ядра - красным.
 Чтобы увидеть,как сама оснастка Performance использует время в двух режимах,запустите ее снова,но добавьте те же счетчики для объекта Process.
 1.Если вы закрыли оснастку Performance,снова запустите ее.(Если она уже работает,откройте новый экран,щелкнув на панели инструментов кнопку New Counter Set.)
 2.Щелкните кнопку Add на панели инструментов.
 3.Выберите в списке объект Process.
 4.Выберите счетчики %Privileged Time и %User Time.
 5.В списке экземпляров объекта выберите все процессы (кроме процесса _Total).
 6.Щелкните кнопку Add,а затем Close.
 7.Быстро подвигайте мышью.
 8.Нажмите комбинацию клавиш Ctrl+H для активизации режима выделения - текущий выбранный счетчик будет выделен белым цветом в Windows 2000 и черным в Windows XP или Windows Server 2003.
 9.Прокрутите список всех счетчиков в нижней части окна оснастки,чтобы определить процессы,потоки которых выполнялись при перемещении мыши,и обратите внимание на то,в каком режиме они выполнялись - пользовательском или ядра.
 Вы должны заметить,как значения счетчиков для процесса оснастки Performance - ищите mmc в  колонке Instance (Экземпляр) - резко увеличиваются при перемещении мыши,поскольку код приложения выполняется в пользовательском режиме,а вызываемые им Windows-функции в режиме ядра.Вы также заметите,что при перемещении мыши увеличивается активность работы в режиме ядра потока процесса csrss.Он представляет поток необработанного ввода (raw input thread) подсистемы Windows,принимающий ввод от клавиатуры и мыши и передающий его процессу,к которому он подключен.Наконец,процесс с именем Idle,потоки которого,как вы убедитесь,тратят почти 100% своего времени в режиме ядра на самом деле не является процессом.Это лжепроцесс,используемый для учета тактов процессора в состоянии простоя.Таким образом,когда Windows нечего делать,она предается этому занятию в режиме ядра.

В избранное