커널 모드와 유저 모드의 차이
CPU는 왜 프로그램마다 권한을 다르게 줄까?
본 블로그 작성 글들은, 강의를 목표로 하고 제작되었습니다. 또한 작성된 글의 정보도 틀렸을 수 있으니, 주의해주세요.
CPU는 모든 코드를 같은 권한으로 실행하지 않는다. 운영체제의 핵심 코드는 높은 권한의 Kernel Mode(커널 모드)에서 실행하고, 일반 프로그램은 제한된 User Mode(유저 모드)에서 실행한다.
흔히 말하는 커널 레벨과 유저 레벨도 이 권한 영역을 가리키는 경우가 많다.
유저 모드
브라우저, 게임, 메신저 같은 응용 프로그램은 유저 모드에서 실행된다.
- 하드웨어를 직접 제어할 수 없다.
- 임의의 물리 메모리에 접근할 수 없다.
- 다른 프로세스의 메모리를 마음대로 읽을 수 없다.
- 문제가 생겨도 보통 해당 프로세스만 종료된다.
프로그램마다 분리된 가상 주소 공간을 제공받기 때문에, 서로 같은 주소값을 사용하더라도 실제로는 다른 메모리를 가리킬 수 있다.
커널 모드
커널 모드에서는 CPU의 특권 명령어를 실행하고 시스템 전체의 메모리와 장치를 관리할 수 있다.
- 페이지 테이블과 가상 메모리를 관리한다.
- 인터럽트를 처리한다.
- 프로세스와 스레드를 스케줄링한다.
- 장치 드라이버를 실행한다.
- 요청이 올바른지 검사한 뒤 하드웨어 작업을 수행한다.
권한이 큰 만큼 커널 모드의 버그는 영향도 크다. 잘못된 드라이버 하나가 운영체제 전체를 멈추게 할 수 있는 이유다.
두 영역은 시스템 콜로 연결된다
유저 프로그램이 파일을 읽거나 네트워크 데이터를 보내려면 커널에 요청해야 한다.
유저 모드 프로그램
↓ System Call
권한 검사 + 커널 모드 진입
↓
파일, 메모리, 장치 작업
↓
유저 모드로 복귀
유저 모드와 커널 모드 전환은 단순한 함수 호출과 같지 않다. CPU 권한을 바꾸고, 커널이 전달받은 주소와 길이가 안전한지 검사하고, 결과를 다시 돌려줘야 한다.
커널 모드가 유저 모드보다 무조건 빠른 영역이라는 뜻은 아니다. 둘의 차이는 속도 등급이 아니라 실행할 수 있는 명령과 접근할 수 있는 자원의 권한 차이다.
이 경계를 두는 이유는 불편하게 만들기 위해서가 아니다. 일반 프로그램의 실수나 공격이 컴퓨터 전체의 제어권으로 바로 이어지지 않게 막기 위해서다.