Linux에서 프로세스가 어느 링에서 실행되고 있는지 확인하는 방법은 무엇입니까?

Linux에서 프로세스가 어느 링에서 실행되고 있는지 확인하는 방법은 무엇입니까?

특정 프로세스가 어떤 보호 링에서 실행되고 있는지 어떻게 확인할 수 있나요? 가능하다면 실행 중인 프로세스 목록과 해당 링을 생성할 수 있나요? 이 스레드는 x86 프로세서에서 사용되는 링에 대한 통찰력을 제공합니다.https://stackoverflow.com/questions/18717016/what-are-ring-0-and-ring-3-in-the-context-of-operating-systems

링 프로세스에 대한 설명을 제공하지 않고 내가 실행 중인 보호 링 수준 프로세스를 찾는 방법을 알고 싶습니다.~ 할 것이다실행 중입니다(원하는 경우 포함할 수도 있음).

답변1

존재하다x86, 현재 권한 수준은아래 두 자리 숫자로 결정스니펫 선택기,CS 레지스터에 저장된 값입니다. 따라서 프로세스의 현재 권한 수준을 결정하기 위해 수행해야 하는 "모든" 작업은 해당 CS 레지스터의 값을 살펴보는 것입니다.

자신의 프로그램에 대해 이 작업을 쉽게 수행할 수 있습니다(64비트라고 가정).x86):

#include <stdint.h>
#include <stdio.h>

int main (int argc, char **argv) {
    uint64_t rcs = 0;
    asm ("mov %%cs, %0" : "=r" (rcs));
    printf("%d\n", (int) (rcs & 3));
    return 0;
}

다른 프로세스의 경우 유사한 방법을 사용하여 해당 프로세스에 연결 ptrace하고 해당 레지스터를 확인해야 합니다. 다음을 사용하여 수동으로 이 작업을 수행할 수 있습니다 gdb. 프로세스를 식별하고, 해당 프로세스에 연결을 사용하고(허용되는 경우)  명령을  gdb --pid ...실행하여 CS의 현재 값을 확인하고 값의 최하위 2비트를 추출합니다.gdbinfo registers cs

리눅스에서x86현재 권한 수준은 항상 3이라는 것을 곧 알게 될 것입니다. 사용자 프로세스는 시스템 호출(링 0에서 실행)에 있지 않는 한 항상 링 3에서 실행되지만 링 0 외부에서는 볼 수 없습니다. ftrace예를 들어 커널 코드 추적

관련 정보