** 한빛미디어의 '리눅스 커널의 이해'를 읽고 내용을 정리하는 글입니다. **


http://www.kernel.org 에서 리눅스 커널 소스를 내려받을 수 있다.


- 운영체제의 기초 개념

 모든 컴퓨터 시스템에는 '운영체제'라는 기본적인 프로그램 집합이 들어있고, 이 중에서 가장 중요한 프로그램을 '커널'이라고 한다. 커널은 시스템을 부팅할 때 램으로 로딩되며, 시스템이 동작하는데 필요한 여러 가지 중요한 절차를 수행한다.


운영체제는 다음의 주요 목적을 달성해야 한다.

- 하드웨어의 구성 요소와 상호 작용하면서 하드웨어 플랫폼에 들어 있는 저수준의 프로그래밍 가능한 모든 요소를 서비스한다.

- 유저 애플리케이션을 위한 실행 환경을 제공한다.


 MS-DOS의 경우 모든 유저 애플리케이션이 하드웨어 구성 요소를 직접 실행할 수 있지만, 이와 대조적으로 유닉스 계열 운영체제는 프로그램이 하드웨어의 자원을 이용하기 위해 반드시 운영체제에 요청을 해야 한다. 요청을 받은 커널은 이를 평가하고 사용자 프로그램을 대신해 하드웨어 구성 요소와 상호 작용한다. 이런 권한 제어를 위해 최근 운영체제는 특수한 하드웨어 기능을 활용한다. CPU는 유저 애플리케이션을 위해 User mode, 커널을 위해 Kernel mode라는 서로 다른 두 실행 모드를 제공한다.


- 사용자와 그룹

유닉스에서 모든 사용자는 '사용자 ID', 즉 UID라고 하는 고유한 번호로 구별된다. 다른 사용자와 선택적으로 어떤 것을 공유할 수 있도록 각 사용자는 하나 이상의 사용자 그룹(Group)의 일원이 될 수 있는데, 이 그룹은 GID라는 고유한 숫자로 구별한다.

 각 파일은 단 하나의 그룹과 연결되기 때문에 한 파일에 대해 '파일 소유자', '파일 소유 그룹', '그 외의 사용자' 셋에 대해 파일에 대한 접근 권한을 다르게 설정할 수 있다.

(흔히 리눅스에서 사용하는 chmod 등으로 권한을 변경하는 것이 이에 해당한다)


 모든 유닉스 계열 운영체제에는 루트(Root)나 슈퍼유저(SuperUser)라는 특별한 사용자가 있다. 운영체제는 루트 사용자에게 일반적인 보호 매커니즘을 적용하지 않으므로 루트 사용자는 거의 모든 일을 할 수 있다. 이는 시스템의 모든 파일에 접근하는 것과 실행 중인 모든 사용자 프로그램의 동작을 조정하는 것을 포함한다.


- 프로세스

 멀티유저 시스템은 여러 프로세스가 동시에 동작하면서 CPU를 비롯한 시스템 자원을 서로 차지하려고 경쟁하는 실행 환경을 제공해야 한다. 동시에 여러 프로세스를 동작할 수 있는 시스템을 '멀티프로그래밍' 또는 '멀티프로세싱'이라고 한다. 여러 개의 프로세스가 동시에 실행 중일 때 CPU를 사용할 프로세스를 선택하는 것은 스케줄러라는 운영체제 구성 요소의 역할이다.

 유닉스 계열 운영체제는 '프로세스/커널 모델'을 채택한다. 프로세스가 커널에 어떤 요청을 하기 위해 시스템 콜(System Call)을 호출할 때마다 하드웨어는 실행 모드를 User mode에서 Kernel mode로 전환한 뒤 엄격하게 제한된 목적으로만 커널 코드를 실행한다. 이렇게 운영체제가 프로세스의 실행 컨텍스트 내에서 프로세스의 요청을 처리한 뒤, 다시 실행 모드를 Kernel mode에서 User mode로 전환하고, User mode에서 시스템 콜 이후의 명령을 수행하기 시작한다.



- 커널 구조

대부분의 유닉스 커널은 모놀리식(Monolithic)이다. (모놀리식/마이크로 커널)

 마이크로 커널은 여러 계층 사이에 메시지를 전달하는 비용이 들기 때문에 일반적으로 모놀리식 커널보다 느리다. 하지만 마이크로 커널은 비교적 독립된 프로그램이기 때문에 시스템 프로그래머들이 모듈화 된 접근을 하도록 만들고, 다른 아키텍처로 이식하기 매우 쉽다. 또한 마이크로 커널은 불필요한 기능을 구현하는 시스템 프로세스를 스왑 아웃할 수 있어 램을 훨씬 잘 활용하는 경향이 있다.

 성능을 떨어뜨리지 않고 마이크로 커널의 여러 장점을 효율적으로 달성하기 위해 리눅스 커널은 '모듈(Module)'을 제공한다. 모듈은 실행 중 커널에 링크 및 언링크 가능한 오브젝트 파일이며, 이는 대개 파일 시스템, 장치 드라이버, 커널의 상위 계층에 있는 다른 기능을 구현하는 함수의 집합으로 이루어진다.


- 하드 링크와 소프트 링크

 디렉토리에 있는 파일명을 '파일 하드 링크', 간단히 '링크'라고 한다.

'$ ln f1 f2' 

명령으로 f1이 나타내는 파일에 대해 f2라는 새로운 하드 링크를 만들 수 있다.

하드 링크에는 두 가지 제약이 있다.

1. 디렉토리에 대하여 하드 링크를 만들 수 없다. 이는 트리 구조인 디렉토리 계층 구조가 순환 그래프로 바뀌기 때문에 파일명으로 파일을 찾지 못하게 될 수 있기 때문이다.

2. 동일한 파일 시스템에 있는 파일 사이에서만 하드 링크를 만들 수 있다.


 '소프트 링크' 또는 '심볼릭 링크'는 이런 제약을 극복하기 위해 도입되었다.

 심볼릭 링크는 다른 파일의 경로명을 포함하는 작은 파일로, 어떤 파일 시스템에 들어 있는 특정 파일이나 디렉토리도 가리킬 수 있으며 실제로 존재하지 않는 파일도 가리킬 수 있다. (윈도우의 '바로 가기'와 비슷하다고 생각하면 된다)

다음 유닉스 명령은 경로명 f2가 경로명 f1을 가리키도록 소프트 링크를 만든다.

'$ ln -s f1 f2'


'Knowledge' 카테고리의 다른 글

리눅스 커널 공부 정리 0x03  (0) 2017.06.27
리눅스 커널 공부 정리 0x02  (1) 2017.06.21
리눅스 커널 공부 정리 0x01  (0) 2017.06.20
Memory Segmentation  (0) 2016.12.27
NAT와 NAPT의 개념과 원리  (10) 2016.12.01
멀티 태스킹(Multi-Tasking)의 원리  (0) 2016.11.21
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

댓글을 달아 주세요