Skip to content

Linux:Kernel

Interactive map of Linux kernel

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

리눅스 커널은 1991년 리누스 토르발스가 자신의 개인용 컴퓨터를 위해 고안되어 개발 되었고 크로스 플랫폼의 의도는 없었으나 그 이후로 다른 운영 체제나 커널 대비 더 다양한 컴퓨터 아키텍처를 지원하도록 확장되었다. 리눅스는 급속도로 기타 자유 소프트웨어 프로젝트, 특히 GNU 운영 체제로 이 커널을 채택한 개발자들과 사용자들을 매혹시켰다. 리눅스 커널은 1,200개 이상의 회사의 12,000명에 가까운 프로그래머들의 기여를 받아왔으며, 여기에는 최대 소프트웨어 및 하드웨어 벤더들 일부가 포함된다.

리눅스 커널 API는 사용자 프로그램들이 커널과 통신하는 API로서 매우 안정적이고 유저스페이스 프로그램(GUI를 갖추고 다른 API에 의존하는 일부 프로그램)을 망가트리지 않는다는 것을 뜻한다. 커널 기능의 일부로서 장치 드라이버들은 하드웨어를 제어한다. 즉, 주류 장치 드라이버들은 매우 안정적임을 뜻한다. 그러나 다른 수많은 커널과 운영 체제와 달리 커널과 적재 가능 커널 모듈(LKM) 간의 인터페이스가 매우 안정적으로 설계되었다는 것을 뜻하는 것은 아니다.

전 세계 기여자들이 개발한 리눅스 커널은 자유-오픈 소스 소프트웨어의 저명한 예이며, 버전에 따라 최대 6년을 지원한다. 리눅스 커널 메일링 리스트(LKML)에서 일일 개발 토론이 진행된다. 리눅스 커널은 GNU 일반 공중 사용권 버전 2 (GPLv2)로 출시되며, 일부는 자유가 아닌 여러 라이선스로 출시된 일부 펌웨어 이미지들을 포함하고 있다.

Linux Features

  • libc와 표준 헤더 파일을 사용할 수 없다. 대신 일반적인 libc함수는 커널 안에 구현되어 있다.
  • GNU C를 사용한다.
  • 메모리 보호 기능이 없다.
  • 부동 소수점 연산을 쉽게 사용할 수 없다.
  • 작은 크기의 고정 스택을 사용한다.
  • 비동기식 인터럽트를 지원하며, 선점형이며, 대칭형 다중 프로세싱을 지원한다. (동기화 및 동시성 문제를 고려해야 한다)
  • 이식성(Endian, 64bit, WORD, Paging, etc)에 대하여 고려해야 한다.

master branch

Linux kernel master branch는 여기에서 확인 가능하다.
참고로 Clone 주소는 아래와 같다.

Category

Linux v0.01

리눅스 커널은 3600만 라인짜리 거대한 오픈소스지만, 첫번째 버전은 10239 라인 이었음 (주석/빈줄 제외하면 8670)

Linux v0.01은 그 간결함으로 인해 Unix 스타일 OS커널의 내부를 배우기 위한 좋은 출발점

  • v0.01은 66개의 시스템 콜만 가지고 있음
    • 파일/디렉토리 생성,삭제,쓰기
    • chmod, chown, pipe, fork, execve
    • Socket 컨셉이 도입되지 않아서 네트워크 지원불가
    • mount는 아직 구현되지 않음
  • Intel 386 아키텍처에 대해서 하드코딩 되어 있음(MINIX 저자가 이를 비판함)
    • strcpy 가 i386 명령어를 사용한 어셈블리로 코딩
  • PC/AT 기기들만 지원
    • CMOS, PIT(Programmable Interval Timer), ATA(PIO), VGA(텍스트 모드), Intel 8042 PS2 키보드(어셈블리)
    • 아직 drivers 폴더도 없고, 서브시스템에 하드코딩 되어있음
  • Linus가 원래 붙였던 이름인 "FREAX" Kernel 이 적힌 주석이 Makefile에 있음
  • 파일시스템은 MINIX 만 지원(ext 는 MINIX에서 영감을 받았음)
  • 스케줄러 코드에 "이 부분은 모든 환경에서 동작하는 꽤 좋은 코드라 변경할 이유가 없을 것!" 이라고 주석이 달린게 있음
    • 물론 현재는 다양한 개선 및 알고리듬이 도입되면서 수정되었으므로 이 예언은 틀렸음
  • 커널 패닉 구현부는 단 5줄 : "커널 패닉: 원인" 을 출력하고 for(;;)로 시스템을 중단
  • 커널 공간에서 fork(2)를 호출하는 부분이 있음
    • 그렇게 보이지만 실제로는 그 앞에 move_to_user_mode() 가 트릭
  • Linus는 8Mb 이상의 램을 가진 기기가 없었음 (자신은 없어서 테스트 해보지 못했으니, 가진 사람이 잘 해보라고..)
  • 현대의 툴체인으로는 컴파일 하기 어려움
    • GCC가 하위호환이 되긴 하지만 충분하지 않음
    • Linus는 -mstring-insns 라는 옵션이 있는 자신만의 GCC가 있었음(아마도 x86 스트링 명령어를 지원하는 옵션인듯)

Documentation

The Linux Kernel (David A Rusling) 한글번역판
넷메모 :: 리눅스 커널(The Linux Kernel 한글번역판)
The_Linux_Kernel-David_A_Rusling-ko.pdf

See also

Favorite site

Tunning

  • LPC_2019_kernel_fastboot_on_the_way 3: 리눅스 커널 부팅 시간을 3초에서 300ms로 줄였다고? '그냥 재미로' 한 건 아니고, 후방 카메라가 파워 넣고 나서 2초 안에 동작해야 해서... :(

References


  1. Wiki.kldp.org-EmbeddedKernel.zip 

  2. Kernel_2.6_makefile_analyze.pdf 

  3. LPC_2019_kernel_fastboot_on_the_way.pdf