핀란드 헬싱키 대학에서 전산학을 전공하는 학생이었던 리누스 토발즈(Linus Benedict Torvalds
) 는 1988
년에 386
보호모드에서 작업 전환기와 페이징, 타이머 인터럽트 핸들러와 그 외 여러가지 디바이스 드라이버와 기초적인 파일 시스템 등을 만들어 1991
년 08
월 26
일 리눅스 0.0.1
을 발표했다.
여기에 자유 소프트워에 재단(Free Software Foundation
: FSF
) 이라는 단체의 GNU
(GNU is Not UNIX
) 프로젝트가 합세하면서 이 단체와 뜻을 같이하는 전 세계의 프로그래머들의 도움으로 현존하는 최고의 운영체제 중 하나인 리눅스가 탄생하게 된다.
리눅스는 유닉스 계열(UNIX-Like
) 운영체제이다. 유닉스는 1969
년 AT&T
벨 연구소의 켄 톰슨(Ken Thompson
)과 데니스 리치(Dennis Ritchie
) 가 만든 운영체제이다.
유닉스는 그 조상인 Multics
의 실패를 교훈삼아 매우 간결하게 설계되었다. 생명을 제공하는 태스크와 장소를 제공하는 파일이라는 두 가지 객체로 모든 것을 지원한다. 대부분의 소스코드가 C
라는 고급 언어로 작성되었으며, 또한 유닉스 운영체제의 소스가 공개되었다는 것이며, 많은 학교와 연구소 기업으로부터 환영을 받으며 발전 되었다. 여기에서 유닉스 계열이라는 의미는 운영체제가 SUS
(Single UNIX Specification
) 를 따른다는 의미이며, 업계에서는 IEEE
가 정의한 POSIX
(Portable Operating System Interface
) 표준을 따르는 운영체제를 유닉스 계열 운영체제라고 한다.
IEEE
와 POSIX
의 발음위에서 나온 두 용어: 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.
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
님이 작성한 만화를 보는 것도 좋을 것 같다.
리눅스 커널을 만드는 과정은 다음의 3 단계로 이뤄진다:
Kernel configuration
)Kernel compilation
)Kernel installation
)커널 구성이란 새로 만들어질 리눅스 커널에서 현재 시스템에 존재하는 하드웨어 특성, 네트워크 특성 등의 정보를 알려주는 과정이다.
이 단계는 커널 소스 파일을 이용해 실행 가능한 커널을 만드는 과정이다.
커널의 각종 소스코드를 컴파일하여 .o
파일과 .a
파일로 생성한다. 이들을 링킹하여 vmlinux
라는 파일을 생성하고, objcopy
명령어를 이용하여, .note
와 .comment
섹션을 삭제하고 재배치(relocation
) 정보와 심볼 정보를 삭제한 뒤 바이너리 포맷의 파일을 출력한다. 이를 gzip
압축 알고리즘을 이용해 압축하여 piggy.gz
를 생성한다. 여기서 다시 디버깅 정보 등을 삭제하여 piggy.o
를 생성한다. 다음으로 커널의 압축을 해제시켜주는 코드(head.S
, misc.c
) 를 커널 앞부분에 덧붙여서 링커를 통해 vmlinux
파일을 생성한다. 이 파일들이 바로 bzImage
와 zImage
가 된다.
objcopy
단계(vmlinux
> image
) 에서 왜 재배치(relocation
) 정보는 왜 삭제할까?
위의 vmlinux
가 삭제 전, vmlinux-S
가 삭제 후인데 보는 것과 같이 용량이 크게 줄어 있는 모습을 볼 수 있다.
커널 설치란 생성된 커널로 시스템이 부팅될 수 있도록 만드는 과정이다. 커널 인스톨은 생성된 커널 이미지를 루트 파일 시스템으로 복사, 모듈 설치, 그리고 부트 로드 수정 등의 과정으로 이뤄진다.
[책] 리눅스 커널 내부구조 (백승재, 최종무 저)
[이미지] 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