![사용자 모드 프로세스가 커널 모드로 변경하려는 경우 항상 성공할 수 있습니까?](https://linux55.com/image/182256/%EC%82%AC%EC%9A%A9%EC%9E%90%20%EB%AA%A8%EB%93%9C%20%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EA%B0%80%20%EC%BB%A4%EB%84%90%20%EB%AA%A8%EB%93%9C%EB%A1%9C%20%EB%B3%80%EA%B2%BD%ED%95%98%EB%A0%A4%EB%8A%94%20%EA%B2%BD%EC%9A%B0%20%ED%95%AD%EC%83%81%20%EC%84%B1%EA%B3%B5%ED%95%A0%20%EC%88%98%20%EC%9E%88%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
컴퓨터 시스템: 프로그래머의 관점설명하다
운영 체제 커널이 엄격한 프로세스 추상화를 제공하려면 프로세서는 애플리케이션이 실행할 수 있는 명령과 애플리케이션이 액세스할 수 있는 주소 공간 부분을 제한하는 메커니즘을 제공해야 합니다.
프로세서는 일반적으로 일부 제어 레지스터의 모드 비트를 통해 이 기능을 제공하며, 이는 현재 프로세스에서 누리는 권한을 나타냅니다. 모드 비트가 설정되면 프로세스는 커널 모드(감독자 모드라고도 함)에서 실행됩니다. 커널 모드에서 실행되는 프로세스는 명령어 세트의 모든 명령어를 실행할 수 있고 시스템의 모든 메모리 위치에 액세스할 수 있습니다.
모드 비트가 설정되지 않으면 프로세스는 사용자 모드에서 실행됩니다. 사용자 모드의 프로세스는 프로세서 중지, 모드 비트 변경 또는 I/O 작업 시작과 같은 권한 있는 명령을 실행할 수 없습니다. 주소 공간의 커널 영역에 있는 코드나 데이터에 대한 직접 참조도 허용되지 않습니다. 그러한 시도는 치명적인 보호 실패로 이어질 수 있습니다. 사용자 프로그램은 시스템 호출 인터페이스를 통해 간접적으로 커널 코드와 데이터에 액세스해야 합니다.
애플리케이션 코드를 실행하는 프로세스는 처음에는 사용자 모드에 있습니다. 프로세스가 사용자 모드에서 커널 모드로 변경되는 유일한 방법은 인터럽트, 오류 또는 트랩핑 시스템 호출과 같은 예외를 통하는 것입니다. 예외가 발생하고 제어가 예외 처리기로 전달되면 프로세서는 모드를 사용자 모드에서 커널 모드로 변경합니다. 이 핸들러는 커널 모드에서 실행됩니다. 애플리케이션 코드로 돌아가면 프로세서는 커널 모드에서 사용자 모드로 모드를 변경합니다.
사용자 모드 프로세스가 커널 모드로 변경하려는 경우 항상 성공할 수 있습니까?
모드 변경의 성공 여부는 커널 모드로 변경한 후 프로세스가 무엇을 하려는지에 달려 있습니까?
몇 가지 예를 들자면,
프로세스의 uid와 파일의 액세스 제어 비트에 따라 프로세스에 파일 액세스 권한이 있을 수도 있고 없을 수도 있습니다. 프로세스가 파일에 액세스하기 위해 시스템 호출을 발행하면 항상 사용자 모드에서 커널 모드로 성공적으로 변경할 수 있습니까? 프로세스가 사용자 모드에서 커널 모드로 전환될 수 있는지 여부는 파일에 액세스할 수 있는지 여부에 따라 달라집니다.
sudo
프로세스가 사용자 모드에서 커널 모드로 변경될 수 있는지 여부와 관련이 있지 않습니까?
감사해요.
답변1
프로세스가 사용자 모드에서 커널 모드로 전환될 수 있는지 여부는 파일에 액세스할 수 있는지 여부에 따라 달라집니다.
아니요, 프로그램이 파일에 액세스할 수 있는지 확인하는 작업은 커널에서 이루어집니다. 프로그램은 인터럽트(x86) 또는 syscall
명령(amd64)을 사용해야 할 때 커널을 호출할 수 있습니다.
sudo는 프로세스가 사용자 모드에서 커널 모드로 변경될 수 있는지 여부와 관련이 없나요?
sudo
사용자 모드/커널 모드와는 아무 관련이 없습니다. 슈퍼유저 계정은 여전히 사용자 모드에만 존재합니다.
답변2
사용자 모드 프로세스가 커널 모드로 변경하려는 경우 항상 성공할 수 있습니까?
실제적인 목적으로는 그렇습니다. 프로세스가 반드시 커널 모드로 변경하기를 "원"하는 것은 아닙니다. 프로세서는 프로세스가 권한 있는 작업을 시도하거나 권한 있는 "게이트"를 호출할 때마다 커널 모드로 전환합니다.
권한 있는 작업을 구성하는 세부 사항은 아키텍처마다 다르지만 광범위하게 말하면 다음과 같습니다.
- 커널이 아닌 제어의 적용을 받아서는 안 되는 방식으로 전역 시스템 상태에 영향을 미치는 권한 있는 명령(x86의 예에는
CLI
마스크할 수 없는 인터럽트를 비활성화하는 명령과HLT
CPU를 정지시키는 명령이 포함됩니다) IN
권한 수준(x86에서는 명령어 /OUT
패밀리) 에 따른 특정 유형의 입력/출력 명령어- 현재 프로세스가 액세스할 수 없는 메모리에 액세스하려고 시도합니다.
- 현재 프로세스의 실행이 허용되지 않는 메모리 영역에서 코드를 실행하려는 시도가 있었습니다.
다른 지침이나 상황도 결국 커널을 트래핑하거나 실패하게 되지만 꼭 그런 것은 아닙니다.특권자체 - 예를 들어 0으로 나누어 보세요.
커널 모드로 전환하는 데 필요한 정보가 올바르게 설정되지 않은 경우 프로세서에 오류가 발생하고 오류가 올바르게 처리되지 않으면 일반적으로 재부팅됩니다. (바라보다이중 과실그리고삼중 오류.)
더 많은 정보를 원하시면 관련 프로세서 매뉴얼(예를 들어 인텔 매뉴얼).
x86-64에서 SYSCALL
시스템 호출을 호출하는 데 사용되는 명령어는 "일반" 명령어와 권한 있는 명령어 사이에 있으며 항상 호출 가능하며 코드는 항상 권한 있는 모드에서 호출됩니다.
모드 변경의 성공 여부는 커널 모드로 변경한 후 프로세스가 무엇을 하려는지에 달려 있습니까?
아니요.
프로세스가 파일에 액세스하기 위해 시스템 호출을 발행하면 항상 사용자 모드에서 커널 모드로 성공적으로 변경할 수 있습니까? 프로세스가 사용자 모드에서 커널 모드로 전환될 수 있는지 여부는 파일에 액세스할 수 있는지 여부에 따라 달라집니다.
아니요, 커널 모드로의 전환은 호출자가 요청한 작업을 수행하도록 허용할지 여부를 결정하는 것을 포함하여 커널 코드가 실행되기 전에 발생합니다.
sudo
프로세스가 사용자 모드에서 커널 모드로 변경될 수 있는지 여부와 관련이 있지 않습니까?
아니요. 여기서 권한은 프로세서의 실행 수준 및 메모리 보호에만 관련되며 사용자 권한(예: 사용자/루트 구분)과는 완전히 별개입니다.
답변3
커널 공간에는 잘 정의된 진입점이 있습니다.
테이블이 존재합니다(커널 모드에서만 쓰기 가능). 여기에는 많은 루틴의 시작 주소가 포함되어 있습니다. 여기에는 분할 오류, 0으로 나누기, 하드웨어 인터럽트, 시스템 호출 등에서 실행되는 루틴이 포함됩니다.
따라서 프로세스는 시스템 호출(1개 이상이 있을 수 있음) 명령을 실행하여 전환을 트리거할 수 있습니다. 그러나 사용자 모드 코드는 실행할 코드를 지정할 수 없습니다. 시스템 호출에서 커널 모드는 레지스터의 내용을 보고 프로세스가 원하는 것이 무엇인지 결정하며, 프로세스의 사용자, 그룹, 기능 등을 보고 그렇게 할 수 있는지 결정합니다.