CS/OS

OS 시스템 - kernel의 이해(dual mode)

reko_ 2022. 3. 26. 21:03

OS는 kernel, system utility, shell 이렇게 3가지 소프트웨어를 가지고 있습니다.

 

 

OS의 구성

 

kernel - why use kernel

 

 

커널은 OS의 핵심적인 기능을 수행하는 코드로, 사용자가 컴퓨터 하드웨어를 어떻게 사용할 것인가를 결정해줍니다.

 

 

사용자가 프로그램을 실행시킨다는 것은 다음과 같이 세분화할 수 있습니다. 

 

먼저 프로그램은 CPU에 계산을 명령하는 op-code(instruction)의 집합입니다. 그 op-code들은 disk에 존재하고, 그 데이터를 memory로 이동시켜야 CPU와의 요청과 응답을 빠르게 주고 받을 수 있습니다.

 

 

 

이 때 커널은 op-code(프로그램)이 위치할 memory 주소를 결정하고,

만약 프로그램이 시작된다면 그 op-code들이 CPU의 어떤 레지스터로 전송되어야 할지도 커널이 정합니다.

 

 

커널이 존재하는 한, 사용자는 위와 같은 과정을 생략하고 클릭 한번으로 프로그램을 실행시킬 수 있는 것입니다.

 

 

다른 프로그램들을 실행시키는 프로그램이기 때문에 특정 메모리 공간에 항상 상주해야하며,

커널을 제외한 나머지 메모리 공간들은 다른 utility(프로그램)들을 위한 공간입니다.

 

 

utility는 핵심적인 컴퓨터 시스템을 위한 system utility, 유저 프로그램을 위한 user utility로 나뉘고,

utility는 커널과 달리 disk에 상주하고 있다가 사용자가 요청할 때(프로그램 실행) disk에서 메모리로 올라옵니다.

 

 

Shell 

 

쉘은 다른 프로그램을 실행시키기 위한 프로그램입니다. (utility for utility) 사용자에게서 요구를 받고 그 utility를 메모리에 올리기 위해 존재합니다.

linux에서는 command control이라고 불리기도 합니다.

 

 

disk에 존재하는 프로그램은 shell에서 명령을 내림으로써 메모리에 위치하고 프로세스가 되게 됩니다.

여기서 프로세스란 프로그램이 메모리에 올라와서 운영 체제가 실행시킬 수 있는 프로그램을 말합니다.

 

 

만약 프로세스가 메모리에 있다면 커널은 그 프로세스를 제어하기 위한 정보들을(프로그램의 주소 등) 가지고 있어야 하며, 커널에서 그 데이터를 저장하는데 그 데이터들을 Process Control Bolck이라고 합니다.

 

 


 

Dual Mode

 

 

프로그램 관리, 흐름은 커널이 제어하지만 프로그램이 실행은 user mode, kernel mode라는 두가지 모드에서 실행될 수 있습니다.

 

- User mode

사용자는 이 모드에서 코드를 작성하고, 프로그램을 실행하는 행동을 할 수 있습니다.

유저(사용자)가 접근할 수 있는 영역에 제한을 주어, 프로그램의 자원에 함부로 접근하지 못하게 하는 모드 입니다.
우리가 작성하는 모든 코드는 유저모드에서 실행됩니다

 

- kernel mode

모든 자원(드라이버, 메모리, CPU 등)에 접근, 명령을 할 수 있습니다. 

프로세스가 실행되는 동안에 프로세스는 수없이 유저모드와 커널모드를 왔다갔다 하면서 실행 됩니다.

 


(유저모드 -> 커널모드 요청)
프로세스가 유저모드에서 실행되다가 특별한 요청이 필요할때 system call을 이용해서 커널에 요청을 합니다. 보통 아래 그림의 3가지 상황에서 유저모드 -> 커널 모드 요청이 발생합니다. 

(커널모드 -> 유저모드로 반환)
system call의 요청을 받은 커널이 그 요청에 대한 일을 하고 결과값을 system call의 리턴 값으로 전해줍니다. 보통 아래 그림의 3가지 상황에서 커널 모드로의 요청이 발생합니다.

 

 

 


커널 모드, 유저 모드 중 어떤 상태값을 가지는지에 대한 구분은 change mode bit로 확인할 수 있고 이 또한 유저가 커널 모드로 상태를 맘대로 변경하는 것을 막기 위해 커널에서 bit의 상태를 결정합니다.