웹 서버는 네트워크에서 요청을 받고 파일에 로그를 남긴다. 그렇다고 서버 프로그램이 네트워크 카드의 레지스터를 직접 바꾸거나 저장 장치의 모든 블록을 읽을 수 있는 것은 아니다.

한 컴퓨터에는 웹 서버뿐 아니라 데이터베이스, 모니터링 도구와 관리 프로그램도 함께 실행된다. 프로그램 하나의 버그가 다른 프로세스의 메모리를 덮거나 시스템 전체를 멈추게 해서는 안 된다.

운영체제는 프로그램마다 사용할 수 있는 실행 권한을 제한하고, 시스템 전체에 영향을 주는 작업은 커널만 수행하게 한다. 사용자 모드와 커널 모드는 이 경계를 설명하는 이름이다.

본문 이미지 1 / 전체 경계 낮은 권한의 요청이 높은 권한으로 넘어가는 문
장면 설명애플리케이션은 권한을 직접 얻지 않고 정해진 시스템 콜 경계를 통해 커널에 작업을 요청한다.

사용자 모드

일반 애플리케이션 코드는 사용자 모드에서 실행된다. 자신의 주소 공간에서 계산하고 평범한 명령을 실행할 수 있지만, 메모리 보호 설정을 바꾸거나 장치를 직접 제어하는 특권 명령은 사용할 수 없다.

이 제약 덕분에 서로 신뢰할 수 없는 여러 프로그램을 한 컴퓨터에서 함께 실행할 수 있다. 애플리케이션이 잘못된 주소에 접근하면 해당 프로세스의 오류로 처리할 수 있고, 임의의 장치 제어는 커널의 검사 없이 수행할 수 없다.

사용자 모드는 “사용자가 직접 실행한 프로그램”이라는 뜻이 아니다. 서버가 자동으로 시작한 백그라운드 프로세스도 일반적으로 사용자 모드에서 실행된다.

커널 모드

커널은 주소 공간을 구성하고 장치와 통신하며 실행 순서를 바꿔야 한다. 이런 작업에는 일반 애플리케이션보다 높은 CPU 권한이 필요하다.

x86 CPU는 여러 권한 수준을 제공하며 일반적인 Linux 환경에서는 애플리케이션이 Ring 3, 커널이 Ring 0에서 실행된다. 다른 CPU 구조도 표현 방식은 다르지만 제한된 실행과 특권 실행을 구분한다.

중요한 것은 숫자 자체가 아니다. CPU가 현재 권한에서 실행할 수 있는 명령과 접근할 수 있는 메모리를 제한하고, 운영체제가 그 기능으로 경계를 구성한다는 점이다.

본문 이미지 2 / 권한 경계사용자 프로그램이 넘을 수 없는 경계
장면 설명모드 구분은 프로그램을 불편하게 만드는 장치가 아니라 한 프로그램의 오류가 시스템 전체로 번지는 것을 막는 경계다.

시스템 콜

사용자 모드의 서버도 파일과 소켓을 사용해야 한다. 경계가 있다고 커널 기능을 사용할 수 없는 것은 아니다. 대신 커널이 공개한 시스템 콜 인터페이스로 필요한 작업을 요청한다.

예를 들어 read()를 호출하면 라이브러리 래퍼가 시스템 콜 번호와 인자를 약속된 위치에 준비한다. CPU는 커널이 정한 진입점으로 제어를 옮기고 권한 상태를 전환한다. 커널은 파일 디스크립터와 버퍼, 요청 크기 및 권한을 확인한 뒤 읽기를 처리한다.

애플리케이션이 원하는 커널 주소로 뛰어드는 것은 아니다. 진입점과 요청 형식은 운영체제가 정하며, 실제 커널 구현은 전달된 값을 신뢰하지 않고 검사한다.

사용자 모드의 스레드
→ 라이브러리 래퍼
→ 시스템 콜 진입점
→ 커널 모드의 요청 검사와 처리
→ 결과 기록
→ 사용자 모드의 호출 다음 지점

권한 전환과 문맥 교환

시스템 콜을 처리하는 동안에도 실행 주체는 원래 호출한 스레드다. 같은 스레드가 사용자 모드에서 커널 모드로 들어갔다가 결과를 받고 돌아올 수 있다.

따라서 사용자 모드와 커널 모드의 전환이 곧 다른 프로세스나 스레드로 바뀌는 문맥 교환을 뜻하지 않는다. 물론 시스템 콜이 입출력을 기다려야 한다면 현재 스레드가 잠들고 스케줄러가 다른 스레드를 실행할 수 있다. 이때 권한 전환과 실행 대상 전환이 한 흐름에서 함께 나타날 뿐, 둘은 서로 다른 결정이다.

본문 이미지 3 / 요청 검증커널이 시스템 콜을 바로 실행하지 않는 이유
장면 설명커널은 요청의 주소와 범위와 권한을 확인한 뒤에만 보호된 자원을 다룬다.

커널의 요청 검증

시스템 콜 경계는 애플리케이션의 잘못된 입력을 커널이 처음 만나는 곳이기도 하다. 존재하지 않는 파일 디스크립터, 쓸 수 없는 메모리 주소나 권한이 없는 작업이 전달될 수 있다.

커널은 요청을 거부하고 오류를 돌려줄 수 있어야 한다. 사용자 모드의 실수를 커널 전체의 실패로 번지지 않게 만드는 것이 경계의 목적이다.

시스템 콜은 보호를 우회하는 비밀 통로가 아니다. 제한된 프로그램이 검사를 거쳐 허용된 기능만 사용하게 하는 공식 입구다.

핵심 개념

권한 분리와 시스템 콜

사용자 모드User Mode
일반 애플리케이션이 제한된 CPU 권한과 자신의 주소 공간 안에서 실행되는 상태다.
커널 모드Kernel Mode
운영체제 커널이 특권 명령과 보호된 메모리 및 장치에 접근할 수 있는 높은 권한의 실행 상태다.
시스템 콜System Call
사용자 공간의 프로그램이 Linux 커널에 기능을 요청하는 기본 인터페이스다.
CPU 권한CPU Privilege
CPU가 현재 실행 상태에 따라 허용할 명령과 메모리 접근 범위를 구분하는 하드웨어 보호 수준이다.