커널 포팅 (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 프로토콜 스택 구현
💡 커널 포팅 시 주로 수정하는 부분:
- 새로운 네트워크 프로토콜 추가
- 특정 네트워크 장치 최적화
✅ 정리
리눅스 커널의 디렉토리 구조를 이해하면 어떤 기능이 어디에 위치하는지 쉽게 찾을 수 있으며, 커널을 수정하거나 포팅할 때 필요한 부분을 빠르게 파악할 수 있습니다. 🚀
'프로그래밍 > 시스템' 카테고리의 다른 글
커널 포팅 (2. 커널 소스 분석 및 빌드 / 2.3 크로스 컴파일러를 이용한 커널 빌드) (0) | 2025.03.06 |
---|---|
커널 포팅 (2. 커널 소스 분석 및 빌드 / 2.2 커널 빌드 과정 이해) (0) | 2025.03.06 |
커널 포팅 (1. 개요 및 준비 / 1.3 실습 환경 구축) (0) | 2025.03.06 |
커널 포팅 (1. 개요 및 준비 / 1.2 커널 포팅이란?) (0) | 2025.03.06 |
커널 포팅 (1. 개요 및 준비 / 1.1 커널이란 무엇인가?) (0) | 2025.03.06 |