시스템 호출을 사용하는 대신 언제 프로세스 가상 메모리의 커널 부분으로 점프합니까? (리눅스에서)

시스템 호출을 사용하는 대신 언제 프로세스 가상 메모리의 커널 부분으로 점프합니까? (리눅스에서)

이것은 이전 질문에 대한 후속 질문입니다.질문.

대답에 따르면 시스템 호출은 프로세스 가상 메모리의 커널 부분으로 점프하는 예입니다.

  1. 시스템 호출 외에 가상 메모리의 이 부분을 사용하는 일반 프로세스(비커널)의 다른 예는 무엇입니까? 이 커널 부분으로 직접 이동할 수 있는 함수 호출이 있습니까? 아니면..?

  2. 메모리의 이 부분으로 점프하면 프로세스가 메모리의 이 부분에 액세스할 수 있도록 프로세서가 자동으로 커널 모드 비트를 1로 설정합니까, 아니면 비트를 설정해야 합니까?

  3. 이 커널 부분 내부의 모든 실행에는 커널 프로세스로의 컨텍스트 전환이 필요하지 않습니까?

(댓글로 이런 후속 질문을 하고 싶지 않아서 다른 스레드를 열었습니다.)

여기에 이미지 설명을 입력하세요.

답변1

  1. 사용자 모드에서 실행되는 프로세스는 커널의 주소 공간에 전혀 접근할 수 없습니다. 프로세서가 커널 모드로 전환하고 커널 코드를 실행할 수 있는 방법은 여러 가지가 있지만 모두 커널에 의해 설정되고 시스템 호출 실행, 인터럽트에 응답, 오류 처리 등 잘 정의된 컨텍스트에서 발생합니다. 시스템 호출에는 커널 코드에 대한 직접 호출이 포함되지 않습니다. 호출 프로세스를 대신하여 해당 번호로 식별되는 특정 시스템 호출을 실행하기 위해 CPU가 커널로 제어를 전송해야 하는 아키텍처별 메커니즘이 포함됩니다. LWN에는 작동 방식을 설명하는 일련의 기사가 있습니다.시스템 호출 분석 첫 번째 부분,두 번째 부분, 그리고추가 콘텐츠.

    프로세스가 커널 주소 공간의 메모리에 액세스하려고 시도하면 커널 모드로 전환되지만 오류로 인한 것은 아니며 커널은 분할 위반으로 인해 프로세스를 종료합니다( SIGSEGV).

    32비트 x86에서는원격 호출을 사용하여 커널 모드로 전환하는 메커니즘을 사용하고,콜게이트; 하지만 Linux에서는 이를 사용하지 않습니다. (커널 주소를 호출하는 대신 특수 코드 세그먼트 설명자에 의존합니다.)

  2. 위 내용을 참조하세요. 커널 메모리로 점프할 수 없습니다. 위의 경우 커널 모드로 전환할 때 CPU는 전환이 허용되는지 확인하고 허용되는 경우 사용 중인 아키텍처에 적합한 메커니즘을 사용하여 커널 모드로 전환합니다. x86 Linux에서는 이는 링 3에서 링 0으로 전환하는 것을 의미합니다.

  3. 커널 모드로의 전환에는 프로세스 변경이 포함되지 않으므로 이 모든 것은 컨텍스트 전환(커널에서 계산) 없이 발생합니다.

답변2

1 & 2. 아니요, 사용자 프로그램은 단순히 점프 명령을 사용하여 커널 메모리에 들어갈 수 없습니다. 이는 허용되지 않습니다. CPU는 이러한 점프가 성공할 수 있도록 "커널 비트"를 자동으로 설정하지 않습니다. (일부 CPU에는 이러한 기능이 있지만 보안 Linux 포트는 이를 비활성화합니다.)

...사실, 허가 없이 페이지에 접근하고 있기 때문에 커널에 진입하고 있는 것입니다 :-). 이는 제어된 방식으로 제공되며 시스템 호출과 매우 유사하게 작동하지만 우리는 이를 "페이지 오류"라고 부릅니다. CPU는 커널 액세스에 대한 세부 정보를 제공합니다. 설명하는 액세스 유형의 경우 커널은 이를 프로그램의 버그로 처리합니다 :-). 프로그램에 치명적인 신호(SIGSEGV)를 보냅니다.

답변3

기술적으로 커널 메모리는 읽을 수 없거나, 읽기 전용이거나, 읽기-쓰기가 아닌 프로세스에 매핑될 수 있으며, 해당 메모리에 저장된 코드로 점프하여 프로세스에 의해 실행될 수도 있습니다. 시스템 호출을 처리하는 코드를 커널이 아닌 프로세스에서 안전하게 실행하여 특정 시스템 호출의 속도를 높이는 기술이다. 또한 커널에서 제공하는 클록 값이 포함된 메모리 주소와 같은 데이터도 포함될 수 있으므로 프로세스가 중단될 필요가 없으며 시스템이 커널에 들어갈 수 있습니다.

프로세스는 INT 0x80을 통한 인터럽트를 통해 커널의 시스템 호출에 들어갈 수도 있습니다. 이는 많은 어셈블리 프로그래머에게 친숙하지만 확실히 커널이 제공할 수 있는 유일한 메커니즘은 아닙니다. 커널과 사용자 주소 공간을 완전히 분리해야 한다는 엄격하고 빠른 규칙은 없습니다.

Linux가 어떤 접근 방식을 취하든 커널 코드와 데이터를 프로세스에 넣는 것은 기술적으로 확실히 가능합니다. 또한 Linux는 컨텍스트 전환 및 TLB와 관련된 성능상의 이유로 커널 메모리를 프로세스에 일상적으로 배치하지만 커널의 많은 영역이 민감하기 때문에 프로세스는 일반적으로 이를 읽을 수 없습니다.

관련 정보