커널은 중요한 자원을 관리하기 때문에, 사용자가 그 자원에 쉽게 접근하지 못하도록 모드를 2가지로 나눈다.
-
커널모드
- 운영체제 내부에서 실제로 하드웨어를 제어할 수 있다.
- 모든 자원(드라이버, 메모리, CPU 등)에 접근, 명령을 할 수 있다.
- 커널 모드에서 실행되는 모든 코드는 단일 가상 주소 공간을 공유한다. 따라서 커널 모드 드라이버는 다른 드라이버 및 운영 체제 자체와 격리되지 않는다.
-
유저모드
- 접근할 수 있는 영역이 제한적이어서 프로그램의 자원에 함부로 침범하지 못하는 모드이다.
- 여기서 코드를 작성하고, 프로세스를 실행하는 등의 행동을 할 수 있다.
- 사용자 모드에서 모든 프로세스는 별도의 가상 주소 공간을 할당받는다.
- CPU 내부에 Mode bit 을 두어 kernel-mode, user-mode 를 구분한다.
- 즉, CPU 가 Mode bit 를 보고 커널모드인지, 유저모드인지 파악한다.
- 0이면 커널 모드, 1이면 유저모드이다.
- 프로세스가 실행되는 동안에 프로세스는 유저모드와 커널모드를 수없이 오가면서 실행된다.
- 유저모드 -> 커널모드 요청: 프로세스가 유저모드에서 실행되다가 특별한 요청이 필요할때
system call
을 이용해서 커널에 요청을 한다. - 커널모드 -> 유저모드로 반환: system call의 요청을 받은 커널이 그 요청에 대한 일을 하고 결과값을 system call의 리턴 값으로 전해준다.
유저모드에서 커널모드로의 전환과 되돌림은 스레드 스케줄링에 영향을 미치지 않는다. 모드 전환은 컨텍스트 변경(context switch)이 아니다.
현재 system이 누구를 위해서 동작하는가를 context라고 한다.
context를 바꾸는 것을 context switching이라고 한다.
- process context : 현재 system이 process를 위해서 동작한다.
- system context : 현재 system이 특정 process를 위해서가 아닌 공동의 목적을 위해서 동작한다.
참고