
앞서 사용자모드/ 유저모드/ 시스템콜에 대해 간단히 알아본 적이 있다.
CS:APP 8장을 읽다보니, 개념적인 부분에서 혼동이 와서
좀 더 알아보려 한다.
컴퓨터는 아주 똑똑하면서도, 엄청 조심성이 많은 기계다.
그래서 "누가 뭘 할 수 있는지"를 아주 명확하게 나눠놓는다.
( cs:app 공부하는 내내 느꼈다. 컴퓨터는 책임의 주체를 늘 명시해둔다. 🖥️)
이전 글에서 사용했던 그림을 재사용하겠다. 😊
사용자 모드(User Mode)
→ 일반 사용자 프로그램이 실행되는 안전한 공간
커널 모드(Kernel Mode)
→ 운영체제가 실행되는 최고 권한의 영역 (모든 걸 할 수 있음)
CPU는 이 두 모드를 왔다 갔다 할 수 있게 만들어져 있다.
→ "일반적인 상황에서는 사용자 모드,
→ 시스템적으로 중요한 일이 생기면 커널 모드!
이렇게 구분하면 시스템이 훨씬 더 안정적이고 안전하게 돌아간다.
좀 더 자세히 살펴보자.
말 그대로, 일반 사용자 프로그램이 실행되는 공간이다.
ls, vim, gcc, 내가 짠 main() 함수 같은 것들 전부 다 사용자 모드에서 실행된다.
메모리/장치 접근이 제한돼 있다.(보안 + 안정성 때문!)
예시
int main() { printf("hello\n"); // 여기까진 사용자 모드! }
사용자모드에서 커널모드로 넘어가는 흐름을 자세히 살펴보자.
printf() 함수는 C 표준 라이브러리의 함수이다.
아직 커널 기능은 사용 안 했고, 그냥 일반적인 함수 실행 중이므로 아직까지 사용자모드다.
printf() 내부에서는 write() 시스템 콜을 호출한다.
이 시점에 커널에게 "화면에 출력 좀 해줘요!" 하고 요청서가 들어가는것이다.
➡️ 이렇게 커널 모드로 전환된다.
커널이 요청서를 받아서 작업을 처리한 후, 다시 사용자 모드로 복귀한다.
커널 모드(Kernel Mode)는
컴퓨터 시스템 안에서 가장 높은 권한을 가진 환경이다.
우리가 사용하는 일반 프로그램들은 이곳에 직접 들어올 수 없고,
오직 운영체제의 핵심 부분인 커널만 이 커널 모드에서 실행된다.
CSAPP 8장을 읽다 보니,
운영체제 / 커널 / 커널모드 / 유저모드 / 시스템 콜 / CPU ...
이 모든 개념이 머릿속에서 한데 엉켜버렸다.
그래서 또 그림으로 한번 표현해봤다. 😅
이때, 시스템 콜 호출이 발생한다.
운영체제가 요청을 받아 커널모드의 커널에게 요청을 넘긴다.
운영체제가 명령을 내리면,
CPU는 트랩(trap)이라는 통로를 통해 커널 모드로 이동한다.
일을 끝낸 CPU는 다시 유저모드로 ✨뿅하고 이동한다.
이제 다음 사용자 명령어를 계속 실행할 수 있다.
커널은 말 그대로 요청이 있을 때만 나와서 처리하고,
끝나면 유저모드로 컨트롤을 다시 넘겨주는 구조다.
| 구성 요소 | 역할 |
|---|---|
| 운영체제(OS) | 컴퓨터 전체를 총괄 지휘하는 관리자 |
| 커널(Kernel) | OS의 핵심. 요청이 있을 때 커널 모드에서 처리 |
| CPU | 실제로 모든 명령을 실행하는 뇌. 사용자/커널 모드 어디든 간다 |
| 시스템 콜 | 사용자 프로그램이 커널에게 요청을 보내는 공식 절차 |
| 트랩(Trap) | 사용자 → 커널 모드 전환 시 사용되는 통로 |