Как определить, находится ли процесс в ядре или в пространстве пользователя? - PullRequest
1 голос
/ 15 ноября 2011

Некоторые процессы, и в частности некоторые демоны, могут выполняться либо в пространстве ядра, либо в пространстве пользователя (что-то вроде того, как пользователь может работать в обычном или суперпользовательском режиме). Есть ли простой способ узнать, что это за процесс (демон)?

Ответы [ 2 ]

1 голос
/ 16 ноября 2011

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

EDIT

По крайней мере, в Linux, я не думаю, что есть какой-либо способ определить, попадет ли процесс, работающий только на ядро, в пространство пользователя; В конце концов, ядру разрешено делать все, что захочет. Но вы можете использовать некоторую эвристику, чтобы сделать обоснованное предположение. Например, pmap скажет вам, какая память пользовательского пространства отображена для процесса; отсутствие памяти является достаточно убедительным доказательством (возможно, неопровержимым) того, что это задача ядра. Таким же образом, если поле VSZ в 'ps l' равно 0, это означает, что у задачи нет выделенной памяти пользовательского пространства. Если вам просто интересно, находится ли задача в ядре в данный момент времени, поле WCHAN в 'ps l' подскажет вам; если это что-то отличное от ..., это в ядре, если это -, то, скорее всего, в пользовательском пространстве, но я не уверен, может ли это также означать, что оно было просто вытеснено в пространстве ядра.

0 голосов
/ 22 октября 2018

Существуют специфичные для архитектуры регистры, которые могут определить, в каком режиме вы находитесь: -

a) Вы можете использовать отладчики hw / sw для проверки значения этих регистров во время отладки. e; g: CPSR для руки и CS для x86

Младшие два бита дескриптора сегмента кода будут определять текущий уровень привилегий, который выполняет код

b) Из кода вы можете использовать макрос user_mode(regs), который внутренне использует регистр cpsr или cs.

user_mode (regs) определяет, пришел ли набор регистров из пользовательского режима.

Например: в руке, CPSR используется

#define user_mode(regs) \
    (((regs)->ARM_cpsr & 0xf) == 0)

https://elixir.bootlin.com/linux/v4.5/source/arch/arm/include/asm/ptrace.h#L20

например: - в x86 cs используется

static inline int user_mode(struct pt_regs *regs)
{
#ifdef CONFIG_X86_32
    return ((regs->cs & SEGMENT_RPL_MASK) | (regs->flags & X86_VM_MASK)) >= USER_RPL;
#else
    return !!(regs->cs & 3);
#endif
}

https://elixir.bootlin.com/linux/v4.5/source/arch/x86/include/asm/ptrace.h#L106

для всех других архитектур, проверьте ссылку ниже

https://elixir.bootlin.com/linux/v4.5/ident/user_mode

...