커널 스터디(iamroot 18기) 1주차 내용 정리 #2, 커널 컴파일, 이미지 생성 과정

문연수·2021년 5월 30일
0

iamroot (Linux Internal)

목록 보기
3/24

4. 리눅스의 탄생

핀란드 헬싱키 대학에서 전산학을 전공하는 학생이었던 리누스 토발즈(Linus Benedict Torvalds) 는 1988 년에 386 보호모드에서 작업 전환기와 페이징, 타이머 인터럽트 핸들러와 그 외 여러가지 디바이스 드라이버와 기초적인 파일 시스템 등을 만들어 19910826 일 리눅스 0.0.1 을 발표했다.
여기에 자유 소프트워에 재단(Free Software Foundation: FSF) 이라는 단체의 GNU (GNU is Not UNIX) 프로젝트가 합세하면서 이 단체와 뜻을 같이하는 전 세계의 프로그래머들의 도움으로 현존하는 최고의 운영체제 중 하나인 리눅스가 탄생하게 된다.

5. 유닉스와 리눅스

유닉스 운영체제

리눅스는 유닉스 계열(UNIX-Like) 운영체제이다. 유닉스는 1969AT&T 벨 연구소의 켄 톰슨(Ken Thompson)과 데니스 리치(Dennis Ritchie) 가 만든 운영체제이다.
유닉스는 그 조상인 Multics 의 실패를 교훈삼아 매우 간결하게 설계되었다. 생명을 제공하는 태스크와 장소를 제공하는 파일이라는 두 가지 객체로 모든 것을 지원한다. 대부분의 소스코드가 C 라는 고급 언어로 작성되었으며, 또한 유닉스 운영체제의 소스가 공개되었다는 것이며, 많은 학교와 연구소 기업으로부터 환영을 받으며 발전 되었다. 여기에서 유닉스 계열이라는 의미는 운영체제가 SUS (Single UNIX Specification) 를 따른다는 의미이며, 업계에서는 IEEE 가 정의한 POSIX (Portable Operating System Interface) 표준을 따르는 운영체제를 유닉스 계열 운영체제라고 한다.

+ 추가: IEEEPOSIX 의 발음

위에서 나온 두 용어: IEEE, POSIX 는 발음이 따로 정해져 있다.
IEEE아이-이이이가 아닌 아이-트리플-이 로 발음하는 것이 맞다.

IEEE, pronounced "Eye-triple-E," stands for the Institute of Electrical and Electronics Engineers. The association is chartered under this name and it is the full legal name.

출처: https://www.ieee.org/about/ieee-history.html#:~:text=IEEE%2C%20pronounced%20%22Eye%2Dtriple,is%20the%20full%20legal%20name.

POSIX포식스가 아닌 파직스로 발음하는 것이 맞다. 포식스46 로 오해할 여지가 있기에 파직스로 발음한다.
출처: http://www.opengroup.org/austin/papers/posix_faq.html

이후 다양한 유닉스 계열 운영체제가 발표 되었다. 유닉스 계열 운영체제는 크게 System III/V 계열과 BSD 계열로 구분할 수 있다. 이 두 계열의 운영체제는 1990 년대와 2000 년대 초를 거치면서 다양한 경쟁 및 법정 소송에 휘말렸다. (이 시기를 UNIX War 시기라 부른다)

리눅스 운영체제

토발즈는 Minix 를 사용하다가 이 지식을 배경으로 리눅스를 개발하였다. Minix 는 앤드류 타넨바움 (Andrew Tanenbaum) 교수가 개발한 유닉스 계열의 작은 운영체제이다. 비록 리눅스가 Minix 지식을 많이 참조하긴 했으나, 코드는 많이 달랐다. Minix마이크로 커널 구조 를 기반으로, 리눅스는 모노리딕 커널 구조 를 기반으로 설계 되었다.

+ 추가: 모놀리식 커널? 마이크로 커널?

운영 체제의 구성요소를 단일의 메모리 공간에서 실행하는 모놀리식 커널에 대해, OS를 구성하는 몇 개의 요소, 기능을 커널 공간으로부터 떼어내어, 외부 모듈화하는 등으로 추가하는 기법을 마이크로 커널이라고 부른다. 모놀리식 커널의 설계 사상 및 개념 그 자체는 예전부터 존재했지만, 모놀리식 커널이라고 하는 용어가 성립된 것은, 마이크로 커널이라는 개념이 등장하면서 그 반대 개념으로서 명명되었다.
리눅스 커널의 경우 모듈(디바이스 드라이버 등)을 런타임에 로드할 수 있어 마이크로 커널의 장점을 가지고 있고 hybrid kernel 이라고도 부른다.

+ 추가: 앤드류 타넨바움 교수와 리누스 토르발즈 논쟁

앤드류 타넨바움 교수와 리누스 토르발즈에 논쟁은 꽤나 재미있다. joone 님이 작성한 만화를 보는 것도 좋을 것 같다.

5. 리눅스 커널 컴파일

리눅스 커널을 만드는 과정은 다음의 3 단계로 이뤄진다:

  1. 커널 구성 (Kernel configuration)
  2. 커널 컴파일 (Kernel compilation)
  3. 커널 설치 (Kernel installation)

1. 커널 구성

커널 구성이란 새로 만들어질 리눅스 커널에서 현재 시스템에 존재하는 하드웨어 특성, 네트워크 특성 등의 정보를 알려주는 과정이다.

2. 커널 컴파일

이 단계는 커널 소스 파일을 이용해 실행 가능한 커널을 만드는 과정이다.

커널의 각종 소스코드를 컴파일하여 .o 파일과 .a 파일로 생성한다. 이들을 링킹하여 vmlinux 라는 파일을 생성하고, objcopy 명령어를 이용하여, .note.comment 섹션을 삭제하고 재배치(relocation) 정보와 심볼 정보를 삭제한 뒤 바이너리 포맷의 파일을 출력한다. 이를 gzip 압축 알고리즘을 이용해 압축하여 piggy.gz 를 생성한다. 여기서 다시 디버깅 정보 등을 삭제하여 piggy.o 를 생성한다. 다음으로 커널의 압축을 해제시켜주는 코드(head.S, misc.c) 를 커널 앞부분에 덧붙여서 링커를 통해 vmlinux 파일을 생성한다. 이 파일들이 바로 bzImagezImage 가 된다.

+ 추가

objcopy 단계(vmlinux > image) 에서 왜 재배치(relocation) 정보는 왜 삭제할까?

위의 vmlinux 가 삭제 전, vmlinux-S 가 삭제 후인데 보는 것과 같이 용량이 크게 줄어 있는 모습을 볼 수 있다.

3. 커널 설치

커널 설치란 생성된 커널로 시스템이 부팅될 수 있도록 만드는 과정이다. 커널 인스톨은 생성된 커널 이미지를 루트 파일 시스템으로 복사, 모듈 설치, 그리고 부트 로드 수정 등의 과정으로 이뤄진다.

출처

[책] 리눅스 커널 내부구조 (백승재, 최종무 저)
[이미지] https://opensource.com/article/18/10/kbuild-and-kconfig
[이미지] https://en.wikipedia.org/wiki/Unix-like
[사이트] https://ko.wikipedia.org/wiki/리눅스
[사이트] https://joone.net/2019/02/09/30-리눅스-이야기-리눅스-vs-미닉스-1부/
[이미지] https://selfish-developer.com/entry/모놀리식Monolithic-kernel과-마이크로Micro-커널
[사이트] https://www.ieee.org/about/ieee-history.html#:~:text=IEEE%2C%20pronounced%20%22Eye%2Dtriple,is%20the%20full%20legal%20name.
[사이트] http://www.opengroup.org/austin/papers/posix_faq.html
[사이트] http://www.iamroot.org/xe/index.php?mid=Note&document_srl=215988

profile
2000.11.30

0개의 댓글