Как Windows защищает переход в режим ядра?

Рамка коллекций google предлагает цитату хорошего метода преобразования, поэтому вы можете преобразовать объекты в строки. Единственный недостаток заключается в том, что он должен быть от Iterable до Iterable, но так я бы это сделал:

Iterable<Object> objects = ....... //Your chosen iterable here
Iterable<String> strings = com.google.common.collect.Iterables.transform(objects, new Function<Object, String>(){
        String apply(Object from){
             return from.toString();
        }
 });

Это уберет вас от использования массивов, но я думаю, что это было бы моим предпочтительным способом ,

13
задан Peter Mortensen 9 November 2017 в 22:03
поделиться

5 ответов

Вы, вероятно, думаете, что поток, работающий в пользовательском режиме, вызывает кольцо 0, но на самом деле это не так. Поток пользовательского режима вызывает исключение, перехватываемое кодом Ring 0. Поток пользовательского режима останавливается, и ЦП переключается на поток ядра / кольца 0, который затем может проверять контекст (например, стек вызовов и регистры) потока пользовательского режима, чтобы выяснить, что делать. Перед системным вызовом это было скорее исключением, чем специальным исключением, специально для вызова кода кольца 0.

Если вы прислушаетесь к совету других ответов и прочитаете руководства Intel , вы увидите syscall / sysenter не принимает никаких параметров - ОС решает, что происходит. Вы не можете вызвать произвольный код.

18
ответ дан 1 December 2019 в 18:49
поделиться

Я думаю (могу ошибаться), что механизм, который он использует для перехода, прост:

  • Код пользовательского режима выполняет программное прерывание
  • Это (прерывание) вызывает ветвление в место, указанное в таблице дескрипторов прерываний (IDT)

. Вот что предотвращает узурпацию кода пользовательского режима: вам необходимо иметь право писать в IDT; поэтому только ядро ​​может указать, что происходит при выполнении прерывания.

7
ответ дан 1 December 2019 в 18:49
поделиться

Intel CPUs enforce security using what's called 'Protection Rings'.

There are 4 of these, numbered from 0 to 3. Code running in ring 0 has the highest privileges; it can (practically) do whatever it pleases with your computer. The code in ring 3, on the other hand, is always on a tight leash; it has only limited powers to influence things. And rings 1 and 2 are currently not used for any purpose at all.

A thread running in a higher privileged ring (such as ring 0) can transition to lower privilege ring (such as ring 1, 2 or 3) at will. However, the transition the other way around is strictly regulated. This is how the security of high privileged resources (such as memory) etc. is maintained.

Naturally, your user mode code (applications and all) runs in ring 3 while the OS's code runs in ring 0. This ensures that the user mode threads can't mess with the OS's data structures and other critical resources.

For details on how all this is actually implemented you could read this article. In addition, you may also want to go through Intel Manuals, especially Vol 1 and Vol 3A, which you can download here.

This is the story for Intel processors. I'm sure other architectures have something similar going on.

9
ответ дан 1 December 2019 в 18:49
поделиться

Код, работающий в режиме пользователя (кольцо 3), не может произвольно перейти в режим ядра (кольцо 0). Это можно сделать только с помощью специальных маршрутов - шлюзов перехода, прерываний и векторов sysenter. Эти маршруты хорошо защищены, а входные данные очищаются, чтобы плохие данные не могли (не должны) вызывать плохое поведение.

Все это настраивается ядром, обычно при запуске. Его можно настроить только в режиме ядра, поэтому код пользовательского режима не может его изменить.

4
ответ дан 1 December 2019 в 18:49
поделиться

Вероятно, будет справедливо сказать, что он делает это (относительно) аналогично тому, как это делает Linux. В обоих случаях это будет зависеть от процессора, но на x86 возможно либо программное прерывание с помощью инструкции INT, либо с помощью инструкции SYSENTER.

Преимущество изучения того, как это делает Linux, состоит в том, что вы можете сделать это без Windows исходная лицензия.

Исходная часть пользовательского пространства находится здесь на LXR и бит пространства ядра - посмотрите entry_32.S и entry_64.S

В Linux на x86 существует три различных механизма: int 0x80, syscall и sysenter.

Библиотека, которая создается во время выполнения с помощью ядро с именем vdso вызывается библиотекой C для реализации функции syscall, которая использует другой механизм в зависимости от процессора и от того, какой это системный вызов. Затем ядро ​​имеет обработчики для этих механизмов (если они существуют в конкретном варианте ЦП).

3
ответ дан 1 December 2019 в 18:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: