저는 가상 머신과 이들이 실행되는 링에 대해 작업하고 있습니다. 문서에서 이를 찾기가 어려운 경우가 있습니다. 그래서 가상 머신을 실행한 다음 프로세스를 살펴보고 어떤 링에서 실행되고 있는지 확인하고 싶습니다.
블로그 게시물에 따르면구스타보 두아르테CPL 레지스터는 프로세스의 링에 따라 프로세서에 의해 설정됩니다. 존재하다여기@Stephen Kitt는 가능성이 있다고 언급했습니다. gdb를 사용하는 솔루션은 언급한 대로 레지스터 값 Ring3을 반환합니다. 나는 유사 ModemManager
하거나 Ring0에서 실행되는 프로세스라고 생각한 것을 시도했지만 iwlwifi
모두 Ring3을 cs 레지스터 내용으로 반환합니다.
권장되는 방법은 을 사용하는 것입니다 ftrace
. 그러나 이 절차는 매우 복잡하고 튜토리얼을 찾을 수 없습니다. 프로세스의 CS를 얻는 마법 같은 방법을 아는 사람이 있습니까?
CS 레지스터에서 값을 검색하는 다른 방법이 있습니까?
답변1
x86에서는 CS 레지스터가 활성 링을 완전히 결정하므로 프로세스가 실행 중인 링을 결정하는 다른 방법이 실제로 필요하지 않습니다. 가상 머신을 실행 중이므로 보유하고 있는 하이퍼바이저에 따라 내부의 디버깅 기능을 사용하여 외부에서 가상 머신 내부의 가상 CS의 현재 값을 볼 수 있습니다.
실행 중인 시스템에서 CS 값을 검색할 때 가장 큰 문제는 CS 값이 다음과 같다는 것입니다.완전히값을 검색하는 데 사용되는 프로브의 특성에 따라 결정됩니다. 사용자 공간 프로브를 사용하는 경우 커널 수준 프로브를 사용하면 항상 사용자 공간에 해당하는 값이 표시됩니다.조사또는길), 항상 커널 공간에 해당하는 값을 볼 수 있습니다.
어쨌든 Linux on bare metal에서 상황은 매우 간단합니다. 사용자 코드는 링 3에서 실행되고 커널은 링 0에서 실행되며 그게 전부입니다. 이는 사용자 수준 권한과는 아무런 관련이 없습니다. 루트로 실행되는 프로세스는 여전히 주로 사용자 수준 코드이므로 대부분 링 3에서 실행됩니다. 사용자 프로세스가 링 0에서 실행되는 유일한 시간은 시스템 호출을 호출할 때이며 gdb
활성 링을 링 0으로 처리하여 해당 호출을 중단할 수 없습니다.
반가상화된 VM이 있는 Xen에서는 상황이 약간 다릅니다. 하이퍼바이저는 링 0에서 실행되고, 사용자 공간은 링 3에서 실행되며, 커널은 링 1(32비트 x86에서) 또는 링 3(x86에서 실행되는 64비트에서 실행됨) ).