32비트 운영 체제의 경우 주소 지정 공간(가상 주소 공간 또는 선형 주소 공간이라고도 함) 크기는 4G(즉, 2의 32승)입니다. 이는 프로세스가 최대 4G의 주소 공간을 가질 수 있음을 의미합니다.
운영 체제의 핵심은 커널로, 일반 응용 프로그램과 분리되어 있으며 보호된 메모리 공간과 기본 하드웨어 장치에 액세스할 수 있는 권한을 가지고 있습니다. 커널의 보안을 보장하기 위해 최신 운영 체제는 일반적으로 사용자 프로세스가 커널을 직접 작동하는 것을 제한합니다.
일반적으로 이는 가상 주소 공간을 커널 공간과 사용자 공간의 두 부분으로 나누어 달성됩니다. Linux 운영 체제의 경우 가장 높은 1G 바이트(가상 주소 0xC0000000에서 0xFFFFFFFF까지)가 커널에서 사용되며 이를 커널 공간이라고 합니다. 하위 3G 바이트(가상 주소 0x00000000부터 0xBFFFFFFFF까지)는 개별 프로세스에서 사용되며 사용자 공간이라고 합니다.
즉, 각 프로세스의 4G 주소 공간 중 가장 높은 1G가 바로 커널 공간이다. 나머지 3G만이 프로세스 자체에 사용 가능한 공간입니다.
다음과 같이 이해될 수 있습니다: "모든 프로세스에서 최대 1G 커널 공간이 공유됩니다!" 다음 그림은 각 프로세스에 대한 4G 주소 공간 할당을 보여줍니다(사진은 인터넷에서 가져옴):
CPU의 모든 명령 중 일부는 매우 위험하며 메모리 지우기, 시계 설정 등 잘못 사용하면 시스템 충돌을 일으킬 수 있습니다. 모든 프로그램에서 이러한 명령어를 사용하도록 허용하면 시스템 충돌 가능성이 크게 높아집니다.
그래서 CPU는 명령어를 권한 있는 명령어와 권한 없는 명령어로 구분합니다. 이러한 위험한 명령어의 경우 운영 체제 및 관련 모듈에서만 사용할 수 있으며 일반 응용 프로그램에서는 재해를 일으키지 않는 명령어만 사용할 수 있습니다.
예를 들어 Intel의 CPU는 권한 수준을 Ring0~Ring3의 4가지 수준으로 나눕니다. 실제로 Linux 시스템은 두 가지 실행 수준인 Ring0과 Ring3만 사용합니다(Windows 시스템에서도 마찬가지).
프로세스가 Ring3 수준에서 실행 중이면 사용자 모드에서 실행 중이라고 하고, Ring0 수준에서 실행 중이면 커널 모드에서 실행 중이라고 합니다.
자, 이제 커널 모드와 사용자 모드가 무엇인지 설명해야 합니다. "프로세스가 커널 공간에서 실행될 때는 커널 모드이고, 프로세스가 사용자 공간에서 실행될 때는 사용자 모드입니다.
"커널 모드에서는 프로세스가 커널 주소 공간에서 실행되며 이때 CPU는 모든 명령을 실행할 수 있습니다. 실행 코드에는 제한이 없으며 유효한 주소에 자유롭게 액세스하거나 포트에 직접 액세스할 수 있습니다.
사용자 모드에서는 프로세스가 사용자 주소 공간에서 실행되며, 실행된 코드는 CPU의 여러 검사를 받습니다. 해당 주소를 매핑하는 페이지 테이블 항목에 지정된 사용자 모드에서 액세스할 수 있는 페이지의 가상 주소에만 액세스할 수 있습니다. , 작업 상태 세그먼트(TSS)의 I/O 권한 비트맵에 지정된 액세스 가능한 포트에만 직접 액세스할 수 있습니다.
이전 DOS 운영체제의 경우 커널 공간, 사용자 공간, 커널 상태, 사용자 상태에 대한 개념이 없었습니다. 모든 코드는 커널 모드에서 실행되므로 사용자가 작성한 애플리케이션 코드가 운영 체제를 쉽게 중단시킬 수 있다고 간주할 수 있습니다.
Linux의 경우 커널 공간과 사용자 공간을 구별하는 설계로 운영 체제 코드(운영 체제 코드는 애플리케이션 코드보다 훨씬 강력함)와 애플리케이션 코드를 분리합니다.
단일 응용 프로그램에서 오류가 발생하더라도 운영 체제의 안정성에 영향을 주지 않으므로 다른 프로그램도 정상적으로 실행될 수 있습니다(Linux는 멀티 태스킹 시스템입니다!).
"그러므로 커널 공간과 사용자 공간을 구별하는 것은 본질적으로 운영 체제의 안정성과 유용성을 향상시키기 위한 것입니다." 실제로 모든 시스템 자원 관리는 커널 공간에서 완료됩니다. 예를 들어 디스크 파일 읽기 및 쓰기, 메모리 할당 및 재활용, 네트워크 인터페이스에서 데이터 읽기 및 쓰기 등이 있습니다. 저희 애플리케이션은 이러한 작업을 직접 수행할 수 없습니다. 하지만 커널이 제공하는 인터페이스를 통해 이러한 작업을 수행할 수 있습니다. 예를 들어, 애플리케이션이 디스크의 파일을 읽으려는 경우 커널에 대한 "시스템 호출"을 시작하고 커널에 "디스크의 특정 파일을 읽고 싶습니다."라고 알릴 수 있습니다. 실제로 프로세스가 사용자 상태에서 커널 상태로(커널 공간으로) 들어갈 수 있도록 하기 위해 특수 명령이 사용됩니다. 커널 공간에서는 CPU가 디스크에서 데이터를 읽는 것을 포함하여 모든 명령을 실행할 수 있습니다. 구체적인 프로세스는 먼저 데이터를 커널 공간으로 읽은 다음 데이터를 사용자 공간에 복사하고 커널 모드에서 사용자 모드로 전환하는 것입니다. 이 시점에서 애플리케이션은 시스템 호출에서 반환되어 원하는 데이터를 얻었으며 행복하게 계속 실행할 수 있습니다. 간단히 말해서 응용 프로그램은 첨단 기술(디스크에서 파일 읽기)을 시스템 커널에 아웃소싱하고 시스템 커널은 이러한 작업을 전문적이고 효율적으로 수행합니다. 프로세스의 경우 사용자 공간에서 커널 공간으로 들어갔다가 최종적으로 사용자 공간으로 돌아오는 과정이 매우 복잡합니다. 예를 들어 우리가 자주 접하는 '스택'이라는 개념은 실제로 커널 모드와 유저 모드에 스택이 있다. 사용자 공간에서 실행될 때 프로세스는 사용자 공간의 스택을 사용하고, 커널 공간에서 실행될 때 프로세스는 커널 공간의 스택을 사용합니다. 따라서 Linux의 각 프로세스에는 두 개의 스택이 있습니다. 하나는 사용자 모드용이고 다른 하나는 커널 모드용입니다. 다음 그림은 사용자 모드와 커널 모드 간의 변환을 간략하게 설명합니다. 사용자 모드 프로세스는 시스템 자원을 사용하기 위해 커널 모드로 전환해야 하므로, 프로세스가 사용자 모드에서 커널 모드로 진입할 수 있는 방법은 몇 가지인지 살펴보겠습니다. 요약하면 세 가지 방법이 있습니다: 다음으로 커널 공간과 사용자 공간의 관점에서 전체 리눅스 시스템의 구조를 살펴보겠습니다. 대략 아래에서 위로 하드웨어 -> 커널 공간 -> 사용자 공간의 세 부분으로 나눌 수 있습니다. 아래 그림과 같이 (이 그림은 인터넷에서 가져온 것입니다): 하드웨어에서 커널 공간의 코드는 하드웨어 자원의 사용을 제어합니다. 사용자 공간의 코드는 커널이 노출하는 시스템 호출 인터페이스(System Call Interface)를 통해서만 시스템의 하드웨어 자원을 사용할 수 있습니다. 사실 리눅스뿐만 아니라 윈도우 운영체제의 디자인도 비슷하다. 실제로 특정 시점의 각 프로세서의 활동을 다음 세 가지 중 하나로 요약할 수 있습니다. 위의 세 가지 사항에는 거의 모든 상황이 포함됩니다. 예를 들어 CPU가 유휴 상태일 때 커널은 프로세스 컨텍스트에 있지만 커널 공간에서 실행되는 빈 프로세스를 실행합니다. 참고: Linux 시스템의 인터럽트 서비스 루틴은 프로세스 컨텍스트에서 실행되지 않으며 모든 프로세스와 독립적인 전용 인터럽트 컨텍스트에서 실행됩니다. 특별한 실행 환경이 있는 이유는 인터럽트 서비스 프로그램이 인터럽트 요청에 최대한 빨리 응답하고 처리한 후 빠르게 종료될 수 있도록 하기 위함입니다. 대부분의 최신 운영체제는 커널 공간과 사용자 공간 설계를 통해 운영체제 자체의 보안과 안정성을 보호합니다. 따라서 운영체제에 대한 정보를 읽다 보면 커널 공간, 사용자 공간, 커널 모드, 사용자 모드 등의 개념을 자주 접하게 됩니다. 이 글이 이러한 기본 개념을 이해하는 데 도움이 되기를 바랍니다. 사용자 공간에서 커널 공간으로 들어가는 방법
系统调用、软中断和硬件中断
. 이 세 가지 방법 각각에는 많은 운영 체제 지식이 필요하므로 여기서는 이에 대해 확장하지 않겠습니다. 전체 구조
요약
위 내용은 Linux 커널 공간과 사용자 공간이란 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!