사용자 공간이 무엇인지 정확히 알고 싶습니다. 내가 물어본 사람들은 모두 "커널이 아닌 모든 것"이라고 말했습니다. 그러나 그것은 나에게 가시적이지 않습니다. 커널이 사용자 공간이나 그와 유사한 곳에서 이 드라이버를 실행할 수 있다는 것을 읽었을 때 무슨 일이 일어날지 상상할 수 없습니다. 그래서 누군가가 이것에 대해 나를 정정한다면 나는 감사할 것입니다.
답변1
개념적 수준에서 커널은 하드웨어 보호의 "더 높은 권한" 수준에서 실행되는 모든 것입니다. 이는 x86 프로세서의 링 0, ARM의 시스템 모드, MIPS의 커널 모드, 68xxx의 하이퍼바이저 모드 등과 같습니다. 커널은 일반적으로 소프트웨어 인터럽트(시스템 호출) 또는 하드웨어 인터럽트(디스크 드라이브, 네트워크 인터럽트 카드, 하드웨어 타이머) 등 인터럽트 구동 방식입니다.
동일한 개념 수준에서 "사용자 공간"은 최소 권한 모드(x86 CPU의 링 3, ARM 또는 MIPS의 사용자 모드 등)에서 실행됩니다. 사용자 모드는 커널이 사소한 하드웨어 차이를 완화하고 모든 프로그램에 동일한 API를 제공하는 방식을 활용합니다. 예를 들어, 일부 무선 카드에는 추가 제어 레지스터가 있거나 다른 카드보다 수신 패킷에 대한 온보드 버퍼가 더 많거나 적을 수 있습니다. 드라이버 코드는 이러한 차이점을 고려하고(때때로 고급 기능이나 특이한 기능을 생략하여) 모든 프로그램에 동일한 소켓 API를 제공합니다.
일부 프로세서(예: x86, VAX, Alpha AXP)에는 3개 이상의 모드가 있지만 일반적인 Unix 아키텍처는 중간 모드를 사용하지 않습니다.
Unix, Linux 또는 *BSD에서 실행되는 프로그램과 프로세스는 사용자 공간입니다. 프로세스는 선점형이므로 실제로 커널이 실행되는 것을 볼 수 없으며 read()
시스템 호출 반환이나 신호 처리기 기능 실행 과 같은 부작용만 볼 수 있습니다 .
특정 질문에 답하기 위해 Unix, Linux, *BSD에서 "드라이버"는 일반적으로 네트워크 카드, 디스크 드라이브, 그래픽 카드 등 일부 하드웨어의 특정 기능을 처리하는 작은 소프트웨어입니다. 드라이버 소프트웨어는 하드웨어 인터럽트 또는 하드웨어의 매핑된 메모리 등에 액세스할 수 있도록 거의 항상 링 0/하이퍼바이저 모드/커널 공간에서 실행되어야 합니다. 드라이버는 특정 하드웨어 기능을 담당하고 해당 하드웨어를 하드웨어 작동 방식에 대한 커널 코드의 표준화된 또는 기존 관점에 맞추는 역할을 합니다. 따라서 사용자 모드에서 드라이버를 실행하려면 커널이 매핑된 메모리, 장치 레지스터, 인터럽트 또는 기타 특수 기능을 사용자 모드 프로그램에 노출해야 합니다. 사용자 프로그램에 제공되는 일반적인 Unix 스타일 API에 쉽게 맞지 않는 특별한 기능이 장치에 필요할 수 있기 때문에 이는 까다로울 수 있습니다. 또한 사용자 공간 프로그램은 일반적으로 인터럽트에 신속하게 응답하지 않기 때문에 스케줄링이 문제가 됩니다.
답변2
대부분의 최신 CPU에는핵심또는 감독자 모드이며 제한적입니다.사용자모델. 이는 CPU의 하드웨어 기능입니다. "Userland"는 사용자 모드에서 실행되는 코드의 또 다른 이름입니다.
이러한 모드 간의 큰 차이점 중 하나는 대부분의 최신 CPU의 MMU가 이러한 모드에서 작동하는 방식입니다.
MMU를 사용하면 커널이 RAM 블록(또는 페이지)을 재정렬하여 RAM의 물리적 순서와 다른 순서로 인코딩된 것처럼 보이도록 할 수 있으며 사용자 모드 코드가덫또는"잘못특정 페이지에 액세스하면 커널 모드로 돌아갑니다. 사용자 모드는 MMU의 작동을 변경할 수 없으며 오직 커널 모드에서만 이를 수행할 수 있습니다.
따라서 MMU를 사용하면 커널 모드 코드가 다음과 같은 모든 종류의 멋진 작업을 수행할 수 있습니다.
- 사용자 모드 코드에 메모리를 "배열"하거나 "매핑"하여 해당 코드가 연속적인 RAM이 있다고 생각하도록 합니다.
- 프로세스가 메모리를 사용하기 전에 요청해야 하는 동적 메모리 관리 체계를 구현합니다.
- 사용해서는 안 되는 메모리를 사용하고 있는 경우 사용자 프로세스를 중지합니다.
- 사용 가능한 메모리가 부족하면 가장 적게 사용된 페이지가 디스크로 스왑되고 프로세스가 해당 페이지에 액세스하려고 하면 다시 스왑됩니다.
커널/사용자 모드와 함께 MMU가 멀티태스킹 운영 체제의 초석이라는 것을 알 수 있으며, 이러한 도구를 사용하면 프로세스 개념과 같은 더 높은 수준의 작업을 처리할 수 있는 시스템이 생성됩니다. 커널은 각 프로세스에 대한 페이지 테이블을 유지 관리하고 사용자 모드로 전환하고 해당 타임 슬라이스에 대해 프로세스에 제어권을 주기 전에 MMU를 다시 프로그래밍합니다. 프로세스가 메모리를 획득하는 등의 작업으로 malloc
인해 커널이 MMU 페이지 테이블을 수정할 수 있습니다.
그러면 사용자 모드는 페이지 테이블에 대해 아무 것도 할 수 없으며(그리고 페이지 테이블이 존재한다는 것을 알 필요도 없습니다), 메모리가 필요하면부르다사용자 모드에서 커널 모드로 전환되는 커널입니다. CPU는 다음과 같은 간단한 메커니즘을 제공합니다.소프트웨어 인터럽트이것을하기 위해,Linux 커널에는 다른 더 빠른 방법이 있습니다.
이 보호 기능은 사용자 모드에 존재하기 때문에 커널은 프로세스가 충돌하거나 통제 불능 상태가 되는 경우 프로세스를 중지하고 자신을 덮어쓸 수 있습니다. 커널 모드에서는 이 보호 기능이 존재하지 않으므로 커널 작동이 중지되고 전체 시스템 작동이 중지됩니다. 이러한 복구할 수 없는 오류가 커널 모드에서 발생하는 경우 이를 커널 패닉이라고 합니다. 바라보다"커널 패닉"이란 무엇입니까?더 알아보기.
커널은 사용자 모드에서 드라이버를 실행할 수 있습니다
CPU의 커널 또는 감독자 모드는 사용자 모드가 I/O 장치에 직접 액세스하는 것을 방지합니다. 이를 위해서는 커널을 호출해야 한다는 개념입니다. Linux에서 장치와 직접 통신하는 코드(커널 모드에서 실행됨)는 다음과 같습니다.장치 드라이버(일종의커널 모듈lsmod
, insmod
, ) modprobe
등 의 명령을 사용하여 rmmod
조작할 수 있습니다.
장치 드라이버(가장 간단한 설정에서 커널 모드로 실행)에 버그가 있고 RAM의 임의 항목을 덮어쓰는 등 불쾌한 작업을 수행하는 경우(그리고 커널 모드에 있기 때문에 모든 RAM에 무제한으로 액세스하여 덮어쓸 수 있음) 어떻게 되나요? 커널 자체). 커널 자체나 다른 프로세스에 아무 것도 할 수 없도록 장치 드라이버를 사용자 모드에서 실행할 수 있다면 좋을 것입니다.
불행하게도 사용자 모드에서 커널 모드(라고 함)로 전환하는 경우컨텍스트 스위치)은 기본적으로 각 프로세스나 커널 자체가 CPU의 전체 상태를 전환해야 하기 때문에 속도가 느립니다. 따라서 우리가 동의하지 않는 두 가지 사항이 있습니다. 바로 보안과 속도입니다. 이것이 논쟁거리이자 설계 포인트입니다.
사용자 모드에서 가능한 한 많은 작업을 시도하는 커널을 호출합니다.마이크로커널, Linux는 그 반대입니다.단단히 짜여 하나로 되어 있는. Linux용 사용자 모드 드라이버가 존재하며(FUSE를 예로 들어), 심지어 하나도 있습니다.액자이를 허용합니다.
답변3
Bruce에 따르면 커널에 제공되는 모든 코드는 신뢰할 수 있어야 합니다. 커널이 어떻게든 악성 코드를 실행할 수 있다면 게임은 끝납니다. 여기서 사용자 실행 코드와 커널 실행 코드 간의 권한 분리가 시작됩니다. 사용자가 실행하는 코드가 반드시 100% 사악한 것은 아닙니다. 커널에 의해 직접 실행되지 않습니다.
사용자 공간 프로그램은 API 및 로드된 모듈과 같은 커널의 공개 부분하고만 상호 작용합니다. 예는 다음과 같습니다 iptables
. 실제로 작업을 수행하는 여러 커널 모듈(.ko) 또는 "드라이버"가 있습니다 iptables
.네트워크 필터링 프레임워크. 명령을 실행하면 /sbin/iptables
커널에 로드된 netfilter 모듈과 통신하는 userland 구성 요소를 사용하게 됩니다. 이를 통해 커널이 실수로 사용자 코드를 실행하지 않도록 분리할 수 있습니다.
답변4
Unix/Linux 운영 체제에서 차이점은 다음과 같습니다.사용자 공간그리고커널 공간. 이는 사용자 공간과 커널이 속하는 위치에 대한 동의어일 뿐입니다.
이렇게 이해하시면 됩니다. 사용자 공간에서 일어나는 모든 것과 상호 작용할 수 있습니다. 커널 공간에서는 그렇지 않습니다. 데몬, 라이브러리, 애플리케이션은 모두 사용자 공간에 속합니다. 운영 체제 커널 외부에서 실행되는 모든 코드는 사용자 공간(userland)에 속합니다.
커널 공간은 커널 자체가 실행되는 곳입니다. 루트도 접근할 수 없는 제한된 영역입니다. 그러나 루트 사용자는 커널이 제공하는 인터페이스(procfs, sysfs)를 통해 일부 커널 매개변수를 작동할 수 있습니다.
시스템 메모리는 커널 공간과 사용자 공간의 차이점을 설명하는 좋은 예입니다. 사용자 공간에서 실행되는 데몬 프로세스를 실행하려면 약간의 메모리가 필요합니다. 커널은 사용 가능한 모든 메모리를 관리합니다. 데몬은 커널로부터 일부 "가상 메모리"를 가져오지만, 그것이 물리적 메모리인지 스왑 공간인지 또는 다른 것인지는 알 수 없습니다. 커널은 프로세스가 어떤 종류의 메모리를 얻는지 결정합니다. 메모리 관리는 커널 공간에서 발생하기 때문입니다. 커널 공간에서 일어나는 다른 일로는 프로세스 스케줄링, 프로세스 간 통신, 메모리 보호 및 관리, 시스템 호출 등이 있습니다.
사용자 모드란 정확히 무엇입니까?
따라서 사용자 모드는 운영 체제 리소스(I/O, 네트워크, 메모리, CPU 시간)와 상호 작용할 때 데몬이 수행하는(또는 수행할 수 있는) 작업입니다. 이러한 리소스는 커널 공간의 프로세스에서 숨겨져 있습니다.
짧은 답변:
이것은 조종사의 비행기 조종석입니다.