커널 포팅 (2. 커널 소스 분석 및 빌드 / 2.1 커널 소스 구조 이해)

2025. 3. 6. 19:34프로그래밍/시스템

2.1 커널 소스 구조 이해

리눅스 커널은 대규모의 코드베이스로 이루어져 있으며, 여러 하드웨어 및 시스템 환경에서 동작할 수 있도록 모듈화된 디렉토리 구조를 가지고 있습니다.
각 디렉토리는 아키텍처, 드라이버, 파일 시스템, 메모리 관리, 네트워크 스택 등과 관련된 코드가 포함되어 있습니다.


🔹 리눅스 커널 디렉토리 구조

리눅스 커널 소스 코드를 다운로드하면, 다음과 같은 디렉토리 구조를 확인할 수 있습니다.

linux/
├── arch/         # CPU 아키텍처별 코드
├── block/        # 블록 장치 관련 코드
├── crypto/       # 암호화 관련 코드
├── Documentation/ # 문서 및 설명서
├── drivers/      # 디바이스 드라이버 코드
├── fs/           # 파일 시스템 코드
├── include/      # 공통 헤더 파일
├── init/         # 부팅 과정 코드
├── kernel/       # 커널 핵심 코드
├── lib/          # 공통 라이브러리 코드
├── mm/           # 메모리 관리 코드
├── net/          # 네트워크 관련 코드
├── scripts/      # 커널 빌드 스크립트
└── security/     # 보안 관련 코드

각 디렉토리의 역할을 이해하면 커널 소스를 분석하고 수정하는 데 중요한 기초 지식이 됩니다.


🔹 주요 디렉토리별 상세 설명

📌 1️⃣ arch/ (아키텍처별 코드)

📍 역할:

  • CPU 아키텍처(ARM, x86, RISC-V, MIPS 등)에 따라 필요한 코드가 저장된 디렉토리
  • 커널이 특정 하드웨어에서 실행되도록 보드 및 SoC(System on Chip) 관련 코드 포함

📍 구조 예시:

arch/
├── arm/        # ARM 아키텍처 관련 코드
├── arm64/      # 64비트 ARM (AArch64) 코드
├── x86/        # x86 및 x86_64 코드
├── riscv/      # RISC-V 아키텍처 코드
├── mips/       # MIPS 아키텍처 코드
├── powerpc/    # PowerPC 아키텍처 코드
└── ... 

📍 주요 파일 및 기능:

  • arch/arm/boot/dts/ → 디바이스 트리(Device Tree) 파일 (보드별 하드웨어 설정)
  • arch/arm/kernel/ → ARM 프로세서 초기화 코드
  • arch/arm/mach-<보드명>/ → 특정 보드에 대한 초기화 코드

💡 커널 포팅 시 주로 수정하는 부분:

  • 새로운 보드 지원 추가 (mach-, plat- 디렉토리)
  • 디바이스 트리 설정 (dts 파일 수정)
  • Makefile 및 Kconfig 수정

📌 2️⃣ drivers/ (디바이스 드라이버 코드)

📍 역할:

  • 하드웨어 장치를 제어하는 디바이스 드라이버 코드 저장
  • CPU, 메모리, 저장 장치, 네트워크, USB, I2C, SPI 등의 다양한 하드웨어 지원

📍 구조 예시:

drivers/
├── acpi/       # ACPI 전원 관리
├── block/      # 블록 장치 (HDD, SSD 등)
├── char/       # 문자 장치 (터미널, UART 등)
├── gpio/       # GPIO 핀 제어
├── i2c/        # I2C 통신
├── net/        # 네트워크 장치 (이더넷, WiFi)
├── usb/        # USB 장치
└── video/      # 그래픽 및 디스플레이 관련 코드

📍 주요 파일 및 기능:

  • drivers/usb/ → USB 컨트롤러 드라이버
  • drivers/net/ → 네트워크 인터페이스 카드(NIC) 드라이버
  • drivers/gpio/ → GPIO 제어 관련 코드

💡 커널 포팅 시 주로 수정하는 부분:

  • 특정 하드웨어를 위한 디바이스 드라이버 추가
  • 기존 드라이버를 수정하여 새로운 기능 추가

📌 3️⃣ fs/ (파일 시스템 코드)

📍 역할:

  • 다양한 파일 시스템을 지원하는 코드 포함
  • 커널이 파일을 읽고 쓰는 방식을 정의

📍 구조 예시:

fs/
├── ext4/       # EXT4 파일 시스템
├── fat/        # FAT 파일 시스템 (USB, SD 카드)
├── ntfs/       # NTFS (Windows 호환 파일 시스템)
├── nfs/        # 네트워크 파일 시스템 (NFS)
├── xfs/        # XFS 고성능 파일 시스템
└── vfs/        # 가상 파일 시스템 (Virtual File System)

📍 주요 파일 및 기능:

  • fs/vfs/ → 가상 파일 시스템 (VFS) 계층, 모든 파일 시스템이 공통적으로 따르는 인터페이스 제공
  • fs/ext4/ → EXT4 파일 시스템 드라이버, 리눅스의 기본 파일 시스템
  • fs/fat/ → FAT 파일 시스템 드라이버, USB 및 SD 카드에서 사용

💡 커널 포팅 시 주로 수정하는 부분:

  • 새로운 파일 시스템 지원 추가 (fs/ 디렉토리 수정)
  • 기본 마운트 파일 시스템 변경 (루트 파일 시스템 변경)

📌 4️⃣ init/ (부팅 과정 코드)

📍 역할:

  • 커널이 부팅될 때 실행되는 초기화 코드 포함
  • init/main.c → 커널 부팅의 시작점

📍 주요 파일 및 기능:

  • init/main.c → 커널의 진입점 (start_kernel())
  • init/version.c → 커널 버전 정보 출력

💡 커널 포팅 시 주로 수정하는 부분:

  • 특정 부팅 과정을 변경해야 할 경우 (start_kernel() 수정)
  • 추가적인 초기화 코드 삽입

📌 5️⃣ kernel/ (커널 핵심 코드)

📍 역할:

  • 프로세스 스케줄링, 인터럽트 처리, 시스템 호출 등 커널의 핵심 기능 포함

📍 주요 파일 및 기능:

  • kernel/sched/ → CPU 스케줄러 코드
  • kernel/fork.c → 프로세스 생성 (fork()) 구현
  • kernel/exit.c → 프로세스 종료 코드

💡 커널 포팅 시 주로 수정하는 부분:

  • 새로운 CPU 스케줄링 알고리즘 추가
  • 특정 기능을 최적화하기 위해 커널 스케줄러 수정

📌 6️⃣ mm/ (메모리 관리 코드)

📍 역할:

  • 가상 메모리, 페이지 테이블, 메모리 할당 관리

📍 주요 파일 및 기능:

  • mm/mmap.c → 가상 메모리 매핑 (mmap()) 구현
  • mm/page_alloc.c → 페이지 할당 (kmalloc()) 구현

💡 커널 포팅 시 주로 수정하는 부분:

  • 특정 하드웨어의 메모리 관리 최적화
  • 새로운 메모리 할당 방식 추가

📌 7️⃣ net/ (네트워크 관련 코드)

📍 역할:

  • TCP/IP 스택 및 네트워크 프로토콜 구현

📍 주요 파일 및 기능:

  • net/core/ → 기본 네트워크 계층 코드
  • net/ipv4/ → IPv4 프로토콜 스택 구현
  • net/ipv6/ → IPv6 프로토콜 스택 구현

💡 커널 포팅 시 주로 수정하는 부분:

  • 새로운 네트워크 프로토콜 추가
  • 특정 네트워크 장치 최적화

✅ 정리

리눅스 커널의 디렉토리 구조를 이해하면 어떤 기능이 어디에 위치하는지 쉽게 찾을 수 있으며, 커널을 수정하거나 포팅할 때 필요한 부분을 빠르게 파악할 수 있습니다. 🚀