리눅스 커널 (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. 커널 개발 과정

개발 워크플로우:

  1. 기능 제안: 메일링 리스트를 통한 RFC (Request for Comments)
  2. 코드 개발: 기능 구현 및 테스트
  3. 코드 리뷰: 커뮤니티의 검토 및 피드백
  4. 메인라인 통합: 승인된 코드를 메인 커널에 통합
  5. 릴리스: 정기적인 커널 릴리스

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: 확장 버클리 패킷 필터

학습 목표

이번 학습을 통해 다음 사항들을 이해할 수 있습니다:

  1. 커널의 기본 개념과 역할
  2. 리눅스 커널의 구조와 특징
  3. 커널의 주요 기능과 관리 방법
  4. 시스템 호출의 개념과 사용법
  5. 오픈소스 개발 모델의 이해
  6. 커널 튜닝과 성능 최적화

실습 과제

  1. 시스템 호출 확인: strace를 이용한 시스템 호출 추적
  2. 커널 모듈 관리: insmod, rmmod, modprobe 명령어 실습
  3. 커널 파라미터 조정: sysctl을 이용한 커널 파라미터 변경
  4. 성능 모니터링: perf, ftrace를 이용한 성능 분석

참고 자료

서브목차