리눅스 커널

http://kernel.org/

Linux kernel. 리눅스 계열 운영체제의 기반이 되는 운영체제커널. 2011년 7월 현재 최신 버전은 3.0이다.

Linus Torvalds1991년미닉스 코드를 참고하여 자기 자신의 운영체제 커널을 만들어 공개했던 것이, 마침 다른 건 다 만들었는데 커널이 없어서 막막해 하던1) 자유소프트웨어 진영이 가져다 쓰기 시작하면서 자유 및 오픈 소스 소프트웨어의 중요한 부분이 되었다. 또한 리눅스 커널이 사용하는 소프트웨어라이선스GNU GPL v2로, 그 특성상 리눅스 커널에 새 드라이버를 넣으려면 십중 팔구 원하든 원치 않든 오픈소스화를 해야 하기 때문에 세상에서 가장 많은 장비를 지원하는 운영체제 커널이라는 명성을 떨치고 있다. 이와는 별개의 이유로 세상에서 가장 많은 장비에 포팅된 운영체제 커널이라는 기록도 가지고 있다(토스터 기계부터 슈퍼컴퓨터까지 안 들어 가는 곳이 없다).

역사

리눅스 커널은, 선술했듯, 1991년 4월에 Torvalds가 인텔80386 용으로 간단한 커널을 만들기 시작하여 같은 해 8월 25일에 미닉스 뉴스그룹(comp.os.minix)에 공개한 것이 시초이다. 초기 리눅스 코드는 미닉스에 큰 영향을 받았으며, 공개 전 개발 과정에서는 미닉스 코드가 일부 포함되어 있기도 했다고 한다(공개하기 전에 이 코드는 모두 자기 자신이 만든 코드로 대체되었다). 커널의 이름은 처음에는 정해져 있지 않았으나, Torvalds가 자기 마음대로 이름을 정하기 전에 커널을 담고 있던 FTP 서버에서 이름을 마음대로 "Linus' UNIX", 즉 "Linux"라고 붙여 버린 것이 그대로 굳어 버렸다(…).

처음에 리눅스 커널은 상업적 이용을 허락하지 않는 라이선스로 배포되었으나, 리눅스 커널이 점차 GNU의 핵심적인 부분으로 변화해 가면서 1992년 12월(0.99)에 GNU GPL v2로 라이선스가 변경되었다. 이 라이선스 변경은 Torvalds 말로는 "내가 한 일 중 가장 잘한 일"이라고 하며, 이후 현재까지 리눅스 커널은 같은 라이선스를 유지하고 있다. 리눅스 커널은 GNU GPL v3이 나온 뒤에도 이와 호환되는 라이선스를 쓰지 않는2) 흔치 않은 소프트웨어 중 하나로, 라이선스 변경을 하고 싶어도 너무 많은 개발자가 코드를 기여했기 때문에 모든 사람들한테 연락해서 확인을 받을 수 없다는 현실적인 이유(…)와, 대다수의 주요 커널 개발자들이 GPL v3을 딱히 좋아하지 않는다는 취향 문제(…) 때문에 그렇게 되었다.

리눅스 커널 1.0은 (0.99pre로 시작하는 수많은 "베타" 버전들을 거친 끝에) 1994년 3월에 발표되었으며, 이 즈음에 리눅스 커널, GNU 소프트웨어 및 기타 적절히 필요한 소프트웨어를 합쳐서 함께 배포하는 리눅스배포판이 일반화되기 시작한다. 커널 1.2(1995년 3월)는 처음으로 x86 이외의 아키텍처를 지원한 버전이었으며, 그 뒤 2.0(1996년 6월), 2.2(1999년 1월), 2.4.0(2001년 1월) 등을 거치면서 지속적인 개선이 이루어졌다.

리눅스 커널 2.6.x 시리즈(2003년 12월 ~ 2011년 7월)는 현재까지의 커널 역사 사상 가장 긴 시리즈였으며, 커널 전체에 영향을 끼치는 대규모의 변경보다는 각 컴포넌트의 추가, 변경 및 개선에 개발이 집중되었다. 다른 말로 하면 커널의 근본적인 아키텍처가 충분히 안정화되어 더 이상 바꾸지 않아도 지속적인 개선이 가능하다는 얘긴데, 이 때문에 2.6.0 이래로 새 메이저 버전은 기능보다는 시간에 맞춰서(대략 1년에 4회) 주기적으로 나오는 형태를 취하게 되었다. 이러다 보니 2.6.x 시리즈의 마지막 버전은 무려 2.6.39까지 가 버리고 마는데, Torvalds가 아무래도 숫자가 너무 커진다는 판단 아래 근본적인 아키텍처의 변경 없이 숫자만 바꿔서 2.6.40, 2.6.41, … 대신에 3.0, 3.1, …을 쓰기로 결정해 버린다3). 이는 마침 코 앞으로 다가온 리눅스 공개 20주년(2011년 8월 24일)을 기념하는 점도 컸다.

리눅스 커널 3.x 시리즈(2011년 7월 ~)는 현재 리눅스 커널의 최신 버전으로, 2.6.x 시리즈와 동일한 개발 모델에 버전 번호만 바꾼 식으로 개발이 진행되고 있다. Torvalds 말로는 "아마도 앞으로는 10년에 한 번씩 메이저 버전 번호가 바뀌지 않겠는가"라고(…).

구조

리눅스 커널은 대표적인 일체형커널(monolithic kernel)로, 적재 가능한 커널 모듈(LKM; loadable kernel module)이나 vmsplice와 같은 시스템콜을 써서 실행 도중에 커널을 변경할 수 있긴 하지만 다른 부분은 모두 하나의 커다란 바이너리(보통 vmlinuz 같은 이름이 붙어 있는)로 구성되어 있다. 이는 마이크로커널의 대표적인 문제로 지적되는 커널-유저모드 사이의 전환 오버헤드를 피하면서도, 마이크로 커널의 대표적인 장점인 확장성을 어느 정도 유지하는 절충안이라 할 수 있다. (윈도NT커널의 경우에도 기본적으로는 마이크로 커널이지만 파일시스템과 같은 일부 부분은 커널 모드로 동작한다.) 또한 FUSE와 같이 유저 모드에서 보통은 커널 모드에서 처리될 기능을 대신 처리할 수 있도록 하는 커널 모듈도 여럿 존재한다.

리눅스 커널은 커널 모드 및 유저 모드에서의 선점형멀티태스킹 및 커널 지원 멀티스레딩(2.6에서 새로 추가)을 지원하며, 여러 가지 스케줄링 알고리즘을 사용할 수 있다(현재 기본값은 CFS이다). 그 밖에도 가상메모리 관리, 커널 단 실행 파일 및 동적 라이브러리 로더, TCP IP 슈트 등등을 지원하나, 리눅스 커널 자체에는 윈도 시스템이 포함되어 있지 않으며 커널 쪽의 그래픽 드라이버와 유저 모드의 X윈도시스템의 결합으로 그래픽 시스템이 구현된다.

리눅스 커널은 GNUC확장이 적용된 C로 작성되어 있으며, 부트로더를 비롯한 극히 일부분에만 일부 어셈블리가 사용된다. 이 때문에 커널을 컴파일할 때 사용할 수 있는 컴파일러는 사실상 GCC 뿐이며, 인텔C컴파일러, TCC 등의 다른 컴파일러로 컴파일을 하는 게 불가능하지는 않지만 현업에서 이렇게 컴파일해서 사용하는 경우는 드물다. 리눅스 커널은 단일 소프트웨어로서는 매우 큰 프로그램으로, 2.6.35 커널의 총 SLOC는 1346만 줄을 기록했으며 최근 몇 년간 메이저 판올림 한 번에 평균 20~50만 줄이 추가되는 경이로운 확장을 기록하고 있다.4)

1) GNU Hurd가 있긴 했는데 이건 리눅스 커널의 메이저 버전이 3을 찍은 지금까지도 개발 단계이다.
2) 많은 파일들의 라이선스 조항에 "GNU GPL 버전 2 또는 그 이후"가 아니라 그냥 "버전 2"라고 쓰여 있다.

도쿠위키DokuWiki-custom(rev 9085d92e02)을 씁니다.
마지막 수정 2011-08-31 11:08 | 작성자 lifthrasiir