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년 리누스 토르발스가 처음 개발했으며, 이후 세계 각지의 개인 개발자와 기업, 연구 기관이 참여하는 대규모 공동 개발 프로젝트로 발전하였다.
Linux 커널은 일반적으로 하나의 커널 주소 공간 안에서 프로세스 관리, 가상 메모리, 파일 시스템, 네트워크 스택과 장치 드라이버를 실행하는 모놀리식 커널로 분류된다. 다만 필요한 기능과 장치 드라이버를 실행 중에 추가하거나 제거할 수 있는 적재 가능 커널 모듈을 지원하므로, 실제 구성과 배포에서는 높은 확장성을 가진다.
좁은 의미의 Linux는 이 커널 자체를 가리키지만, 일상적으로는 Linux 커널에 GNU 도구, 시스템 라이브러리, 초기화 시스템, 데스크톱 환경과 응용 프로그램을 결합한 Linux 배포판 또는 운영체제 전체를 가리키기도 한다. Android, ChromeOS, 서버용 배포판, 네트워크 장비와 임베디드 시스템도 서로 다른 사용자 공간을 사용하면서 Linux 커널을 기반으로 동작한다. 따라서 Linux 커널과 이를 포함하는 완성된 운영체제는 구분해서 다룰 필요가 있다.
Linux 커널은 프로세스와 스레드의 실행을 스케줄링하고, 각 프로세스에 가상 주소 공간을 제공하며, 저장 장치와 파일 시스템을 통합된 인터페이스로 노출한다. 또한 시스템 호출을 통해 사용자 공간과 커널 공간의 경계를 형성하고, 다양한 하드웨어를 공통 장치 모델과 드라이버 계층으로 추상화한다. 네트워크 프로토콜, 보안 정책, 가상화, 전력 관리와 추적 기능도 커널 내부의 주요 하위 시스템으로 구현된다.
소스 코드는 대부분 GNU C11 방언의 C로 작성되며, CPU 초기화와 문맥 전환처럼 아키텍처에 밀접한 일부 영역에서는 어셈블리어가 사용된다. 새로운 커널 구성 요소를 작성하기 위한 Rust 지원도 CONFIG_RUST 구성 옵션을 통해 제공된다.
Linux 커널의 소스 트리는 여러 하위 시스템과 아키텍처별 코드로 나뉘며, 각 영역의 유지관리자가 변경 사항을 검토하고 자신의 개발 트리에서 관리한다. 검토된 변경은 여러 단계의 하위 시스템 트리를 거쳐 리누스 토르발스가 관리하는 메인라인에 병합된다. 정식 메인라인 릴리스 이후에는 안정화 버전과 장기 지원 계열을 통해 오류 수정과 보안 패치가 제공된다.
커널 전체에는 GNU General Public License 버전 2만 적용되며, 사용자 공간 프로그램이 정상적인 시스템 호출 인터페이스를 사용하는 것만으로 커널의 파생 저작물이 되지 않음을 명시하는 Linux 시스템 호출 예외가 함께 제공된다. 일부 개별 파일은 커널의 라이선스 정책이 허용하는 범위 안에서 다른 GPL 호환 라이선스나 이중 라이선스를 사용할 수 있다.
역사
개발 배경
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 커널
마이크로커널과의 비교
영향
장점과 한계
관련 문서