리눅스 커널 (Linux Kernel)
개요
리눅스 커널은 운영체제의 핵심 구성 요소로, 하드웨어와 소프트웨어 간의 인터페이스를 담당하는 프로그램입니다. 리눅스 시스템은 Kernel < Shell < Application 형태의 계층적 구조로 구성되어 있으며, 커널은 가장 하위 계층에서 시스템의 모든 자원을 관리하고 제어합니다.
커널의 역할
커널은 다음과 같은 핵심 역할을 수행합니다:
- 하드웨어 추상화: 다양한 하드웨어 장치를 추상화하여 상위 레벨에서 일관된 인터페이스 제공
- 자원 관리: CPU, 메모리, 디스크, 네트워크 등 시스템 자원의 효율적 관리
- 프로세스 관리: 프로세스의 생성, 실행, 종료 및 스케줄링
- 보안 및 권한 관리: 사용자 인증, 파일 접근 권한, 시스템 보안
- 시스템 호출 제공: 사용자 프로그램이 커널 기능을 사용할 수 있는 인터페이스
커널의 구조
1. 모놀리딕 커널 (Monolithic Kernel)
리눅스 커널은 모놀리딕 커널 구조를 채택하고 있습니다.
특징:
- 단일 프로세스 공간: 커널의 모든 기능이 하나의 주소 공간에서 실행
- 직접 통신: 커널 내부 모듈 간 직접적인 함수 호출
- 높은 성능: 모듈 간 통신 오버헤드가 적음
- 복잡한 구조: 커널이 커지면서 복잡도가 증가
2. 커널 모듈 (Kernel Modules)
리눅스 커널은 모듈화된 구조를 지원하여 필요에 따라 기능을 동적으로 로드/언로드할 수 있습니다.
모듈의 장점:
- 동적 로딩: 실행 중에 필요한 기능만 로드
- 메모리 효율성: 사용하지 않는 기능은 메모리에 로드하지 않음
- 유지보수성: 개별 모듈 단위로 업데이트 및 수정 가능
주요 모듈 예시:
- 디바이스 드라이버: 하드웨어 장치 제어
- 파일 시스템: 다양한 파일 시스템 지원
- 네트워크 프로토콜: 네트워크 통신 프로토콜
커널의 주요 기능
1. 프로세스 관리 (Process Management)
프로세스 생성 및 제어:
- fork(): 새로운 프로세스 생성
- exec(): 프로세스 이미지 교체
- wait(): 자식 프로세스 종료 대기
- exit(): 프로세스 종료
스케줄링:
- Completely Fair Scheduler (CFS): 완전 공정 스케줄러
- 실시간 스케줄링: SCHED_FIFO, SCHED_RR
- 우선순위 관리: nice 값, real-time priority
- 멀티코어 지원: SMP(Symmetric Multi-Processing) 환경
2. 메모리 관리 (Memory Management)
가상 메모리 시스템:
- 페이지 관리: 4KB 페이지 단위 메모리 관리
- 메모리 매핑: 가상 주소와 물리 주소 매핑
- 스왑 관리: 디스크 공간을 메모리로 활용
- 캐시 관리: 페이지 캐시, 버퍼 캐시
메모리 할당:
- 슬랩 할당자: 커널 메모리 할당
- buddy 시스템: 물리 메모리 할당
- OOM Killer: 메모리 부족 시 프로세스 종료
3. 파일 시스템 관리 (File System Management)
VFS (Virtual File System):
- 통합된 인터페이스: 다양한 파일 시스템을 통합 관리
- 파일 시스템 추상화: ext4, btrfs, xfs 등 지원
- 네트워크 파일 시스템: NFS, CIFS 지원
파일 조작:
- 파일 생성/삭제: inode 기반 파일 관리
- 디렉토리 관리: 계층적 디렉토리 구조
- 권한 관리: rwx 권한, ACL 지원
- 링크 관리: 하드 링크, 심볼릭 링크
4. 네트워크 관리 (Network Management)
네트워크 스택:
- TCP/IP 프로토콜: 전송 제어 프로토콜 스택
- 소켓 인터페이스: 네트워크 통신 API
- 라우팅: 네트워크 패킷 라우팅
- 방화벽: netfilter 프레임워크
네트워크 인터페이스:
- 네트워크 장치 관리: 이더넷, 무선랜 등
- 프로토콜 지원: IPv4, IPv6, TCP, UDP
- 네트워크 보안: SELinux, AppArmor
5. 디바이스 드라이버 관리 (Device Driver Management)
드라이버 아키텍처:
- 플러그 앤 플레이: 자동 장치 인식
- 핫플러그: 실행 중 장치 연결/해제
- 버스 시스템: PCI, USB, I2C 등 지원
드라이버 종류:
- 문자 장치 드라이버: 키보드, 마우스, 터미널
- 블록 장치 드라이버: 하드디스크, SSD
- 네트워크 장치 드라이버: 이더넷 카드, 무선랜
6. 보안 기능 (Security Features)
접근 제어:
- 사용자/그룹 관리: UID, GID 기반 권한
- 파일 권한: rwx 권한, setuid, setgid
- SELinux: 강제 접근 제어
- AppArmor: 응용 프로그램별 보안 정책
암호화 및 인증:
- 커널 암호화: dm-crypt, LUKS
- 키 관리: 키링 시스템
- 보안 모듈: LSM (Linux Security Modules)
시스템 호출 (System Calls)
1. 시스템 호출의 개념
시스템 호출은 사용자 프로그램이 커널의 기능을 사용할 수 있도록 제공하는 인터페이스입니다.
주요 특징:
- 권한 모드 전환: 사용자 모드에서 커널 모드로 전환
- 안전한 인터페이스: 사용자 프로그램의 직접적인 하드웨어 접근 방지
- 표준화된 API: POSIX 표준을 따르는 시스템 호출
2. 주요 시스템 호출
파일 조작:
int open(const char *pathname, int flags);
int close(int fd);
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);
int unlink(const char *pathname);
프로세스 관리:
pid_t fork(void);
int execve(const char *pathname, char *const argv[], char *const envp[]);
pid_t wait(int *wstatus);
void exit(int status);
메모리 관리:
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
int munmap(void *addr, size_t length);
void *brk(void *addr);
void *sbrk(intptr_t increment);
커널 개발과 오픈소스
1. 오픈소스 개발 모델
리눅스 커널은 자유-오픈 소스 소프트웨어로 개발되고 있습니다.
오픈소스의 장점:
- 투명성: 소스 코드가 공개되어 검토 가능
- 협력 개발: 전 세계 개발자들의 기여
- 빠른 발전: 지속적인 기능 개선과 버그 수정
- 커스터마이징: 사용 목적에 맞게 수정 가능
2. 커널 개발 과정
개발 워크플로우:
- 기능 제안: 메일링 리스트를 통한 RFC (Request for Comments)
- 코드 개발: 기능 구현 및 테스트
- 코드 리뷰: 커뮤니티의 검토 및 피드백
- 메인라인 통합: 승인된 코드를 메인 커널에 통합
- 릴리스: 정기적인 커널 릴리스
3. 커널 버전 관리
버전 번호 체계:
- 메이저 버전: 주요 기능 변경 (예: 5.x)
- 마이너 버전: 새로운 기능 추가 (예: 5.15)
- 패치 레벨: 버그 수정 및 보안 패치 (예: 5.15.123)
릴리스 주기:
- 메인라인: 2-3개월마다 새로운 마이너 버전
- LTS (Long Term Support): 장기 지원 버전
- 안정 버전: 프로덕션 환경용 안정화된 버전
커널 튜닝과 최적화
1. 커널 파라미터 튜닝
주요 튜닝 파라미터:
- vm.swappiness: 스왑 사용 빈도
- vm.dirty_ratio: 페이지 캐시의 최대 비율
- net.core.rmem_max: 수신 버퍼 최대 크기
- fs.file-max: 최대 파일 디스크립터 수
2. 성능 모니터링
모니터링 도구:
- perf: 성능 분석 도구
- ftrace: 커널 트레이싱
- systemtap: 동적 트레이싱
- eBPF: 확장 버클리 패킷 필터
학습 목표
이번 학습을 통해 다음 사항들을 이해할 수 있습니다:
- 커널의 기본 개념과 역할
- 리눅스 커널의 구조와 특징
- 커널의 주요 기능과 관리 방법
- 시스템 호출의 개념과 사용법
- 오픈소스 개발 모델의 이해
- 커널 튜닝과 성능 최적화
실습 과제
- 시스템 호출 확인: strace를 이용한 시스템 호출 추적
- 커널 모듈 관리: insmod, rmmod, modprobe 명령어 실습
- 커널 파라미터 조정: sysctl을 이용한 커널 파라미터 변경
- 성능 모니터링: perf, ftrace를 이용한 성능 분석
참고 자료
서브목차