Layering

OS의 복잡도를 낮추기 위한 방안으로 시스템을 가상의 레이어로 나누는 방식이다.

각 레이어는 정의가 명확한 (well-defined) 함수들로 이뤄져있다.

하나의 레이어는 인접한 레이어와만 통신한다.

하나의 레이어를 건너뛸 수 없다는 특징 때문에 Overhead가 발생하기도 한다.

 

 

Modularity

각 기능 단위로 모듈화를 시키고 OS를 구성하는 방식이다.

각 모듈은 내부적으로 layering 되어 있다.

 

초기 OS 구조 (MS-DOS)

모듈로 구분되어 있다는 개념보다는

하나의 큰 덩어리로 되어 있는 구조였다.

계층 구조를 건너뛰어서 User Application 또한 하드웨어 자원에 직접 접근할 수 있었다.

이는 유저모드와 커널모드의 구분이 없었다는 뜻이고 보안에 취약했다.

출처 : https://ddongwon.tistory.com/10

MS-DOS에서 프로그램이 돌아갈떄와 돌아가지 않을 때 메모리의 그림이다.

멀티 프로그래밍에 대한 개념이 없었기 때문에 프로세스 개념도 없고

프로그램이 돌지 않을 때는 명령어 해석기가 올라와 있고

프로그램이 실행되면 필요한 메모리를 모두 할당해주는 방식이다.

 

커널 내의 모듈들

 

User Mode Kernel Mode

위에 예시로 말한 MS-DOS의 구조처럼, 하드웨어 핵심 자원에 접근이 자유롭다면 보안적으로 취약할 수 밖에 없다.

때문에 Mode를 나누어 각각의 접근 권한을 달리한다.

Mode는 소프트웨어가 아닌 하드웨어 선에서 제어하게 된다.

Mode bit를 두어서 0일때는 운영체제가 cpu를 제어하여 여러 특권명령을 실행할 수 있는 Kernel Mode 이고 1이면 사용자 프로그램이 cpu를 사용하고 사용자 영역 안의 명령어만 실행 가능한 User Mode 이다

시스템 콜

User Mode 에서 Kernel Mode 로 진입하기 위한 통로이다. 커널에서 제공하는 하드웨어 접근을 위한 Protected된 인터페이스이다.

유닉스 계열 커널에서 제공하는 fork(), open() 등이 예시이다. 시스템콜이 호출되면 커널모드로 전환 되고 이를 통해 프로세스는 하드웨어에 직접 접근할 수 있는 것이다.

 

 

시스템콜이 호출되면 Mode의 전환이 일어나고 시스템콜은 정의되어있는 매크로로 변환된다.

매크로를 통해 system call table에 맵핑되어 있는 시스템콜 수행된다.

application이 시스템콜 인터페이스를 통해 하드웨어에 접근하는 도식