제가 이해한 바에 따르면, 인터럽트가 발생하면(예: 시스템 호출, 키보드 키 누르기 등) CPU는 커널 모드에서 커널 코드를 실행하지만, 독립적으로 실행되는 프로그램이 있는지 알고 싶습니다. 모드에서 트리거된 커널 인터럽트에서 실행하십시오.
내 말은: 스케줄러가 실행을 사용자 모드의 프로세스로 전환하면 실행되지만 스케줄러가 실행을 전환하는 "프로세스"가 있을 수 있지만 이 "프로세스"는 커널 모드에서 실행되는 커널 모드에 있습니다( 커널 모드에서 실행되는 프로그램을 "프로세스"라고 부를 수 있는지 확실하지 않습니까?
답변1
이 질문에 대답하려면 먼저 몇 가지 용어를 명확히 해야 합니다.
가상 메모리 주소는 다음과 같이 구분됩니다.사용자 공간그리고커널 공간. 일부 아키텍처에서는 둘 다 단일 선형 주소 공간의 일부이고 다른 아키텍처에서는 별도의 주소 공간입니다.
주어진 시간에 CPU가 실행 중입니다.사용자 모드또는커널 모드. 존재하다커널 모드읽고 쓸 수 있는 등 더 많은 권한을 갖게 됩니다.사용자 공간그리고커널 공간. 일부 CPU에는 더 많은 권한 수준이 있습니다. 예를 들어 AMD64 호환 CPU에는 운영 체제에서 사용할 수 있는 권한 수준이 4개 있지만 Linux에서는 2개만 사용합니다.
CPU가 사용자 모드에서 실행 중일 때 커널 공간에 대한 포인터를 조작할 수 있지만 이러한 포인터가 가리키는 항목에 액세스하려고 하면 예외가 발생합니다. 사용자 모드에서 실행할 때 CPU는 사용자 공간에서 바이트를 읽고 쓰고 실행할 수만 있으며 다른 제한이 적용될 수 있습니다(예를 들어 동일한 범위에서 쓰기와 실행을 허용하지 않도록 메모리 맵을 구성할 수 있음).
사용자 모드에서는 예외 또는 인터럽트를 통해서만 커널 모드로 들어갈 수 있으며, 이로 인해 이전에 커널이 구성한 커널 공간의 주소에서 실행이 시작됩니다. 따라서 사용자 공간의 코드를 커널 모드에서 실행하는 직접적인 방법은 없습니다.
그러나 커널 코드가 사용자 공간의 주소로 점프하는 것이 가능하지만 이는 좋은 생각이 아닙니다. 커널 모듈을 로드할 수 있는 권한으로 실행하는 경우(일반적으로 루트로 실행함을 의미함) 사용자 공간 메모리에 모듈을 구성한 다음 이를 커널에 로드하고 사용자 공간의 코드로 다시 점프하도록 할 수 있습니다. 하지만 무엇을 하고 싶든 이를 달성하는 데 이보다 더 좋은 방법이 있습니다.
Linux에는 커널 스레드라는 개념이 있습니다. 커널 스레드는 사용자 공간이 없다는 점에서 사용자 스레드와 다릅니다. 이러한 스레드는 항상 커널 모드에 있습니다. 성능상의 이유로 컨텍스트 전환은 커널 스레드로 전환할 때 현재 사용자 공간을 보존할 수 있으므로 커널 스레드가 사용자 공간에 액세스하려고 하면(오류가 됨) 가장 최근에 실행 중인 사용자 스레드의 사용자 공간에 액세스하게 됩니다.
Linux에서 프로세스는 동일한 사용자 공간을 사용하는 등 특정 리소스를 공유하는 하나 이상의 스레드 그룹입니다. Linux는 매우 유연하며 스레드가 공유할 리소스와 공유하지 않을 리소스를 선택할 수 있습니다.