Skip to content

Instantly share code, notes, and snippets.

@YangSiJun528
Last active December 21, 2024 13:08
Show Gist options
  • Select an option

  • Save YangSiJun528/691e4a9cb71111afcc0cfe87cab20311 to your computer and use it in GitHub Desktop.

Select an option

Save YangSiJun528/691e4a9cb71111afcc0cfe87cab20311 to your computer and use it in GitHub Desktop.
build.sh 해석
이 코드는 **Linux 커널**을 특정 환경에서 빌드하기 위해 작성된 **Bash 스크립트**입니다. Raspberry Pi와 같은 임베디드 시스템을 위한 빌드 프로세스를 관리하는 데 사용됩니다. 아래는 주요 부분과 역할을 설명합니다.
---
### 1. **빌드 출력 경로 설정**
```bash
KERNEL_TOP_PATH="$( cd "$(dirname "$0")" ; pwd -P)"
OUTPUT="$KERNEL_TOP_PATH/out"
```
- `KERNEL_TOP_PATH`:
- 현재 스크립트가 위치한 디렉토리를 기준으로 절대 경로를 설정합니다.
- 빌드 스크립트를 어디서 실행하든 경로를 일관되게 관리할 수 있도록 보장합니다.
- `OUTPUT`:
- 빌드 출력물이 저장될 디렉토리를 정의합니다 (`out` 디렉토리).
---
### 2. **로그 파일 및 커널 이름 정의**
```bash
KERNEL=kernel8
BUILD_LOG="$KERNEL_TOP_PATH/rpi_build_log.txt"
```
- `KERNEL=kernel8`:
- 빌드할 커널의 이름을 정의합니다. `kernel8`은 ARMv8 아키텍처(Raspberry Pi 4 등)를 대상으로 합니다.
- `BUILD_LOG`:
- 빌드 과정에서 발생하는 로그를 저장할 파일 경로입니다.
---
### 3. **커널 소스 디렉토리 이동**
```bash
echo "move kernel source"
cd linux
```
- `cd linux`:
- Linux 커널 소스 코드가 위치한 `linux` 디렉토리로 이동합니다.
---
### 4. **기본 설정(defconfig) 생성**
```bash
echo "make defconfig"
make O=$OUTPUT bcm2711_defconfig
```
- `make bcm2711_defconfig`:
- `bcm2711_defconfig`은 Raspberry Pi 4용 기본 설정을 로드합니다.
- `O=$OUTPUT` 옵션:
- 빌드 출력물(`Image`, `modules`, `dtbs`)을 `OUTPUT` 경로에 저장합니다.
---
### 5. **커널 빌드**
```bash
echo "kernel build"
make O=$OUTPUT Image modules dtbs -j4 2>&1 | tee $BUILD_LOG
```
- `make` 명령어:
- `Image`: 커널 이미지를 빌드합니다.
- `modules`: 커널 모듈을 빌드합니다.
- `dtbs`: 디바이스 트리 바이너리를 빌드합니다.
- `-j4`:
- 병렬 작업을 위해 4개의 CPU 코어를 사용합니다.
- `2>&1 | tee $BUILD_LOG`:
- 모든 출력(표준 출력 및 에러)을 `BUILD_LOG` 파일에 저장하면서 동시에 터미널에 출력합니다.
---
### 요약
이 스크립트는 **Raspberry Pi 4**와 같은 장치용으로 Linux 커널을 빌드하는 작업을 자동화합니다. 다음 작업이 포함됩니다:
1. 커널 빌드 환경 설정.
2. Raspberry Pi 4에 적합한 기본 설정 적용.
3. 커널, 모듈, 및 디바이스 트리 빌드.
4. 빌드 로그 저장.
이 스크립트를 실행하려면 Linux 커널 소스(`linux` 디렉토리)가 준비되어 있어야 하며, `make` 및 필요한 툴체인이 설치되어 있어야 합니다.
리눅스 커널 소스 트리를 아래와 같이 간단한 **트리 구조**로 표현했습니다. 주요 디렉토리만 포함했으며, 하위 디렉토리와 그 역할을 표시했습니다.
```
linux/
├── arch/ # CPU 아키텍처별 코드
│ ├── arm/ # 32비트 ARM
│ ├── arm64/ # 64비트 ARM (Raspberry Pi 4 등)
│ ├── x86/ # x86 아키텍처 (Intel/AMD)
│ └── ... # 기타 아키텍처 (RISC-V, MIPS 등)
├── drivers/ # 하드웨어 드라이버
│ ├── usb/ # USB 장치
│ ├── net/ # 네트워크 장치
│ ├── gpu/ # GPU 관련
│ └── ... # 다양한 장치 드라이버
├── fs/ # 파일 시스템
│ ├── ext4/ # ext4 파일 시스템
│ ├── nfs/ # NFS 파일 시스템
│ ├── xfs/ # XFS 파일 시스템
│ └── ... # 기타 파일 시스템
├── kernel/ # 커널 핵심 로직
│ ├── sched/ # 스케줄러
│ ├── locking/ # 락킹 및 동기화
│ └── ... # 프로세스 관리 등
├── mm/ # 메모리 관리
│ ├── numa.c # NUMA 관련
│ ├── swap.c # 스왑 관리
│ └── ... # 페이지 관리
├── net/ # 네트워크 스택
│ ├── ipv4/ # IPv4 프로토콜
│ ├── ipv6/ # IPv6 프로토콜
│ ├── netfilter/ # 방화벽 및 패킷 필터
│ └── ... # 네트워크 관련 코드
├── include/ # 공용 헤더 파일
│ ├── linux/ # 커널 API 헤더
│ ├── uapi/ # 사용자 공간과 커널 간 인터페이스
│ └── ... # 플랫폼 및 아키텍처 관련
├── init/ # 부팅 초기화 코드
├── block/ # 블록 장치 처리
├── crypto/ # 암호화 알고리즘
├── lib/ # 공용 라이브러리
├── scripts/ # 빌드 및 설정 스크립트
├── tools/ # 사용자 공간 도구
├── security/ # 보안 메커니즘 (SELinux 등)
├── Documentation/ # 문서 및 개발자 가이드
├── Makefile # 커널 빌드 관리 파일
└── Kconfig # 커널 설정 파일
```
---
### 트리의 주요 디렉토리와 역할
1. **`arch/`**: CPU 아키텍처별 코드를 관리.
2. **`drivers/`**: 하드웨어와 상호작용하는 장치 드라이버.
3. **`fs/`**: 파일 시스템 구현.
4. **`kernel/`**: 커널의 중심 로직.
5. **`mm/`**: 메모리 관리 코드.
6. **`net/`**: 네트워크 프로토콜 및 스택 처리.
7. **`include/`**: 공용 헤더 파일.
8. **`scripts/`**: 빌드 과정에서 필요한 유틸리티 스크립트.
9. **`Documentation/`**: 개발자 문서.
이 구조를 따라 특정 기능이나 하드웨어를 지원하거나 커스터마이징할 때 필요한 부분을 찾아 수정할 수 있습니다. 😊
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment