리눅스 커널 공간과 사용자 공간에 대한 자세한 설명

王林
풀어 주다: 2024-02-13 21:36:15
앞으로
1039명이 탐색했습니다.

Linux 드라이버는 일반적으로 커널 공간에서 실행되지만 사용자 공간에서도 실행될 수도 있습니다. 아래에서는 커널 공간과 사용자 공간의 개념과 이를 판단하는 방법을 자세히 분석해 보겠습니다.

Linux는 가상 주소와 선형 주소가 항상 일치하도록 분할 메커니즘을 단순화합니다. 따라서 Linux의 가상 주소 공간도 0~4G입니다. Linux 커널은 이 4G 바이트 공간을 두 부분으로 나눕니다. 가장 높은 1G 바이트(가상 주소 0xC0000000부터 0xFFFFFFFF까지)는 커널에서 사용되며 "커널 공간"이라고 합니다. 하위 3G 바이트(가상 주소 0x00000000부터 0xBFFFFFFFF까지)는 각 프로세스가 사용하며 "사용자 공간"이라 한다. 각 프로세스는 시스템 호출을 통해 커널에 들어갈 수 있기 때문에 리눅스 커널은 시스템 공유 내의 모든 프로세스로 구성된다. , 특정 프로세스 관점에서 각 프로세스는 4GB의 가상 공간

을 가질 수 있습니다.

Linux는 커널용 레벨 0과 사용자 프로그램용 레벨 3의 두 가지 보호 메커니즘을 사용합니다. 그림에서 볼 수 있듯이(여기서는 그림을 표시할 수 없음) 각 프로세스에는 자체 개인 사용자 공간(0~3G)이 있습니다. 이 공간은 시스템의 다른 프로세스에 보이지 않습니다. 가상 커널 공간의 상위 1GB는 모든 프로세스와 커널에서 공유됩니다.

리눅스 커널 공간과 사용자 공간에 대한 자세한 설명

커널 공간은 커널 코드와 데이터를 저장하고, 프로세스의 사용자 공간은 사용자 프로그램의 코드와 데이터를 저장합니다. 커널 공간이든 사용자 공간이든 모두 가상 공간에 있습니다. 커널 공간은 각 가상 공간의 상위 1GB를 차지하지만 물리 메모리에 대한 매핑은 항상 가장 낮은 주소(0x00000000)부터 시작됩니다. 커널 공간의 경우 주소 매핑은 매우 간단한 선형 매핑입니다. 0xC0000000은 물리적 주소와 Linux 코드에서 PAGE_OFFSET이라고 하는 선형 주소 사이의 변위입니다.

그럼 커널 공간과 사용자 공간 간 통신 방법은 무엇일까요? 통신은 일반적으로 시스템 호출을 통해 수행됩니다.

드라이버가 사용자 모드 드라이버인지 커널 모드 드라이버인지 어떻게 확인하나요? 판단 기준은 무엇인가요?

사용자 공간 모드 드라이버는 일반적으로 드라이버의 IO 공간을 사용자 공간에 매핑하는 등 시스템 호출을 통해 하드웨어에 대한 액세스를 완료합니다. 따라서 판단의 주요 기준은 시스템 호출입니다. 또한 사용자 모드의 연결 목록은 커널 모드의 연결 목록과 다릅니다. 사용자 모드는 printf를 사용하고 커널 모드는 printk를 사용합니다. 유저 모드에서는 각 응용 프로그램 공간이 가상적이고 상대적으로 독립적이지만, 커널 모드에서는 독립적이지 않으므로 프로그래밍에 매우 주의가 필요합니다. 물론 사용자 모드와 커널 모드 프로그램 간의 통신은 ioctl, sysfs, proc 등을 통해 이루어질 수 있습니다.

커널 모드와 사용자 모드

작업(프로세스)이 시스템 호출을 실행하고 실행을 위해 커널 코드에 갇혀 있는 경우 프로세스가 커널 실행 상태(또는 간단히 커널 상태라고 함)에 있다고 말합니다. 이때 프로세서는 가장 높은 권한 수준(레벨 0)을 가진 커널 코드에서 실행됩니다. 프로세스가 커널 모드에 있을 때 실행된 커널 코드는 현재 프로세스의 커널 스택을 사용합니다. 각 프로세스에는 자체 커널 스택이 있습니다. 프로세스가 사용자 자신의 코드를 실행하는 경우 이를 사용자 실행 상태(사용자 상태)에 있다고 합니다. 즉, 프로세서는 가장 낮은 권한 수준(레벨 3)을 가진 사용자 코드에서 실행됩니다. 사용자 프로그램이 실행 중일 때 인터럽트 프로그램에 의해 갑자기 중단되는 경우 사용자 프로그램은 상징적으로 프로세스의 커널 상태에 있다고 말할 수도 있습니다. 인터럽트 핸들러는 현재 프로세스의 커널 스택을 사용하기 때문입니다. 이는 커널 모드의 프로세스 상태와 다소 유사합니다.

컨텍스트 처리 및 컨텍스트 중단

프로세서는 항상 다음 상태 중 하나입니다.

1. 프로세스 컨텍스트에서 실행되는 커널 상태, 커널은 커널 공간에서 실행되는 프로세스를 나타냅니다.

2. 인터럽트 컨텍스트에서 실행되는 커널 상태는 커널 공간에서 실행되는 하드웨어를 나타냅니다.

3. 사용자 모드, 사용자 공간에서 실행됩니다.

사용자 공간 애플리케이션은 시스템 호출을 통해 커널 공간에 들어갑니다. 이때 사용자 공간 프로세스는 커널에 많은 변수와 매개변수 값을 전달해야 하며, 커널 모드가 실행 중일 때 사용자 프로세스의 일부 레지스터 값과 변수도 저장해야 합니다. 소위 "프로세스 컨텍스트"는 사용자 프로세스가 커널에 전달하는 매개 변수뿐만 아니라 당시 커널과 환경에 의해 저장되는 완전한 변수 및 레지스터 값 집합으로 볼 수 있습니다 .

하드웨어가 신호를 트리거하여 커널이 인터럽트 핸들러를 호출하고 커널 공간에 들어가도록 합니다. 이 과정에서 하드웨어의 일부 변수와 매개변수도 커널에 전달되어야 하며, 커널은 이러한 매개변수를 사용하여 인터럽트 처리를 수행합니다. 소위 "인터럽트 컨텍스트"는 실제로 커널이 저장해야 하는 하드웨어 및 기타 환경(주로 현재 인터럽트된 프로세스 환경)에 의해 전달되는 이러한 매개변수로 간주될 수 있습니다.

위 내용은 리눅스 커널 공간과 사용자 공간에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:lxlinux.net
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!