임베디드리눅스개발환경실습 Jo, Heeseung
타겟보드모니터링동작실습 호스트 PC 에서시리얼포트를통해서타겟보드를모니터링 타겟보드가프로그램을실행하는동안일어나는일을시리얼포트로메시지를출력하면호스트 PC 에서는시리얼포트를통해메시지를수신하여이를화면에출력 minicom 프로그램사용 - minicom 이정상적으로설정이되고, 타겟보드에최소한부트로더가올라간상태라면 minicom 실행화면에부트로더메시지가출력 3
타겟보드모니터링동작실습 부트로더의커맨드모드실행 타겟보드정보를출력 리눅스커널로넘어가기전에카운트 - 만약, 카운트가완료되기전에키보드입력을하게되면부트로더커맨드모드로전환 - 그렇지않으면, 리눅스커널로부팅 U-Boot 2010.03 (Oct 26 2011-17:48:41) for SM5S4210 Linux APLL = 1000MHz, MPLL = 800MHz PMIC: ARM 1.30V, INT 1.15V, G3D 1.10V Board: sm5s4210 POP type: POP_B DRAM: 1 GB OneNAND: 0 kb MMC: This CLOCK is Not Support: 0 7580 MB *** Warning - using default environment In: serial Out: serial Err: serial 1 Checking Boot Mode... SDMMC board_late_init Hit any key to stop autoboot: 0 SM5S4210 # 2 4
타겟보드모니터링동작실습 리눅스로부팅하기 리눅 SM5S4210 login: - root 를입력한후에 Enter 키 5
크로스컴파일러사용 크로스컴파일러사용실습 hello.c 코드작성 - 디렉터리로이동한후에 hello.c 파일을생성하여코드작성 root@ubuntu:# mkdir /working root@ubuntu:# cd /working root@ubuntu:/working# vi hello.c --------------------- 다음과같이수정한다 --------------- 001: #include <stdio.h> 002: int main(void){ 003: int i; 004: for(i=0;i<5;i++) 005: printf( Number : %d Hello World!\n,i); 006: return 0; 007: } -------------------------- 저장하고종료한다 ----------------- root@ubuntu:/working# 6
크로스컴파일러사용 크로스컴파일러사용실습 ARM 용크로스컴파일러로컴파일하기 - hello.c 를크로스컴파일러 (arm-linux-gcc) 로컴파일하여 hello 라는실행파일을생성 root@ubuntu:/working# arm-linux-gcc -o hello-arm hello.c root@ubuntu:/working#./hello-arm ---------------- 다음과같은메시지가출력된다 ----------------- -bash:./hello-arm: cannot execute binary file - file 명령어로 hello 파일의종류확인!! root@ubuntu:/working# file hello-arm ------------------ 다음과같은메시지가출력된다 ----------------- hello-arm: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.16, not stripped 7
크로스컴파일러사용 크로스컴파일러사용실습 호스트 PC(i386) 용컴파일러로컴파일하기 - hello.c 를호스트용컴파일러 (gcc) 로컴파일하여 hello 라는실행파일을생성 root@ubuntu:/working# gcc -o hello-i386 hello.c root@ubuntu:/working#./hello-i386 ------------------ 다음과같은메시지가출력된다 ----------------- Number: 0 Hello World! Number: 1 Hello World! Number: 2 Hello World! Number: 3 Hello World! Number: 4 Hello World! root@ubuntu:/working# 8
크로스컴파일러사용 크로스컴파일러사용실습 file 명령어로 hello 파일의종류확인!! root@ubuntu:/working# file./hello-i386 -------------32bit ubuntu 의경우다음과같은메시지가출력된다 -------------- hello-i386: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped -------------64bit ubuntu 의경우다음과같은메시지가출력된다 ------------- hello-i386: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped 9
MODEM FILE TRANSFER
크로스컴파일러사용 타겟보드에서어플리케이션실행파일다운로드 타겟보드의리눅스로로그인 (root) 후 lrz 명령실행 11
크로스컴파일러사용 타겟보드에서어플리케이션실행파일다운로드 lrz 명령어를실행시키면데이터수신대기상태로전환 lrz 명령어는리눅스에서 X, Y, Z modem 프로토콜을통하여파일전송에사용되는명령어 [root@sm5s4210 ~]$ lrz 12
크로스컴파일러사용 타겟보드에서어플리케이션실행파일다운로드 수신대기상태에서 ctrl+a 키를누른후에곧바로 z 키를누르면 minicom 의 command 모드가실행 이상태에서 s 키를누르면전송프로토콜선택창이뜸 13
크로스컴파일러사용 타겟보드에서어플리케이션실행파일다운로드 전송프로토콜로 ymodem 선택 14
크로스컴파일러사용 타겟보드에서어플리케이션실행파일다운로드 전송할부트로더이미지파일을선택 ( 스페이스바 2 번으로선택 ) 파일전송이완료되면 "READY: press any key to continue..." 메시지가출력 엔터키를눌러전송모드를빠져나옴 15
크로스컴파일러사용 타겟보드에서어플리케이션실행파일다운로드 수신된파일 (hello-arm) 을확인하고실행 16
TRIVAL FILE TRANSPER PROTOCOL
이더넷을이용한다운로드실습 이더넷을이용하는방법 tftp, nfs, samba 등을이용하는방법 부트로더에서는 tftp 밖에는사용할수없음 tftp 를제외한 nfs 나 samba 등은호스트 PC 의파일들을공유디렉터리를통해서곧바로엑세스할수있음 18
호스트 PC 개발환경구축 네트워크설정 VMware 의네트워크설정을다음그림과같이 Bridged 로변경 19
호스트 PC 개발환경구축 IP 설정확인 Host pc 의 ip 확인 - Ex. 192.168.0.10 - cmd 창에서 ipconfig VM linux 의 ip 설정변경 - 192.168.0.11 - ping 으로확인후없는 ip 로설정 root@ubuntu:/> cat /etc/network/interfaces auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 192.168.0.11 netmask 255.255.255.0 gateway 192.168.0.1 dns-nameservers 8.8.8.8 HostPC (Windows) IP: 192.168.0.10 VM (Linux) IP: 192.168.0.11 Board (Linux) IP: 192.168.0.12 20
BOARD WIFI 설정 타겟보드의 network interface on 간단한 script 로만들어둘것 ifup.sh ifconfig wlan0 192.168.0.12 up iwconfig wlan0 essid "XXXX" chmod 755 ifup.sh HostPC (Windows) IP: 192.168.0.10 VM (Linux) IP: 192.168.0.11 Board (Linux) IP: 192.168.0.12 21
이더넷을이용한다운로드실습 TFTP Trival file transper protocol FTP와비슷하지만, 훨씬단순함 특정목적을위해서만사용됨 tftp server install apt install tftpd mkdir /tftpboot vi /etc/xinetd.d/tftp - '=' 앞뒤로빈칸이있어야함 /etc/init.d/xinetd restart service tftp { protocol = udp port = 69 socket_type = dgram wait = yes user = nobody server = /usr/sbin/in.tftpd server_args = /tftpboot disable = no } 22
이더넷을이용한다운로드실습 tftp 를이용한이미지다운로드실습 tftp 서버디렉터리 - 상기설정한 /tftpboot 디렉터리 - 본인 VM 에없다면생성 (mkdir /tftpboot) 리눅스에서애플리케이션실행파일다운로드 - 타겟보드리눅스로로그인한후에 ifconfig 명령어로 IP 를확인 [root@sm5s4210 ~]# ifconfig eth0 Link encap:ethernet HWaddr 00:0B:A8:03:13:01 inet addr:192.168.0.150 Bcast:192.168.0.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:7 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:1020 (1020.0 B) TX bytes:0 (0.0 B) Interrupt:75 Base address:0x1000 DMA chan:ff 23
이더넷을이용한다운로드실습 tftp 를이용한이미지다운로드실습 tftp 명령어를실행하여 hello-arm 실행파일을다운로드 -r 옵션은파일명, -g 옵션은 tftp 서버 IP 옵션 - hello-arm 파일은 VMWare Linux 의 /tftpboot 디렉터리에존재해야함 [root@sm5s4210 ~]# tftp -r hello-arm -g 192.168.0.100 using server '192.168.0.100:69', remotefile 'hello-arm', localfile 'hello-arm' sending 18 bytes 00 01 68 65 6c 6c 6f 2d 61 72 6d 00 6f 63 74 65 74 00 received 516 bytes: 0003 0001 sending 4 bytes 00 04 00 0c 25
이더넷을이용한다운로드실습 tftp 를이용한이미지다운로드실습 hello-arm 실행 [root@sm5s4210 ~]# ll -rw-r--r-- 1 root root 5807 Oct 20 18:48 hello-arm [root@sm5s4210 ~]# chmod 777 hello-arm [root@sm5s4210 ~]#./hello-arm Number : 0 Hello World! Number : 1 Hello World! Number : 2 Hello World! Number : 3 Hello World! Number : 4 Hello World! [root@sm5s4210 ~]# 26
NFS (NETWORK FILE SYSTEM)
NFS (NETWORK FILE SYSTEM) Created by Sun in 1985 Originally designed for diskless clients Version 2 is slow Write operation is not complete until receiving ACK from the server Version 3 permits async writes Faster Version 4 Supports strong security, ACLs, unicode filenames, replication and migration, etc. 28
NFS (NETWORK FILE SYSTEM) Uses RPC Remote Procedure Call - a system-independent way for process communication over a network Could be UDP and TCP Now, TCP is preferable 29
NFS (NETWORK FILE SYSTEM) 원격지의컴퓨터에있는파일을마치자신의컴퓨터에있는것처럼이용 임베디드시스템개발시가장편리한방법 /root /bin /lib /etc /bin /lib /sbin /root /bin /lib /sbin NFS Server /net /mm /kernel /driver /arch /exam Host File System NFS Client /mm /driver /exam 30
NFS (NETWORK FILE SYSTEM) NFS Client/Server 구성도 user process local file access NFS client NFS server local file access kernel client kernel TCP/UDP IP TCP/UDP IP UDP port 2049 server kernel local disk local disk 31
호스트 PC 개발환경구축 NFS 서버설치및설정확인 두가지패키지설치 - nfs-common - nfs-kernel-server apt 명령어사용 - apt -y install nfs-common nfs-kernel-server 32
호스트 PC 개발환경구축 NFS 서버설치및설정확인 mkdir /nfs_resource 로디렉토리생성 nfs 서버설정 root@ubuntu:~# vi /etc/exports # /etc/exports: the access control list for filesystems which may be exported # to NFS clients. See exports(5). # # Example for NFSv2 and NFSv3: # /srv/homes hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check) # # Example for NFSv4: # /srv/nfs4 gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check) # /srv/nfs4/homes gss/krb5i(rw,sync,no_subtree_check) # /nfs_resource *(rw,sync,no_root_squash,no_all_squash,no_subtree_check) 33
호스트 PC 개발환경구축 NFS 서버설치및설정확인 nfs 서비스를재시작 root@ubuntu:~# /etc/init.d/nfs-kernel-server restart * Stopping NFS kernel daemon [ OK ] * Unexporting directories for NFS kernel daemon...[ OK ] * Exporting directories for NFS kernel daemon...[ OK ] * Starting NFS kernel daemon [ OK ] 34
호스트 PC 개발환경구축 네트워크설정 VMware 의네트워크설정을다음그림과같이 Bridged 로변경 35
호스트 PC 개발환경구축 IP 설정확인 Host pc 의 ip 확인 - Ex. 192.168.0.10 - cmd 창에서 ipconfig VM linux 의 ip 설정변경 - 192.168.0.11 - ping 으로확인후없는 ip 로설정 nfs 로 mount 되는지확인 - mount 192.168.0.11:/nfs_resource /mnt - ls -afl /mnt - umount /mnt root@ubuntu:/> cat /etc/network/interfaces auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 192.168.0.11 netmask 255.255.255.0 gateway 192.168.0.1 dns-nameservers 8.8.8.8 HostPC (Windows) IP: 192.168.0.10 VM (Linux) IP: 192.168.0.11 타겟보드의 network interface on Board (Linux) IP: 192.168.0.12 37
BOARD WIFI 설정 타겟보드의 network interface on 간단한 script 로만들어둘것 ifup.sh ifconfig wlan0 192.168.0.12 up iwconfig wlan0 essid "XXXX" chmod 755 ifup.sh HostPC (Windows) IP: 192.168.0.10 VM (Linux) IP: 192.168.0.11 Board (Linux) IP: 192.168.0.12 nfsmount.sh mount -t nfs 192.168.0.11:/nfs_resource /mnt/nfs -o nolock,rsize=8192,wsize=8192,tcp chmod 755 nfsmount.sh 38
호스트 PC 개발환경구축 특정 IP 가사용되고있는지확인 apt -y install nmap nmap 192.168.0.12 아래예는사용되지않는경우 root@ubuntu:/> nmap 192.168.0.12 Starting Nmap 6.40 ( http://nmap.org ) at 2015-03-30 18:15 KST Note: Host seems down. If it is really up, but blocking our ping probes, try - Pn Nmap done: 1 IP address (0 hosts up) scanned in 3.09 seconds 40
호스트 PC 개발환경구축 특정서비스데몬이동작하고있는지확인 ps -ef grep XXX root@ubuntu:/> ps -ef grep nfs root 664 2 0 08:00? 00:00:00 [nfsiod] root 3818 2 0 18:17? 00:00:00 [nfsd4] root 3819 2 0 18:17? 00:00:00 [nfsd4_callbacks] root 3823 2 0 18:17? 00:00:00 [nfsd] root 3824 2 0 18:17? 00:00:00 [nfsd] root 3825 2 0 18:17? 00:00:00 [nfsd] root 3826 2 0 18:17? 00:00:00 [nfsd] root 3827 2 0 18:17? 00:00:00 [nfsd] root 3828 2 0 18:17? 00:00:00 [nfsd] root 3829 2 0 18:17? 00:00:00 [nfsd] root 3830 2 0 18:17? 00:00:00 [nfsd] root 3840 3713 0 18:17 pts/0 00:00:00 grep -i --color=auto nfs 41
호스트 PC 개발환경구축 특정네트워크포트가열려있는지확인 netstat -na grep 3306 root@ubuntu:/> netstat -na grep 3306 tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 896/mysqld 42
호스트 PC 개발환경구축 NFS 서버설치및설정확인 타겟보드에서 nfs 접속 [root@sm5s4210 ~]$ mount -t nfs 192.168.0.11:/nfs_resource /mnt/nfs -o nolock,rsize=8192,wsize=8192,tcp [root@sm5s4210 ~]$ mount ------------------------< 출력내용 >------------------------------- rootfs on / type rootfs (rw) /dev/root on / type yaffs2 (rw) /proc on /proc type proc (rw) /sys on /sys type sysfs (rw) /sys on /sysfs type sysfs (rw) none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw) 192.168.0.11:/nfs_resource on /mnt/nfs type nfs (rw,vers=2,rsize=8192,wsize=8192,namlen=255,hard,nointr,nolock,proto=tcp,timeo=70,retr ans=3,sec=sys,addr=192.168.0.100) ---------------------------------------------------------------- 43
실습 기존에 cross compiler 로 build 한 getprime 프로그램을 nfs 로실행 [linux] cp getprime /nfs_resource [board] cd /mnt/nfs [board]./getprime 44