====== 리눅스 커널 ====== http://kernel.org/ Linux kernel. [[리눅스]] 계열 [[운영체제]]의 기반이 되는 [[운영체제커널]]. [[2011년 7월 현재]] 최신 버전은 **3.0**이다. [[Linus Torvalds]]가 [[1991년]]에 [[미닉스]] 코드를 참고하여 자기 자신의 운영체제 커널을 만들어 공개했던 것이, 마침 다른 건 다 만들었는데 커널이 없어서 막막해 하던(([[GNU Hurd]]가 있긴 했는데 이건 리눅스 커널의 메이저 버전이 3을 찍은 지금까지도 개발 단계이다.)) [[자유소프트웨어]] 진영이 가져다 쓰기 시작하면서 자유 및 [[오픈소스]] 소프트웨어의 중요한 부분이 되었다. 또한 리눅스 커널이 사용하는 [[소프트웨어라이선스]]는 [[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]]이 나온 뒤에도 이와 호환되는 라이선스를 쓰지 않는((많은 파일들의 라이선스 조항에 "GNU GPL 버전 2 또는 그 이후"가 아니라 그냥 "버전 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, ...을 쓰기로 결정해 버린다(([[http://permalink.gmane.org/gmane.linux.kernel/1147415|Torvalds의 발표 메일]] (2011년 5월) )). 이는 마침 코 앞으로 다가온 리눅스 공개 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만 줄이 추가되는 경이로운 확장을 기록하고 있다.(([[http://www.linuxfoundation.org/docs/lf_linux_kernel_development_2010.pdf|2010년 리눅스 커널 개발 백서]] ([[리눅스재단]]) )) {{tag>리눅스 운영체제커널}}