본문 바로가기

프로젝트/[중단] 라즈베리파이 가지고 놀기(망가짐)

라즈베리 파이 커널에 간단한 디바이스 드라이버 모듈 빠르게 적재하기!

728x90




우리가 해보자 하는 것은 라즈베리 파이 커널에 빠르게 디바이스 드라이버 모듈을 올리자! 입니다.





앞선  152 번의 글은 이글의 1탄 격입니다. 주소는 

http://lareale.tistory.com/152

입니다.


지난 152번의 글을 간략히 설명하자면 "3.18.y-rebase버전의 라즈베리 파이 커널을 빠르게 빌드하자!" 입니다.

여기서 발생했던 문제들은 참 다양합니다. 그치만 그 에러들의 각각의 근원지를 정확히 말하기가 모호합니다.

(대표적으로 fat.o , ECN.o, openvSwitch 관련 에러들 ...)


대표적으로 fs/fat/fat.o 에러가 있는데요. 이 에러는 menuconfig 에서 file system 의 MS-DOS, WINDOW 95, NTFS 설정에 의해 발생하는 것을 빌드 중에 확인 할 수 있었습니다. 152 번 글에서 밝힌데로 우리는 bcmrpi_defconfig 를 기본 .config 로 잡고 빌드를 시작했습니다. 따라서 그 에러가 나온 이유가 bcmrpi_defconfig 때문인지 아니면 특정 폴더의 Kconfig에서 빠졌던 것인지 해당 filesystem 설정이 미지원되는 kernel 버전이어서(3.18.y-rebase) 에러가 발생했던 것인지 정확히 알 수 없었습니다. (코드를 분석하면 어느 정도는 알아낼 수 있다고는 생각합니다.)


마침내 152 번 글에서는 해당 기능을 config 에서 삭제하고 그 조건으로 빌드에 성공합니다. 하지만 이는 제대로된 컴파일이 아닙니다. 왜냐하면 저 fat.o 는 라즈베리 파이를 담는 SD Card 접근과 관련된 내용이기 때문입니다.


잠시 라즈비안을 처음 올릴 때를 생각해봅시다.

라즈베리 파이의 이미지 파일을 올린다면며 대부분 윈도우에서 SD Card에 해당 OS 전체 img 를 넣기 마련입니다. 이때 라즈베리 파이가 fat 파일 시스템을 지원해야 라즈베리 파이에서 커널이미지가 담긴 SD Card 의 /boot/ 폴더에 있는 파일에 접근이 가능해집니다. (만약 지원하지 않으면 해당 파일은 보이지 않지만 존재하는 데이터가 됩니다.) 이때 /boot 폴더는 라즈베리 내에서도 존재하는 공유 폴더입니다. 결론은 fat.o와 관련된 해당 옵션이 있어야 윈도우에서 SD card에 파일을 저장하면 라즈베리 파이 내부에서 열어볼 수 있다는 겁니다.


그러면 우리의 목표가 다시 수정됩니다. 우리가 선택하고자 하는 커널은 fat을 지원해야하며 모듈 (.ko) 컴파일시 지정하는 KDIR(커널 디렉토리)에 있는 커널과 앞선 커널의 버전은 같아야 합니다. 

이에 맞는  kernel 버전은 3.19.3 입니다.  (아래는 필자의 환경이 요구하는 기능들)

 - 몇몇 에러는 빌드 중간에 있지만 설정에서 빼도 커널 빌드 가능함(img 생성)

 - fat.o 에러 안남 (라즈베리와 window 상에서 SD Card 내 boot 폴더 파일 시스템 공유 가능 -> 모듈 적재 가능)

 - usb ethernet 기능 지원 됌 (putty로 ethernet 써서 라즈베리파이 제어 가능)

(왜 3.19.1 도 아니고 5 도 아니고 4 도 아니고 3.19.3 이냐고 묻고 싶다면 아래 링크에서 Makefile 검색후 오른쪽 내용을 읽어보십쇼. 그냥 저 소스가 그래서 그런 것입니다. 여러 버전의 커널을 빌드 해봤고 원하는 조건을 만족하는 버전을 찾기가 어려웠는데 저버전은 내가 원하는 환경이 잘 작동됐을 뿐입니다.)



즉 이 옵션을 줬을 때 에러없이(fat.c 파일이 존재)  커널 빌드가 가능한 커널 버전의 소스가 있어야 합니다. 그리고 그 소스를 빌드해놔야 디바이스 드라이버  모듈(.ko) 제작시 파일들을 읽으며 매직넘버가 맞아서 insmod가 가능해집니다.







아래부터는 위와 관련된 명령어부터 내가 만든 테스트 디바이스 드라이버를 insmod로 올리는 작업까지에 대한 내용입니다.


우선 아래의 테스트 디바이스 드라이버 코드를 봅시다.

#mydev.c 파일



#Makefile 파일






[수행 과정]

// 이미 ARCH=  CROSS_COMPILE= 환경 변수에 저장되어 있었음

$make bcmrpi_defconfig

$make menuconfig

 // 여기서 뺄꺼 빼야합니다. openvSwich 이런....

$make 

// 커널 빌드 시작

-> zImage, Image 생성


$cd mydev이 있는 폴더

$make //Makefile 기준으로 mydev.c 컴파일 수행합니다.)

$mydev.ko 파일이 생성되면 그것을 SD Card에 있는/boot 폴더에 담습니다.

$cd /boot/

$sudo chmod 777 mydev.ko // 보내진 파일 mydev.ko 의 권한 설정

$sudo insmod mydev.ko    // 모듈 적재

$sudo rmmod mydev.ko    // 모듈 제거

$dmesg 로 확인 Hello World,  Goodbye World 문자를 확인할 수 있습니다.





끄읕!