1. ARM 컴파일러(툴체인) 설치
- CodeSourcery : www.codesourcery.com / https://www.mentor.com/embedded-software/codesourcery
참조링크 : http://blog.naver.com/joyjazz/20062724532 - ARM Cross compiler임
- 환경설정
$ export PATH=/CodeBench/bin:$PATH
2. 커널 소스 다운로드
- 공식 링크
git clone git://github.com/raspberrypi/linux.git
- 빌드를 위한 패키지 설치
$sudo apt-get install git-core libncurses5-dev
- 다운로드가 완료되면 linux 폴더가 만들어짐
3. 커널빌드
- 참고: https://www.raspberrypi.org/documentation/linux/kernel/building.md
- 1단계
make mrproper // 기존 커널 설정 내용을 초기화 - 2단계
make config // 텍스트 기반 커널 설정
make oldconfig // 이전 설정 내용을 기반으로 설정
make menuconfig // ncurses 라이브러리 기반 텍스트 gui 모드에서 설정
make xconfig // QT 기반의 설정
make gconfig // QTK+ 기반의 설정 - 3단계
make // 커널 + 모듈
make all // 커널 + 모듈
make zImage // 커널 only
make Image // 라즈베리파이용 커널 이미지 - 4단계
make modules // 모듈만 컴파일 - 5단계
make modules_install // 모듈 설치 - 6단계
make install // 부트로더 수정 - 7단계
reboot
- 데스크탑을 위한 커널빌드가 아니면 5~7단계는 사용되지 않는다.
4. 기타
- feature 설정 확인 : /arch/arm/configs/bcmrpi_defconfig 파일을 열어 확인 / 수정한다
- bcmrpi_defconfig 를 확인한 이후 커널 소스에 적용하기 위해
make bcmrpi_defconfig
를 수행함 - 추가로 사용하고 싶은 기능이 있으면
make menuconfig
명령을 통해 변경 가능 - 설정이 완료되면 빌드
make
==> 최종 결과물은 커널이미지를 가리키는 이미지이며, arch/arm/boot 에 생성됨
- 만약 모듈 기능들을 매제하고 커널 이미지만 빌드하고 싶드면
make Image
명령을 사용 ==> 커널 이미지 파일은 Image를 /boot 디렉터리로 복사하면 됨(반드시 백업해 둘 것)
5. 모듈 빌드
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
int simple_mod_init(void)
{
printk("simple module loaded\n");
return 0;
}
int simple_mod_exit(void)
{
printk("simple module unloaded\n");
return 0;
}
module_init(simple_mod_init);
module_exit(simple_mod_exit);
MODULE_LICENSE("GPL");
Makefile
obj-m := simple_mod.o
KDIR := /usr/src/linux
PWD := $(shell pwd)
FILE := simple_mod
all:
@echo
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
dmesg | tail -5
clean:
@echo
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) clean
dmesg | tail -5
up:
@echo
insmod $(FILE).ko
dmesg | tail -5
lsmod
down:
@echo
rmmod $(FILE)
dmesg | tail -5
lsmod
- 빌드하면 simple_mod.ko 파일이 생성됨
- 모듈 적재 : insmod simple_mod.ko
모듈 제거 : rmmod simple_mod
모듈 적재(의존성 포함) : modprobe simple_mod
모듈 제거(의존성 포함) : modprobe -r simple_mod