본문으로 바로가기

Kernel (2) - Linux kernel

Contents

  1. 리눅스 커널의 특징

  2. 리눅스 OS의 기초 개념

  3. 리눅스(유닉스)의 파일 시스템


리눅스 커널의 특징

리눅스 커널(Linux kernel)은 오픈 소스 모놀리딕 유닉스 계열 컴퓨터 운영 체제 커널이다. 리눅스 계열의 운영 체제는 이 커널에 기반을 두며 개인용 컴퓨터서버와 같은 전통적인 컴퓨터 시스템들[1]라우터, 무선 액세스 포인트, PBX, 셋톱 박스, FTA 리시버, 스마트 TV, PVR, NAS 어플라이언스 등의 다양한 임베디드 장치에 보통 리눅스 배포판의 형태로 배치된다. 태블릿 컴퓨터, 스마트폰, 스마트워치를 위한 안드로이드 운영 체제는 기능 구현을 위해 리눅스 커널이 제공하는 서비스들을 사용한다. 데스크톱 컴퓨터에 채용하는 경우가 낮은 편이지만 리눅스 기반 운영 체제들은 모바일 장치에서부터 메인프레임에 이르기까지 기타 거의 모든 컴퓨팅 부문을 지배하고 있다. 2017년 11월 기준으로, 세계 500대의 가장 강력한 슈퍼컴퓨터들은 모두 리눅스를 실행하고 있다.

리눅스 커널은 단일형 커널으로 이루어져 있는 커널이다.

리눅스의 아버지인 리누스 토르발스가 크로스 플랫폼의 의도 없이 개인용으로 개발하였지만, 다른 플랫폼이나 컴퓨터 아키텍처에 급속도로 확장되었다.

또한, 리눅스는 오픈 소스 프로젝트로 많은 회사와 프로그래머의 기여를 받아 만들어졌다.

모든 유닉스 프로그램은 IEEE에서 지정한 POSIX; Portable Operating Systems based on Unix 표준과 CAE(Common APplication Environment)같은 표준을 따른다.

리눅스 커널은 이런 유닉스의 특징을 모두 이어받아 유닉스 프로그램을 약간의 수정을 거쳐 컴파일 / 실행 할 수 있게 만들어졌다.


리눅스 OS의 기초 개념

1) 멀티 유저 시스템

두명의 사용자가 동시에 어플리케이션을 사용, 독립적으로 실행 할 수 있다.


2) 사용자와 그룹

멀티 유저 시스템에서 각 사용자는 사용자 아이디인 UID로 구분한다.

각 사용하는 하나 이상의 사용자 그룹에 속하며, 사용자 그룹은 GID라고 한다.

루트(root)사용자는 시스템에 있는 모든 파일에 접근이 가능하며, 사용자를 제어할 수 있다.

uid=1000(juntae) gid=1000(juntae) groups=1000(juntae)

위는 리눅스에서 id 명령을 사용 한 모습이다.


3) 시스템 콜 인터페이스

시스템 콜 인터페이스는 유저모드 프로세스인 응용 어플리케이션이 커널의 기능을 사용가능하게 해준다.

유닉스 시스템의 대표적인 특징 중에 하나는 유저모드와 커널모드가 나눠져있따는 것이다.

커널 모드는 특권 모드로서, 모든 주소 공간에 접근 할 수 있고, 모든 명령을 수행할 수 있다.

유저모드에서는 할당된 공간에만 접근할 수 있고, 커널모드의 주소에는 접근할 수 없다.

또한 시스템에 치명적인 명령은 사용 할 수 없다.

따라서 유저 모드의 어플리케이션이 커널 영역에 있는 함수 또는 자료구조를 사용하려면 반드시 System call을 사용해야 한다.

시스템 콜은 int 0x80같은 인터럽트를 사용해 구현된다.


4) 프로세스

프로세스는 현재 실행 상태에 있는 프로그램이라고 생각하면 간단하다.

멀티 유저 시스템에서는 동시에 여러 프로세스가 CPU의 자원을 점유하려고 경쟁한다.

이에 따라 실행할 프로세스를 선택하는 프로세스 스케쥴링이라는 과정이 필요하다.

유닉스 계열 OS에서는 Process/Kernel modem이 적용된다. 프로세스는 아래와 같은 순서로 실행된다.

  1. 프로세스가 System call을 호출하면

  2. 하드웨어는 사용자 모드에서 커널 모드로 전환하고

  3. 프로세스는 제한적으로 커널 코드를 실행한다.

  4. 그 후 하드웨어 상태를 다시 사용자 모드로 변경한다.


리눅스 파일 시스템

1) 절대경로와 상대경로

img

리눅스의 파일은 위와 같이 트리 형태의 공간으로 이루어진다.

경로 명에 따라서 절대경로와 상대경로가 있다.

만약 내 프로그램이 /home/juntae/linux에 있다고 생각해보자!

여기서 /home/juntae/linux는 절대경로이다.

상대 경로는 현재 위치한 곳을 기준으로 생각한다.

현재 위치한 곳을 기준으로 ./,/,../등의 명령을 사용해서 이동한다면, 상대 경로를 사용하여 경로를 이동한다고 생각하면 된다.


2) 하드링크와 소프트링크

디렉토리에 있는 파일의 이름을 파일 하드 링크(File hard link)또는 링크(link)라고 한다.

한 파일이 여러개의 링크를 가질 수 있다.

아래 명령어로 file이 나타내는 파일에 대해 new라는 새 경로명으로 하드링크를 생성할 수 있다.

$ ln file new

하드 링크에는 아래와 같은 제약이 있다.

  • 디렉토리는 하드 링크 생성 불가

  • 동일한 파일 시스템 내에서만 하드 링크 생성 가능

이런 제약을 극복하기 위하여 소프트 링크(Soft link)또는 심볼릭 링크(Symbolic link)라는 개념이 새로 도입되었다.

심볼릭 링크는 윈도우의 바로가기와 똑같은 개념으로, 다른 파일의 경로명을 포함하는 파일이다.

디렉토리에도 심볼릭 링크를 지정할 수 있고, 존재하지 않는 파일도 가르킬 수 있다.

$ ln -s file new

심볼릭 링크는 다른 파일에 링크를 걸기 때문에, 원본 파일을 이동시켰거나, 원본 파일이 손상되었다면 링크가 원본 파일을 가르키지 못한다.


3) inode

inode는 리눅스 파일 시스템에서 사용되는 자료 구조이다.

파일 혹은 디렉토리의 정보를 담고있으며, 모든 파일과 디렉토리는 하나의 inode를 가진다.

여기에는 파일의 허가권, 소유권, 파일 위치등의 정보가 들어있다.

아이노드에 들어있는 정보는 POSIX 표준에서 규정한다.

일반적으로 파일 시스템을 생성할 때 전체 공간의 1퍼센트 정도를 아이노드를 위해 할당한다고 한다.


4) File Descriptor

File descriptor

  • 시스템으로부터 할당 받은 파일을 대표하는 0이 아닌 정수값

  • 프로세스에서 열린 파일의 목록을 관리하는 테이블의 인덱스

흔히 리눅스 시스템에서 모든 것은 파일이라고 한다.

일반 파일부터, 디렉토리, 소켓, 파이프 등등 모든 객체들은 파일으로써 관리되어진다.

프로세스가 실행 중에 파일을 open하면 커널은 프로세스의 파일 디스크립터 숫자중에 사용하지 않는 값 중 가장 작은 값을 할당해준다.

0번은 STDIN, 1번은 STDOUT, 2번은 STDERR로 항상 열려있다. ( 표준 입력, 표준 출력, 표준 에러, )

예를 하나 들어보자. system call인 open 함수를 사용하여 파일을 열면 지금 사용하지 않는 디스크립터 숫자 중 가장 작은 3번 디스크립터를 열게 된다.


Reference