SMALL
임베디드 리눅스관련 공부를 위한 환경구성과 관련된 내용을 정리 함
0. 임베디드 리눅스의 구성 및 배경지식
와같이 구성되어 있고 이제 이러한 구성요소들이 어떻게 서로 연계[관련]되서 동작 하는지 알아봄
Cross Compiler
크로스 컴파일러일 경우, Host PC는 intel cpu이고 target board는 arm이라고 가정하자.
그러면 어떻게 이 파일들을 빌드 할 것인가?
마치 이 내용은 영어로된 내용을 한글만 아는 사람한테 번역해서 결과물을 내라고 하는 것이다.
이 때 사용하는 것이 크로스 컴파일러이다.
둘의 환경이 다르기 때문에 각 언어에 맞는 사람을 고용해야 하는 것이다.
Boot loader
부트로더의 종류는 수십가지가 있고 대표적으로 u-boot가 있다. 해당 u-boot를 분석도 해보았지만 환경에 맞게 정확히 부트로더를 만드느것은 어렵드라.
그리고 부트로더의 가장 중요한 역할, 즉 주요 목적은 운영체제[kerenl]을 부팅하는 것이다. 기타 하드웨어 초기화 및 디바이스 셋팅도 있지만.
운영체제를 부팅하는 것이 주 목적이라고 하는데 이를 메모리 몇번지에 올리고 코드 데이터 cpu 등 정보를 셋팅 한다.
1. Host PC와 Target Board
위와 같이 연결이 필요하다.
여기서 기억하고 넘어갈 내용은 Host PC에서는 단지 빌드[컴파일]만 진행하고 동작은 Target Board에서 진행되는 것임
이 둘 사이의 인터페이스를 통한 연결을 어떻게 진행할 것인가? 에 대한 질문은 3가지 정도로 요약됨
1-1 UART
RS-232와 같은 UART 시리얼 통신
1-2 TFTP
tftp 파일 시스템을 이용한 통신
--> tftp의 경우 동작 layer?는 bootloader 에서 동작한다. 즉 부트로더가 존재하면 tftp를 사용할 수 있다는 것임
1-3 NFS
NFS[Network File System] 네트워크 파일 시스템을 이용한 연결
--> 해당 파일시스템에서 동작한다.
위 3가지 내용을 연결하고 관련 내용을 정리하려고 함.
2. 타겟 보드 확인 정보
UART와 같은 디버깅 포트를 이용해서 부팅하면 확인해야 할 내용을 정리 함.
UART 해킹과 비슷한 원리로 진행되는데... 개발 단계에서 보느냐, 공격자의 입장에서 보느냐의 차이점만 존재하는것 같다.
먼저 shell이 뜰 경우 "help" 명령어를 사용해서 어떠한 명령어를 제공하는지 알아본다.
board에 연결하고 내용을 확인하기 위해서 "printenv" 를 확인 해본다.
그러면 환경을 구성하고 개발하는데 필요한 정보들이 매우 잘 나온다.
bootdelay = 3 는 부팅하고 몇초를 기다리는지 나타냄
ipaddr = board의 IP
serverip = pc의 IP
bootcmd 는 임베디드 리눅스 시스템이 부팅될 때 자동으로 실행할 커맨드 임
해당 내용을 보고 커널은 어디에 적재되고 램 메모리는 어디에 풀리는지 등 관련 내용을 확인 한다.
보드에서 고정적인 내용은 아님으로 개발자가 컨트롤할 수 있기 때문에 이러한 내용을 확인 하자.
bootargs : bootloader를 부팅할 때 어떠한 인자를 주어서 부팅되는지를 확인하는 인자
bootargs=root=/dev/ram0 --> root filesystem이고 /dev/ram0에 있다.
initrd : ramdisk의 압축이 풀리는 주소
zImage : 커널의 압축이 풀리는 주소
tip
bootcmd 의 ramdisk와 initrd는 같은 주소에 올라가야 함.
bootm은 실제 부팅할 위치 bootm과 zImage의 주소와 같아야 함.
3. 환경 구성 및 커널 컴파일
3-1 TFTP 서버 구축
TFTP 서버를 데몬으로 등록
$apt-get install nfs-kernel-server tftpd xinetd
$vim /etc/xinetd.d/tftpd
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | service tftp { protocol = udp port = 69 socket_type = dgram wait = yes user = nobdoy server = /usr/sbin/in.tftpd server_args = /tftpboot #저장 장소 disable = no } | cs |
$/etc/init.d/xinetd restart
$netstat -au tftp 확인하기
3-2, Network 설정
Board 와 PC 랜선 연결 함 [사진 첨부 필요]
VMware Bridge 설정 함 [반드시!!]
아까 boot 메시지를 통해서 확인한 IP로 설정 함.
$ifconfig eth0 192.168.100.2 up
어뎁터 설정 변경 ->
과 같이 설정 함
이렇게 진행하면 이제 보드와 PC가 통신이 가능하다.
3-3, 연결한 tftp를 이용해서 다운로드
bootargs에 맞춰서 알맞은 주소에 파일들을 다운로드 한다.
pc에서 tftp서버의 디렉토리를 /tftpboot로 설정했기에 해당 위치에 파일을 넣고 보드에서 파일을 다운로드 받게 하면 된다.
와 같이 커널과 파일 시스템들을 올려주면 된다.
그리고 $bootm 20008000[커널 주소] 명령어르 내리게 되면 부팅이 된다.
3-3, 크로스 컴파일러 다운[컴파일] 및 환경변수 등록
타겟 보드에 맞는 CPU 버전의 크로스 컴파일러를 다운 받는다. [크로스 컴파일러 컴파일 확인 자료 추가]
환경변수는 다양한 방법으로 등록 하기.
export PATH=$PATH:`pwd` [pwd는 arm compiler 가 존재하는 위치]
/etc/bash.rc 에 export ARM_COMPILER="위치"
3-4, 커널 컴파일 하기
커널 컴파일 [http://richong.tistory.com/178]
menuconfig 하면 . config 파일이 생성되고 이를 통해서 커널이 컴파일 된다.
그리고 CROSS 컴파일러에 맞게 Makefile을 수정해줄 필요도 존재.
위와 같이 컴파일러가 맞지 않으면 저런 애러가 난다.
그렇기 때문에 관련 부분에서 Makefile 을 수정 한다. [사진 추가]
nfs 파일 시스템 셋팅
-PC 설정 [NFS 서버의 공유 목록을 관리하는 파일은 /etc/exports 파일]
/etc/exports 파일
/tftpboot *(rw,no_root_squash,no_all_squash,async)
/etc/init.d/nfs-kernel-server restart
와 같이 설정해주고 다시 서버를 설정 해준다.
- Board 설정
mkdir /mnt/nfs
ifconfig eth0 192.168.100.5 up
mount -t nfs -o nolock,rsize=1024,wsize=1024 192.168.100.2:/tftpboot /mnt/nfs
위와 같이 설정해주면 이제 target 과 board와 파일 시스템을 가지고 올수 있다.
다음과 같이 연결된 것을 볼 수 있다.
LIST
'학부_대학원 > 임베디드 리눅스' 카테고리의 다른 글
Platform Device Driver Built In[플랫폼 디바이스 드라이버 빌트인] (0) | 2017.07.13 |
---|---|
(임베디드)리눅스 커널 모듈 - User, Kernel 통신 (0) | 2017.07.13 |
Mango Board 정리 (0) | 2017.07.12 |
(임베디드)리눅스 커널 모듈 - Character Device Driver (0) | 2017.07.12 |
(임베디드)리눅스 커널 모듈 빌트 인[Built in] (0) | 2017.07.12 |