본문 바로가기

OS

시스템 콜(System Call)과 Windows 커널 모드(User Mode, Kernel Mode)

728x90

Windosw OS를 실행하는 컴퓨터 프로세서에는 User Mode와 Kernel Mode 두가지 모드가 존재한다. 컴퓨터 프로세서는 여러 개의 모드를 가짐으로써 전체 시스템을 보호한다.

프로세서는 프로세스가 실행 중인 코드 유형에 따라 두 모드를 전환한다. 프로세스는 User Mode 영역과 Kernel Mode를 오가면서 실행된다. 이 때, OS 운영체제의 핵심 요소인 커널의 기능들은 오직 Kernel Mode에서만 수행할 수 있다.

 

왜 이렇게 번거롭게 만든 것일까?

커널 모드에서 어플리케이션이 잘못된 동작을 수행할 경우 전체 시스템에 영향을 줄 수 있기 때문에 모드에 따른 프로세서의 서비스 접근을 제한하여, 시스템 전체의 신뢰성을 보장한다. 만약 User Mode에서 System Call을 사용할 경우에는 OS는 이를 불법적인 접근으로 판단하여 트랩(Trap)을 발생시킨다.

 

대개 일반적인 어플리케이션은 User Mode에서 실행되며, 핵심 OS 구성요소(커널)은 커널 모드에서 실행된다. 대다수의 Device Driver가 커널 모드에서 실행되지만 일부 드라이버는 User Mode에서 실행될 수도 있다.

 

System Call

User Mode의 Application에서 Kernel Mode의 서비스를 사용하기 위해서는 정해진 규칙인 System Call을 사용하여야 한다. System Call은 Application이 커널에서 제공하는 서비스를 사용하기 위한 '인터페이사'이다. 미리 정의된 형식의 System Call을 통해서만 커널 내부 서비스를 사용할 수 있다.

이 때 C, C++과 같은 고급 프로그래밍 언어로 작성된 프로그램들은 직접 System Call을 사용할 수 없기 때문에 Application Programming Interface, 일명 API를 사용하여 서비스를 요청한다.

User Mode

User Mode Application을 시작하며 프로세서에 해당 Application을 수행하기 위한 프로세스가 생성된다. 이 프로세스는 Application에 private Virtual Address Space와 private Handle Table을 가진다.

Application이 사용하는 메모리 주소가 private하므로 다른 Application이 데이터를 임의로 변경할 수 없다. 각각의 Application은 개별적으로 실행되며, Application이 충돌할 경우, 충돌이 해당 Application 하나에 제한된다. 다른 Application과 OS 운영체제는 충돌의 영향을 받지 않는다.

User Mode Application이 Kernel Address space에 접근하는 것도 제한된다. User Mode에서 실행 중인 프로세서는 OS에 의해 예약된 Virtual Address에 엑세스할 수 없다. User Mode Application의 Kernel Virtual Address에 대한 접근을 제한함으로써 Application이 중요한 OS 데이터를 변경하거나 손상시킬 가능성을 막는다.

 

Kernel Mode

반면에 커널 모드에서는 모든 시스템 메모리와 CPU에 접근가능하다.

또한 커널 모드에서 실행되는 모든 코드는 하나의 Virtual Address Space를 공유한다. 즉, 커널 모드에서 실행되는 디바이스 드라이버나 시스템 스레드 등이 함께 공유되어서 사용되는 영역으로 포르세스의 구분이 없다.

따라서 Kernel Mode 드라이버가 실수로 잘못된 Virtual Address에 접근하여 데이터를 오염시킬 경우, OS나 다른 드라이버에 속한 프로세스가 손상될 수 있다. 커널 모드에서 드라이버가 충돌하면 전체 시스템 또는 OS 자체에 영향을 줄 수 있다.

User Mode와 Kernel Mode 구성요소 간의 통신과정

 

[출처]

https://blog.naver.com/techref/222239247290

728x90

'OS' 카테고리의 다른 글

커널 오브젝트(Kernel Object)  (0) 2023.11.05
커널(Kernel)  (0) 2023.11.05
SSH 세션을 계속 유지하기 위한 설정  (0) 2023.04.24
FTP (리눅스 및 연결 세팅)  (0) 2023.04.24
Super Putty 설치 및 사용  (0) 2023.04.24