.  라즈베리 확장

임베디드 개발 환경 구축


§module built-in
http://poplinux.tistory.com/106 참고 (Makefile 내용)
http://sonseungha.tistory.com/112 참고(모듈 빌트인 방법)
http://chlrbgh0.tistory.com/110 참고(모듈 빌트인 방법)
저번 시간에는 커널 모듈을 insmod로 적재하는 것을 해보았고 이번에는 모듈을 커널 이미지에 built-in을 해보고자 한다. (http://kkn1220.tistory.com/14)

- Makefile을 살펴보면 
obj-y := audio_device.o
obj-m := audio_device.o
obj-$(CONFIG_TEST) := audio_device.o 를 살펴볼 수 있다.
위의 -y 옵션은 built-in을 할 때의 옵션이고 -m은 모듈 형식으로의 옵션이다. 
마지막의 경우 리눅스 커널 configure 할 때 사용되는 옵션은
- (*) : built-in
- (M) : Module
- ( ) : not built
이 있는데 해당 옵션을 체크했을 때 make menuconfig 결과에 따라 모듈이나 빌트인으로 알아서 컴파일 된다. 

- 예제
      - hello.c code


- Makefile


- hello 파일 내부(cd linux/driver/hello)  linux폴더-driver폴더 내 hello 폴더 생성


- Makefile 수정

- vi linux/driver/Makefile        //리눅스 폴더 내 드라이버의 Makefile을 수정하는 것이다.


마지막에 obj-y += hello/ 를 적어준당


리눅스 폴더에 가서(cd ../../) 

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig 실행

(*여기에서 arm-linux-gnueabihf-bcm2709_defconfig의 위치는 각자 설정해주어야 된다)

(본인의 경우 make ARCH=arm CROSS_COMPILE=/home/kkn/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf- bcm2709_defconfig가 경로이다)



make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs

(make ARCH=arm CROSS_COMPILE=/home/kkn/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf- zImage modules dtbs)

(사실 dtbs는 필요한지 아닌지는 모르겠당.. 어차피 make clean하지 않아서 금방 진행되므로 무시하고 컴파일 했음)




새로 생성한 hello폴더 내 hello가 built-in되는 것을 확인할 수 있다.



진행이 끝나면 위의 메시지를 확인할 수 있다.(한 10초 걸린듯)


sd카드에 설치 (lsblk 명령어로 sd카드가 올라와있는지 확인해야함)

-mount

$ mkdir mnt/fat32

$ mkdir mnt/ext4

$ sudo mount /dev/sdb1 mnt/fat32

$ sudo mount /dev/sdb2 mnt/ext4

-모듈 설치
  $ sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=mnt/ext4 modules_install

*arm-linux-gnueabihf는 앞 장의 컴파일러 path, INSTALL_MOD_PATH는 설치할 path 경로

- kernel image(mkknlimg 스크립트로 변환 필요), dtb(device tree blob) 복사

$ sudo cp mnt/fat32/$KERNEL.img mnt/fat32/$KERNEL-backup.img    //필수 항목은 아님(백업용)

$ sudo scripts/mkknlimg arch/arm/boot/zImage mnt/fat32/$KERNEL.img        

(scripts는 linux폴더 에서 실행해야함, $KERNEL.img 는 kernel7.img를 지칭(kernel.img 조심하자))

$ sudo cp arch/arm/boot/dts/*.dtb mnt/fat32/   

(dtb는 사실 안바뀌었을 거 같지만 난 초보기 때문에 그냥 복사...)

$ sudo cp arch/arm/boot/dts/overlays/*.dtb* mnt/fat32/overlays/

$ sudo cp arch/arm/boot/dts/overlays/README mnt/fat32/overlays/

$ sudo umount mnt/fat32

$ sudo umount mnt/ext4


라즈베리파이에 sd카드를 넣고 booting


uname -a로 확인


dmesg로 확인



lsmod는 로딩된 모듈만 확인하는 것이고 built-in 된 것은 출력되지 않는다고 한다..
왜 안나오나 잘못되었나 싶었음..


시스템콜 후킹한 것을 테스트해보았을 때에는 부팅 될 때 메시지가 출력되면서 멈춤..

너무 많은 메시지를 호출해서 멈춘걸까 아니면 init에서 필수 드라이버가 로딩되기 전에 진행이 되어서 그런걸까 좀 더 공부해야할듯..




* module을 insmod할 때에는 linux폴더 내 System.map에는 모듈 심볼이 없지만 built-in을 할 때에는 있는 것을 확인할 수 있다.


(이런식으로..)







+ Recent posts