1. 배경
사용자 어플리케이션이 운영체제의 데이터를 수정하거나 삭제하지 못하게 접근을 막기 위해 운영체제에서는 유저 모드와 커널 모드 두 가지 프로세서 접근 모드를 지원한다. 때문에 커널 모드는 모든 시스템과 메모리에 접근이 허가된 프로세스 실행 모드이다. 커널 모드에 더 높은 권한을 부여함으로써 유저 모드에서 오류가 발생했을 때 시스템 전체의 안정성을 보장한다.
2. 구조
위의 그림과 같이 사용자가 직접적으로 하드웨어 장치를 제어한다면, 큰 문제가 발생할 수 있기 때문에, 사용자 어플리케이션은 System Call을 통해 직접적인 하드웨어 요청이나 중요한 시스템 요청을 한다. 위와 같은 구조를 통해 사용자의 프로세스가 운영체제와 데이터에 함부로 접근할 수 없도록 계층을 나누어 놓았다고 할 수 있다.
요청 시, 사용자 어플리케이션은 유저 모드에서 커널 모드로 잠시 전환되었다가 커널 모드에서 작업을 실행한 뒤 응답을 사용자 어플리케이션에 반환하면서 다시 유저 모드로 돌아간다.
3. 특징
- 유저 모드
- 사용자 어플리케이션의 코드가 실행된다.
- 시스템 데이터에 제한된 접근만이 허용되며, 하드웨어에 직접적으로 접근할 수 없다.
- 시스템 서비스 호출 시 요청한 작업이 끝날 때까지 유저 모드에서 커널 모드로 전환된다.
- 스레드는 각각의 유저 모드 스택 메모리 영역을 갖는다.
- 커널 모드
- 모든 시스템 메모리에 접근할 수 있으며, 모든 CPU 명령을 실행할 수 있다.
- 운영체제 코드나 디바이스 드라이버 같은 커널 모드 코드를 실행한다.
- 디바이스 드라이버 (Device Driver) : 특정 하드웨어나 장치를 제어하기 위한 커널의 일부분으로써 동작하는 프로그램, 컴퓨터를 구성하는 다양한 입출력 장치마다 각각의 장치 드라이버가 커널에 통합되어 실행된다.
- 다시 말해, 컴퓨터의 버스나 통신 시스템을 이용하여 하드웨어와 커널 사이에서 명령어나 데이터를 전달해주는 역할
- 하드웨어에 의존적이기 때문에 하드웨어마다 장치 드라이버가 별도로 존재한다.
- 디바이스 드라이버 (Device Driver) : 특정 하드웨어나 장치를 제어하기 위한 커널의 일부분으로써 동작하는 프로그램, 컴퓨터를 구성하는 다양한 입출력 장치마다 각각의 장치 드라이버가 커널에 통합되어 실행된다.
4. 예시
프로세스가 실행 중에 라이브러리 함수인 fopen 함수를 호출했을 경우 (파일 입출력을 통해 특정 디렉토리에 접근)
- fopen 내부에서 open System Call > 커널 모드로 전환
- open에 대한 매개 변수(파일 or 디렉토리 경로, 파일 모드)가 커널로 전달되고 요청한 작업을 완료하고 커널에서 특정 값을 반환하며, 다시 유저 모드로 전환
- 도중 디렉토리(파일)명을 잘못 입력해 오류가 난 것이라면?
- 존재하지 않는 디렉토리에 접근했다고 한다면, System Call 이후에 커널 내부의 파일 시스템에서 해당 경로에 접근하는 단계에서 없는 디렉토리임을 확인하고 open System Call의 오류 처리 로직에 따라 결과 값이 반환되며 종료된 것을 알 수 있다.
- 도중 디렉토리(파일)명을 잘못 입력해 오류가 난 것이라면?