Linux 커널

Linux 커널은 컴퓨터의 하드웨어와 시스템 자원을 관리하고 사용자 공간의 프로그램에 프로세스, 메모리, 파일, 장치와 네트워크를 사용하기 위한 기반 서비스를 제공하는 자유·오픈 소스 운영체제 커널이다. 1991년 리누스 토르발스가 처음 개발했으며, 이후 세계 각지의 개인 개발자와 기업...

분류운영체제 커널, 자유 소프트웨어, 오픈 소스 소프트웨어
계열유닉스 계열
최초 개발자리누스 토르발스
개발 주체Linux 커널 개발 공동체
최초 공개1991년 9월 17일
커널 구조모놀리식 커널, 적재 가능 커널 모듈
주요 언어C (프로그래밍 언어), 어셈블리어, Rust
지원 아키텍처x86, ARM, AArch64, RISC-V, PowerPC, MIPS, s390 등
라이선스GPL-2.0-only, Linux-syscall-note
개발 모델공개 소스, 분산형 유지관리, 시기 기반 릴리스
소스 코드kernel.org

Linux 커널은 컴퓨터의 하드웨어와 시스템 자원을 관리하고 사용자 공간의 프로그램에 프로세스, 메모리, 파일, 장치와 네트워크를 사용하기 위한 기반 서비스를 제공하는 자유·오픈 소스 운영체제 커널이다. 1991년 리누스 토르발스가 처음 개발했으며, 이후 세계 각지의 개인 개발자와 기업, 연구 기관이 참여하는 대규모 공동 개발 프로젝트로 발전하였다.[1]

Linux 커널은 일반적으로 하나의 커널 주소 공간 안에서 프로세스 관리, 가상 메모리, 파일 시스템, 네트워크 스택과 장치 드라이버를 실행하는 모놀리식 커널로 분류된다. 다만 필요한 기능과 장치 드라이버를 실행 중에 추가하거나 제거할 수 있는 적재 가능 커널 모듈을 지원하므로, 실제 구성과 배포에서는 높은 확장성을 가진다.

좁은 의미의 Linux는 이 커널 자체를 가리키지만, 일상적으로는 Linux 커널에 GNU 도구, 시스템 라이브러리, 초기화 시스템, 데스크톱 환경과 응용 프로그램을 결합한 Linux 배포판 또는 운영체제 전체를 가리키기도 한다. Android, ChromeOS, 서버용 배포판, 네트워크 장비와 임베디드 시스템도 서로 다른 사용자 공간을 사용하면서 Linux 커널을 기반으로 동작한다. 따라서 Linux 커널과 이를 포함하는 완성된 운영체제는 구분해서 다룰 필요가 있다.

Linux 커널은 프로세스와 스레드의 실행을 스케줄링하고, 각 프로세스에 가상 주소 공간을 제공하며, 저장 장치와 파일 시스템을 통합된 인터페이스로 노출한다. 또한 시스템 호출을 통해 사용자 공간과 커널 공간의 경계를 형성하고, 다양한 하드웨어를 공통 장치 모델과 드라이버 계층으로 추상화한다. 네트워크 프로토콜, 보안 정책, 가상화, 전력 관리와 추적 기능도 커널 내부의 주요 하위 시스템으로 구현된다.[2]

소스 코드는 대부분 GNU C11 방언의 C로 작성되며, CPU 초기화와 문맥 전환처럼 아키텍처에 밀접한 일부 영역에서는 어셈블리어가 사용된다. 새로운 커널 구성 요소를 작성하기 위한 Rust 지원도 CONFIG_RUST 구성 옵션을 통해 제공된다.[3]

Linux 커널의 소스 트리는 여러 하위 시스템과 아키텍처별 코드로 나뉘며, 각 영역의 유지관리자가 변경 사항을 검토하고 자신의 개발 트리에서 관리한다. 검토된 변경은 여러 단계의 하위 시스템 트리를 거쳐 리누스 토르발스가 관리하는 메인라인에 병합된다. 정식 메인라인 릴리스 이후에는 안정화 버전과 장기 지원 계열을 통해 오류 수정과 보안 패치가 제공된다.[4]

커널 전체에는 GNU General Public License 버전 2만 적용되며, 사용자 공간 프로그램이 정상적인 시스템 호출 인터페이스를 사용하는 것만으로 커널의 파생 저작물이 되지 않음을 명시하는 Linux 시스템 호출 예외가 함께 제공된다. 일부 개별 파일은 커널의 라이선스 정책이 허용하는 범위 안에서 다른 GPL 호환 라이선스나 이중 라이선스를 사용할 수 있다.[5]

역사

개발 배경

Linux 0.01과 최초 공개

GNU 프로젝트와의 결합

GPL로의 라이선스 변경

네트워크 기능과 아키텍처 지원 확대

Linux 1.x와 2.x

기업 참여와 서버 시장의 성장

Git 도입과 개발 체계의 변화

Linux 3.x 이후의 발전

모바일·클라우드·임베디드 영역으로의 확산

Rust 지원과 최근의 변화

설계와 커널 구조

모놀리식 커널 구조

커널 공간과 사용자 공간

시스템 호출 인터페이스

적재 가능 커널 모듈

커널 구성과 빌드 시 기능 선택

이식성과 아키텍처별 코드

선점과 동시 실행

부팅과 초기화

부트로더와 커널 이미지

초기 부팅 과정

하드웨어와 펌웨어 탐색

초기 RAM 파일 시스템

커널 스레드와 첫 사용자 공간 프로세스

루트 파일 시스템 마운트

초기화 시스템으로의 제어 이전

프로세스와 스케줄링

태스크 모델

프로세스와 스레드

프로세스 생성과 종료

문맥 전환

CPU 스케줄러

실시간 스케줄링

CPU 친화성과 제어 그룹

신호와 프로세스 제어

메모리 관리

물리 메모리 관리

가상 메모리

페이지 테이블

페이지 캐시

메모리 할당자

메모리 매핑

스와핑과 회수

메모리 제어 그룹

메모리 보호와 오류 탐지

파일 시스템과 저장 장치

가상 파일 시스템

파일과 inode

디렉터리와 경로 탐색

페이지 캐시와 입출력

블록 장치 계층

입출력 스케줄링

지원 파일 시스템

의사 파일 시스템

네임스페이스와 마운트

장치 모델과 드라이버

Linux 장치 모델

버스와 장치 탐색

문자 장치와 블록 장치

장치 드라이버

커널 모듈

sysfs와 udev

펌웨어와 Device Tree

플러그 앤 플레이와 전원 관리

네트워크

소켓 인터페이스

네트워크 장치 계층

인터넷 프로토콜 스택

라우팅과 패킷 전달

Netfilter와 방화벽

네트워크 네임스페이스

무선 네트워크

eBPF와 프로그래머블 네트워킹

동시성과 동기화

인터럽트와 예외

하드웨어 인터럽트 처리

지연 처리

원자적 연산

스핀락과 뮤텍스

세마포어와 완료 변수

Read-Copy-Update

메모리 장벽

잠금 없는 자료구조

프로세스 간 통신

파이프와 이름 있는 파이프

신호

공유 메모리

메시지 큐

세마포어

UNIX 도메인 소켓

futex

eventfd와 signalfd

보안

사용자와 권한 모델

접근 제어

Linux Security Modules

SELinux와 AppArmor

capabilities

seccomp

커널 자체 보호

보안 취약점과 패치

암호화 하위 시스템

격리와 자원 제어

네임스페이스

제어 그룹

프로세스와 파일 시스템 격리

네트워크 격리

컨테이너 기반 기술과의 관계

자원 제한과 계정

가상화

KVM

Xen 지원

반가상화 인터페이스

가상 장치와 Virtio

User-Mode Linux

호스트와 게스트에서의 활용

하드웨어 아키텍처 지원

x86과 x86-64

ARM과 AArch64

RISC-V

PowerPC

MIPS

s390

그 밖의 아키텍처

아키텍처 지원의 추가와 제거

구성과 빌드

Kconfig

Kbuild

커널 구성 방식

GCC와 Clang

커널 이미지 생성

모듈 빌드

교차 컴파일

설치와 초기 RAM 파일 시스템 생성

프로그래밍 언어와 내부 API

C

어셈블리어

Rust

GNU 확장 기능

커널 내부 API

안정적인 사용자 공간 ABI

불안정한 커널 내부 ABI

코딩 스타일

개발과 유지관리

소스 트리 구조

하위 시스템 유지관리자

메일링 리스트 기반 개발

패치 작성과 검토

하위 시스템 트리와 메인라인

병합 창과 릴리스 후보

stable과 longterm 계열

회귀 방지 정책

기업과 공동체의 참여

버전과 릴리스

버전 번호 체계

메인라인 릴리스

릴리스 후보

안정화 릴리스

장기 지원 릴리스

배포판 커널

벤더 커널과 포크

디버깅과 관찰

printk와 커널 로그

ftrace

perf

eBPF

kprobes와 uprobes

커널 디버거

sanitizers

크래시 덤프

정적 분석과 자동화된 테스트

사용자 공간과의 인터페이스

시스템 호출

장치 파일

procfs

sysfs

ioctl

netlink

사용자 공간 ABI

GNU C Library와 다른 시스템 라이브러리

배포와 활용 분야

Linux 배포판

서버와 데이터 센터

클라우드 컴퓨팅

슈퍼컴퓨터

Android와 모바일 장치

임베디드 시스템

네트워크 장비

자동차와 산업 장비

데스크톱과 개인용 컴퓨터

다른 커널과의 관계

UNIX

MINIX

GNU Hurd

BSD 커널

XNU

Windows NT 커널

마이크로커널과의 비교

영향

장점과 한계

관련 문서

  1. Linux kernel README
  2. Linux Kernel Documentation: Kernel subsystem documentation
  3. Linux Kernel Documentation: Programming Language
  4. Linux Kernel Documentation: How the development process works
  5. Linux Kernel Documentation: Linux kernel licensing rules