Чтобы защитить жизненно важные системные данные от доступа и (или) внесения изменений со стороны пользовательских приложений, в Windows используются два процессорных режима доступа (даже если процессор, на котором работает Windows, поддерживает более двух режимов): пользовательский режим и режим ядра.
Код пользовательского приложения запускается в пользовательском режиме, а код операционной системы (например, системные службы и драйверы устройств) запускается в режиме ядра. Режим ядра — такой режим работы процессора, в котором предоставляется доступ ко всей системной памяти и ко всем инструкциям центрального процессора. Предоставляя программному обеспечению операционной системы более высокий уровень привилегий, нежели прикладному программному обеспечению, процессор гарантирует, что приложения с неправильным поведением не смогут в целом нарушить стабильность работы системы.
ПРИМЕЧАНИЕ В архитектурах процессоров x86 и x64 определены четыре уровня привилегий (или четыре кольца) для защиты системного кода и данных от непреднамеренной или злонамеренной перезаписи в результате выполнения кода, имеющего более низкий уровень привилегий. Windows использует уровень привилегий 0 (или кольцо 0) для режима ядра, и уровень привилегий 3 (или кольцо 3) для пользовательского режима. Причина, по которой в Windows используются только два уровня, заключается в том, что в некоторых аппаратных архитектурах, поддерживаемых в прошлом (например, Compaq Alpha и Silicon Graphics MIPS), были реализованы только два уровня привилегий.
Хотя у каждого Windows-процесса есть свое собственное закрытое адресное пространство, код операционной системы и код драйвера устройства, используют одно и то же общее виртуальное адресное пространство. Каждая страница в виртуальной памяти имеет пометку, показывающую, в каком режиме доступа должен быть процессор для чтения и (или) записи страницы. Доступ к страницам в системном пространстве может быть осуществлен только из режима ядра, тогда как доступ ко всем страницам в пользовательском адресном пространстве может быть осуществлен из пользовательского режима.
Архитектура Windows. Как устроена операционная система Виндовс и как работает?
Станицы, предназначенные только для чтения (например, те страницы, которые содержат статические данные), недоступны для записи из любого режима. Кроме того, при работе на процессорах, поддерживающих защиту той памяти, которая не содержит исполняемого кода (no-execute memory protection), Windows помечает страницы, содержащие данные, как не исполняемые, предотвращая тем самым неумышленное или злонамеренное выполнение кода из областей данных.
32-разрядные версии Windows не защищают закрытую системную память чтения-записи, используемую компонентами операционной системы, запущенными в режиме ядра. Иными словами, в режиме ядра код операционной системы и драйвера устройства имеют полный доступ к системному пространству памяти и могут обойти систему защиты Windows, получив доступ к объектам. Поскольку основная часть кода операционной системы Windows работает в режиме ядра, очень важно, чтобы компоненты, работающие в этом режиме, были тщательно проработаны и протестированы, чтобы не нарушать безопасность системы или не становиться причиной нестабильной работы системы.
Что такое ядро операционной системы? Назначение и виды ядер
Отсутствие защиты также подчеркивает необходимость проявлять особую осторожность при загрузке драйвера устройства стороннего производителя, потому что программное обеспечение, работающее в режиме ядра, имеет полный доступ ко всем данным операционной системы. Этот недостаток стал одной из причин введения в Windows механизма подписи драйверов, который выводит предупреждение пользователю при попытке добавления автоматически настраиваемого (Plug and Play) драйвера, не имеющего подписи (или, при определенной настройке, блокирует добавление такого драйвера). Помимо этого верификатор драйверов — Driver Verifier — помогает создателям драйверов выискивать просчеты (например, переполнение буферов или допущение утечек памяти), способные повлиять на безопасность или стабильность работы системы.
В 64-разрядных версиях Windows политика подписи кода в режиме ядра —Kernel Mode Code Signing (KMCS) — требует, чтобы все 64-разрядные драйверы устройств (не только автоматически настраиваемые) были подписаны криптографическим ключом, присвоенным одним из основных центров сертификации кода.
Пользователь не может напрямую заставить систему установить не подписанный драйвер, даже имея права администратора, за единственным исключением: эти ограничения могут быть отключены вручную во время загрузки системы путем нажатия клавиши F8 и выбора дополнительного параметра загрузки Disable Driver Signature Enforcement (Выключить принуждение к подписыванию драйверов). При этом выключаются водяной знак на обоях для рабочего стола и определенные функции системы управления правами на цифровые материалы — digital rights management (DRM).
В цикле статей «Архитектура системы» будет показано, что пользовательские приложения осуществляют переключение из пользовательского режима в режим ядра при осуществлении вызова системной службы. Например, Windows-функции ReadFile, в конечном счете, необходим вызов внутренней стандартной программы Windows, управляющей чтением данных из файла. Поскольку эта стандартная программа обращается к структурам внутренних системных данных, она должна работать в режиме ядра.
Переход из режима пользователя в режим ядра осуществляется за счет использования специальной инструкции процессора, которая заставляет процессор переключиться в режим ядра и войти в код диспетчеризации системных служб, вызывающий соответствующую внутреннюю функцию в Ntoskrnl.exe или в Win32k.sys. Перед тем как вернуть управление пользовательскому потоку, процессор переключается в прежний, пользовательский режим работы. Таким образом, операционная система защищает саму себя и свои данные от прочтения и модификации со стороны пользовательских процессов.
ПРИМЕЧАНИЕ Переход из пользовательского режима в режим ядра (и назад) не влияет на планирование работы потоков как таковое — переход из режима в режим не является переключением контекста.
Таким образом, пользовательский поток вполне может выполняться часть времени в пользовательском режиме, а другую часть времени — в режиме ядра.
Фактически, из-за того, что основная масса графики и оконная система также работают в режиме ядра, приложения, интенсивно использующие графику, проводят большую часть своего времени в режиме ядра, нежели в пользовательском режиме. Это легко проверить, если запустить приложение, интенсивно использующее графику, например, Microsoft Paint или Microsoft Chess Titans, и посмотреть, как распределяется время между пользовательским режимом и режимом ядра, используя для этого один из счетчиков производительности, перечисленных в таблице.
Более сложные приложения могут использовать такие новые технологии, как Direct2D и создание составных изображений (compositing), которые проводят основной объем вычислений в пользовательском режиме и отправляют ядру только исходные данные поверхностей, сокращая время, затрачиваемое на переходы между пользовательскими режимами и режимами ядра.
Процессор: % работы в привилегированном режиме (Processor: % Privileged Time) | Процентный показатель работы отдельного центрального процессора (или всех центральных процессоров) в режиме ядра в течение определенного интервала времени |
Процессор: % работы в пользовательском режиме (Processor: % User Time) | Процентный показатель отдельного центрального процессора (или всех центральных процессоров) в пользовательском режиме в течение определенного интервала времени |
Процесс: % работы в привилегированном режиме (Process: % Privileged Time) | Процентный показатель работы потоков процесса в режиме ядра в течение определенного интервала времени |
Процесс: % работы в пользовательском режиме (Process: % User Time) | Процентный показатель работы потоков процесса в пользовательском режиме в течение определенного интервала времени |
Поток: % работы в привилегированном режиме (Thread: % Privileged Time) | Процентный показатель работы потока в режиме ядра в течение определенного интервала времени |
Поток: % работы в пользовательском режиме (Thread: % User Time) | Процентный показатель работы потока в пользовательском режиме в течение определенного интервала времени |
Related posts:
- Кризисное обслуживание системы
- Персонализация меню «Пуск»
- Серверный процессор
- «Не беспокоить» в Виндовс 10
Источник: datbaze.ru
Режим ядра — kernel mode или привилегированный режим для работы операционной системы.
Модули ОС работают в режиме ядра в привилегированном режиме и резидентны в ОЗУ.
В режиме ядра доступны все команды процессора, вся имеющаяся память и любые регистры.
Код ядра имеет доступ к областям памяти всех приложений, но сам от них полностью защищен.
Для поддержки режима ядра процессор должен иметь команды –
переключения задач, управления ввода — вывода, управления
механизмами распределения и защиты памяти (управления адресны-
ми пространствами), прерываний.
Код ОС выполняется в этом режиме.
При выполнении кода операционной системы процессор переключается в режим ядра.
Пользовательский режим
Все приложения выполняются в пользовательском режиме иставятся в подчиненное положение по отношению к ОС за счет запрета выполнения в пользовательском режиме некоторых команд, связанных с переходом в привилегированный режим ( переключение процессора с задачи на задачу, управление вводом – выводом, доступ к механизмам распределения и защиты памяти и др.).
Пользовательский режим ограничен безвредными функциями для ОС.
В пользовательском режиме доступ к регистрам и памяти ограничен.
Приложение не сможет работать с памятью за пределами набора адресов, установленного для него операционной системой, или обращаться напрямую к регистрам устройств.
В нем нет и непосредственного доступа к аппаратуре, доступа к виртуальной памяти другой программы, нет разрешения на аппаратные операции ввода – вывода, IN, OUT и др.
Они выполняются только вызовами ОС.
Операции функций ядра приложениямпользователей непосредственно недоступны.
Приложение может к ним обратиться только через системные вызовы (типа Create, Open,…) по технологии клиент – сервер.
При создании объектов ядра(Create)вызовы возвращают программе дескрипторы объекта – это адрес (или индекс) в таблице описателей.
Пустая таблица дескрипторов создается при инициализации процессов.
Используется объектами ядра.
Но как только поток вызывает функцию создания объекта ядра, происходит заполнение таблицы.
Функция ищет в таблице дескрипторов процесса и считывает адрес нужного объекта ядра.
При вызове функции с аргументом дескриптора объекта ей передается значение, возвращенное вызовом Create.
Совместно используемый объект ядра удаляется после отказа от него всех процессов (при счетчике числа процессов равном 0).
Системный вызов переводит процессор в привилегированный режим и при возврате – обратный процесс.
Таким образом, для переключения из пользовательского режима в режим ядра существует единственный способ – с помощью системных вызовов, реализуемых операционной системой.
Первоначально в привилегированном режиме ядра выполнялся весь код ОС.
Такой монолитный подход имел недостатки с точки зрения открытости, разработки программ, надежности или легкости обслуживания.
Более удобен вариант построения операционной системы, называемый микроядерным.
Это альтернатива классической архитектуре построенияОС.
Микроядерная архитектура операционной системы делит ее на две части:
1. Одна часть операционной системы содержит небольшое микроядро (micro-kernel), код которого выполняется в привилегированном режиме ядра.
Оно защищено от остальных частей ОС и приложений и выполняет базовые (основные) функции ОС.
Базовые функции ядра современных многозадачных ОС обычно включают:
— управление процессами (процессорным временем);
— управлению виртуальной памятью;
— управление прерываниями.
— управление задачами и переключением контекстов задач;
— управлению УВВ (аппаратным вводом — выводом );
— загрузка/выгрузка страниц и др.
— пересылке сообщений;
— создание объектов ядра.
Обслуживание аппаратного ввода – вывода в защищенном режиме выполняется в привилегированном режиме ядра.
Для получения возможностей выполнения операций ввода-вывода текущий процесс должен иметь уровень привилегийRPLне ниже уровня привилегий, указанного в поле IOPL(input output privilege level) регистра флагов FLAGS.
Если это условие не соблюдено, то возможности доступа к порту устройства ввода – вывода определяются соответствующим битом битовой карты разрешения ввода / вывода, хранимой в сегменте состояния задачи TSS.
Карта ввода-вывода TSS состоит из 64 кбит (8 кбайт ) для описания доступа к 65536 портам.
Значение бита, равное нулю, разрешает операцию ввода-вывода с соответствующим портом.
Для них используется область памяти, называемая отображением ввода — вывода на память. Для этой области запрещено кэширование.
В режиме ядра работают и диспетчер ввода – вывода и драйверы, к которым может обращаться диспетчер ввода – вывода.
Практически микроядро должно содержатьтолько код:
Дата добавления: 2018-08-06 ; просмотров: 1165 ; Мы поможем в написании вашей работы!
Поделиться с друзьями:
Источник: studopedia.net
Sysadminium
Чтобы приложения не могли прочитать или изменить данные операционной системы, были предусмотрены разные режимы доступа к процессору.
Оглавление скрыть
Режимы доступа к процессору
Приложения, которые запускает пользователь в системе, выполняются в пользовательском режиме. А системные службы и драйверы работают в режиме ядра. Такое разделение необходимо, чтобы пользовательские приложения не могли нарушить работу системы. Плохое приложение не должно сломать вам всю систему.
Хотя каждый процесс обладает собственным закрытым адресным пространством, всё что работает в режиме ядра использует единое адресное пространство. К адресному пространству ядра можно получить доступ только из режима ядра. Но к памяти пользовательского процесса можно получить доступ из любого режима. Дополнительно стоит отметить память, которая доступна только для чтения. Такая память недоступна на запись для кода из любого режима.
В режиме ядра работает часть операционной системы и драйверы. И все они могут вмешиваться в работу друг друга. И очень важно чтобы все компоненты работающие в этом режиме были тщательно спроектированы и протестированы. Любой некорректно написанный драйвер может повредить всю систему.
Именно по этой причине в Windows 2000 появился механизм цифровой подписи драйверов. Этот механизм запрещал установку не подписанных драйверов, но только для Plug and Play устройств.
Ужесточение политики работы со сторонними драйверами
В Windows 8.1 политика подписывания кода режима ядра требует, чтобы все драйверы устройств (а не только Plug and Play) подписывались криптографическим ключом, выданным одним из ведущих центров сертификации. Пользователям запретили установку не подписанных драйверов, даже с правами администратора. Но такое ограничение можно отключить вручную. В этом случае драйверы самоподписываются, а на обоях рабочего стола выводится надпись «Тестовый режим«.
В Windows 10 ещё сильнее ужесточили правила подписывания драйверов. Теперь все новые драйверы должны подписываться только двумя возможными центрами сертификации с сертификатом SHA-2 Extended Validation (EV) вместо обычного файлового сертификата SHA-1 и его 20 центрами сертификации. Но это ещё не все, после подписания драйвер нужно отправить в Microsoft через портал SysDev для аттестации. И только после аттестации драйвер получит цифровую подпись Microsoft. Соответственно, ядро принимает только драйверы с подписью Microsoft без каких-либо исключений, кроме «Тестового режима«.
В Windows Server 2016 операционная система действует еще радикальнее. Кроме требований EV простого аттестационного подписывания недостаточно. Чтобы драйвер загружался в серверной системе, он должен пройти жесткий процесс сертификации WHQL (Windows Hardware Quality Labs) в составе НСК (Hardware Compatibility Kit). Только драйверам с подписью WHQL разрешается загрузка в таких системах.
В целом сокращение количества сторонних драйверов, которым разрешается загрузка в режиме ядра, значительно повысило стабильность и безопасность системы.
Переключение из одного режима в другой
Пользовательские приложения могут переключаться из пользовательского режима в режим ядра используя специальные системные функции. Таким образом, для пользовательского потока нормально проводить часть времени в пользовательском режиме, а часть времени в режиме ядра. Более того, поскольку большая часть графической системы выполняется в режиме ядра, процессы приложений, интенсивно работающих с графикой, могут проводить в режиме ядра больше времени, чем в пользовательском режиме. Чтобы убедиться в этом, запустите Paint и понаблюдайте за распределением времени между пользовательским режимом и режимом ядра с помощью Process Explorer:
Наблюдение за переключениями в Системном мониторе
Запустите «Системный монитор«:
Удалите счетчик «по умолчанию» и добавьте следующие счетчики: объект «Процесс», два счетчика «% работы в пользовательском режиме» и «% работы в привилегированном режиме». Далее выберите процесс mspaint.
Порисовав немного в Paint увидим следующее:
Более современные приложения могут использовать новые технологии, например Direct2D и DirectComposition. Они выполняют большие объемы вычислений в пользовательском режиме и передают ядру только низкоуровневые данные. Таким образом сокращается время, расходуемое на переключение между пользовательским режимом и режимом ядра.
Источник: sysadminium.ru