라즈베리 확장

임베디드 개발 환경 구축

§시스템 콜(System call)
운영체제에 의하여 보호되는 자원인 커널 메모리, 커널 데이터 등을 사용자 프로세스가 이용하려면 컨널과
사용자 프로세스가 공유할 수  있는 인터페이스가 필요
권한 레벨을 설정하여 사용자 공간과 커널 공간 구분
서로 다른 공간에 대한 접근은 시스템 호출로만 가능하도록 제한

시스템 호출을 실행하면 사용자 모드에서 시스템 모드로 전환되며, 커널에서 시스템 호출을 종료하면 사용자
모드로 다시 복귀


§리눅스에서 지원하는 시스템 호출
프로세스 관리: fork(), execve(), getpid(), signal()
파일시스템: open(), read(), write(), close()
메모리 관리: brk() emd
네트워크 관리: socket(), bind(), connect()

기타 시스템 정보나 제어 time()


§사용자 프로그램의 번역 과정

§시스템 콜 원리
Linux 에서의 system call 처리
Interrupt 처리 매커니즘 사용
-Interrupt
주변 장치와 커널이 통신하는 방식 중 하나로

주변 장치가 자신에게 발생한 비동기적 사건을

kernel에게 알리는 매커니즘




§시스템 호출 동작 과정(fork 시스템 호출 과정)



§시스템 호출 동작 과정(fork 시스템 호출 과정)

소프트 웨어 인터럽트를 통하여 사용자 모드에서 커널 모드로 전환되어 커널 자원에 접근
Swi 900002;
시스템 호출 번호 900002

시스템 호출 번호를 포함하는 테이블의 시작점이 900000이기 때문에 fork() 시스템 호출 번호는 2

(등록된 시스템 호출 함수 중 세 번째 위치)

호출 번호 2에 해당하는 커널 함수 sys_fork() 호출 


§시스템 호출 구현
hello() 시스템 호출 구현 예
-시스템 호출 후 /var/log/messgaes에 출력 (“hello, I am system call example”)
-$ vi linux/kernel/hello.c  //해당 리눅스 커널 폴더에 파일 생성해야 됨


#include <linux/kernel.h>

Asmlinkage void sys_myhello()

{

    printk(“hello, I am system call example”);

}


시스템 호출 번호 테이블에 등록

$ vi linux/arch/arm/include/uapi/asm/unistd.h  //버전마다 다를 수 있음
-시스템 호출 함수 등록

-$ vi linux/arch/arm/kernel calls.S  //버전마다 다를 수 있음

-Makefile 파일 수정

-$ vi linux/kernel/Makefile

-수정된 커널을 다시 빌드 후 이미지 생성
-$ make ARCH=arm CROSS_COMPILE=/home/kkn/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf- zImage   
-Kernel imagetarget에 복사


라즈베리 확장

임베디드 개발 환경 구축


https://www.raspberrypi.org/documentation/linux/kernel/building.md 참고

http://cs.sch.ac.kr/lecture/Embedd/2012/12-EmbedSW-11-Module.pdf 참고

§크로스 컴파일
대부분의 사용자들은 PC라는 동일한 환경에서 프로그램을 작성 및 컴파일하고 동일한 환경에서 실행한다. 이 때 컴파일을 네이티브  컴파일이라 하고 PC 환경에서 라즈베리용 모듈을 컴파일하여 라즈베리 환경에서 실행. 즉 컴파일은 PC에서 하였고 실행은 라즈베리 파이 환경에서 하는데 이렇게 동작하는 환경과 시스템이 다를 때 이 컴파일을 크로스 컴파일이라고 함

1. 라즈베리 파이 커널 소스 다운로드

$ git clone --depth=1 https://github.com/raspberrypi/linux  //depth의 경우 히스토리는 복제하지 않기 때문에 빠름

2. 툴체인 설치

$ git clone https://github.com/raspberrypi/tools

-컴파일러 위치를 아는 것이 중요한데

          32bit: /tool/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin

          64bit: /tool/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin  이다.

3. 소스 빌드  

$ cd linux

$ KERNEL=kernel7 

$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig

-2번째 줄의 경우 라즈베리파이2kernel7이다. 라즈베리파이2boot partition에는 kernel도 있고 kernel7도 있으니 혼동 주의

   $ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs
-Note: To speed up compilation on multiprocessor systems, and get some improvement on single processor ones, use -j n where n is number of processors * 1.5. Alternatively, feel free to experiment and see what works


4. SD card에 직접 설치

-리눅스 머신에서 $lsblk을 입력할 경우(SD card input) sdb1,2가 나오는 것을 확인할 수 있다.(NOOBS의 경우 최소 5) 이 때, 1FAT partion, 2ext4 partion이다.
-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

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

$ 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


5. 모듈 임베디드 장치에서 실행

-샘플코드 hello.c 


- 샘플코드 Makefile


기존의 폴더에서


- Make를 했을 때 아래와 같이 실행이 된다.


다음과 같이 파일이 생성된 것을 확인할 수 있다.

modinfo hello모듈을 확인한 결과 armv7으로 컴파일 된 것을 확인할 수 있다.

scp를 통한 라즈베리로 모듈 전달
lsmod 현재 모듈 확인  
- insmod 후 모듈 확인

-dmesg로 메시지 확인  
- rmmod dmesg로 메시지 확인

















라즈베리 확장

SD card 분석


§SD card 파티션 분석
-Noobs 설치할 경우 적어도 5개 이상으로 SD card 파티션을 분할한다. 이는 Raspbian 이미지같이 전통적인 Standalone image로 설치하는 것과 차이가 있다.(raspbian으로 설치할 경우 파티션은 2개로 분할됨)
Img 파일을 SD카드에 기록하는 방식은 설치속도와 부팅속도가 빠르지만 이미지 기록 프로그램을 사용하여야 하는 단점이 있고,  NOOBS를 이용하는 방식은 다양한 OS를 설치할 수 잇고 부팅 시 바로 운영체제 설치를 선택할 수 있지만 설치속도와 부팅속도 느림
§Standalone partitioning
- A standalone .img file is a complete byte-for-byte image of an entire SD card. It includes the MBR (which stores the partition table) as well as all the raw partitions. This is the lowest-level possible way of writing an SD card, but it's the only way to access multiple partitions on an SD card using Windows (via the Win32DiskImager software).
-Raspbian 이미지를 설치하면 2개의 파티션 boot(fat)file system(ext4)로 나뉘게 됨
-Boot(fat, sdb1) – boot partion으로 라즈베리파이 펌웨어와 컴파일드리눅스 커널과 몇 개의 config 파일을 가짐
-File system(ext4, sdb2)- root partition으로 applicationhome directory리눅스에서 사용되는 파일들을 포함
-SD카드에 직접 이미지를 복사하게 때문에 큰 용량의 SD카드의 경우 지정된 용량의 공간을 할당하게 된다. 그렇기 때문에 앞서 설명했듯이, raspi-config에서 1. Expand_FileSystem 으로 최적화 시켜야 됨
§Standalone booting
-라즈베리파이는 bootstrap code를 사용하지 않음
1.Boot partition에 있는 bootcode.binload
2.Run start.elf(and fixup.dat)
3.Config.txt 파일을 읽고 GPU configurationset up
4.Cmdline.txt(ext4 읽으라는 내용 포함 되어 있음)파일을 읽고 kernel.img 파일을 실행
5.mmcblk0p2(file system partition) mount

6.Continues booting the rest of the system from 6


§NOOBS partitioning

-NOOBS를 처음 FAT-format SD card에 카피하면 하나의 파티션만 SD card에 할당 된다.


 Primary partition

Logical partition 

Type 

Label 

Contents 

 

FAT 

New Volume 

Noobs bootfiles & initramfs, 

OS recovery images


§NOOBS bootup(low-level)
1.FAT-format /dev/mmcblk0p1으로부터 bootcode.bin을 로드하고 실행
2.start.elf 가 없기 때문에 recovery.elf 파일을 로드하고 실행
3.Running recovery.elf then switches the firmware into "NOOBS mode" it usesrecovery.img instead of kernel.img, 

    recovery.cmdline instead of cmdline.txt, and it sets the root filesystem to recovery.rfs.

4.recovery.elfrecovery.cmdline을 읽고 recovery.img를 실행 recovery.cmdline으로부터 읽은 커맨드라인을 파싱하여 recovery.rfsload


§NOOBS bootup(setup mode)
1.NOOBS가 부트 되면 자동적으로 setup mode로 진입하게 되고 자동적으로 하나뿐인 파티션인 /dev/mmcblk0p1을 축소
2.RECOVERY라고 이름 붙여진 파티션을 만드는데 NOOBS의 경우 XGB, NOOBS lite의 경우 XMB로 생성됨
3.만들어진 파티션 /dev/mmcblk0p2은 확장파티션으로 대부분을 차지할 것임
4.Ext4-format partitiondev/mmcblk0p3 (32MB) 생성됨(SETTINGS으로 명명됨). 이것은 언어, 키보드, NOOBS가 필요한 것 들 등에 대한

     기본적인 OS가 로드되어야 되는 것들에 대해 저장하는 파티션

5.   다시 트리거 될 수 있는 프로세스를 방지하기 위해 recovery.cmdlineruninstaller를 삭제


 Primary partition

Logical partition 

Type 

Label 

Contents 

 

FAT 

RECOVERY 

NOOBS bootfiles & initramfs, 

OS recovery images 

 

extended 

 

Any logical partitons 

 

ext4 

SETTINGS 

NOOBS settings 


§NOOBS OS installation
-OS를 설치하면 해당 OS에 맞게 파티션을 할당하여 boot 파티션과

 file system 파티션을 가지게 됨

- 자세한 내용은 https://github.com/raspberrypi/noobs/wiki/NOOBS-partitioning-explained 참고

*NOOBS의 경우 기본적으로 Raspbian 외에 

Arch, OpenELEC등 설치 가능




만약 Arch를 추가 설치할 경우 파티션이 할당되고 부팅 시 선택 가능

(표 삽입에 암걸릴거 같아서 사진으로 대체..)




'프로그래밍 > Raspberry' 카테고리의 다른 글

Raspberry pi2 (시스템 콜)  (0) 2015.08.13
Raspberry pi2 (크로스컴파일)  (0) 2015.08.13
Raspberry pi2 (config.txt 분석)  (0) 2015.08.13
Raspberry pi2 (라즈베리 기본 설정)  (0) 2015.08.13
Raspberry pi2 (Raspbian 설치)  (0) 2015.08.13

+ Recent posts