임베디드시스템설계실습 (3) Embedded System Design Real-Time Computing and Communications Lab. Hanyang University
자료복사 USB 파일복사 파일및폴더리스트 PL2303_Prolific_DriverInstaller (Windows) toolchain-s5pc1xx.tar.gz u-boot-1.3.4.tar.gz vpos.bin vpos.zip 2 2
USB to Serial Driver 설치 USB to Serial Driver 설치 Windows 의경우 PL2303_Prolific_DriverInstaller_v1.10.0 을실행하여설치 MAC OS 의경우 PL-2303 Mac driver 검색 다운로드및설치 설치후재부팅 3 3
목차 1. U-Boot 소개 2. TFTP, ARM Cross compiler 설치 3. U-Boot 포팅 4. VPOS 부팅 5. 소스코드디렉토리및파일구조 6. 커널포팅준비 4 4
U-BOOT 소개 5 5
부트로더 (Bootloader) 란? 부트로더 시스템하드웨어를초기화 메모리에 OS 이미지를적재시키고 OS 시작루틴으로분기 시스템에전원이공급되면가장먼저실행되는프로그램 부트로더의위치 일반적으로시스템메모리의물리주소 0 번지부터위치 롬, 플래시롬, SRAM 등정적인메모리에위치 부트로더의기능 메모리초기화 하드웨어초기화 6 6
U-Boot 란? U-Boot Universal Bootloader PowerPC와 ARM에기반을둔임베디드보드를위한부트로더 임베디드보드에서리눅스의부트로더로많이사용 장점 다양한플랫폼에포팅가능 (ARM, MIPS, x86 등 ) 코드가깔끔하고구조가좋음 쉬운환경설정 7 7
NAND Flash 에서 U-boot 와커널의위치 SYS-LAB II 보드의 NAND Flash Address Map 8 8
mddr 에서 U-boot 와커널의위치 mddr 이란? Double Data rate synchronous DRAM for mobile computers 기존 DDR SDRAM보다전력소모가적음 U-boot Physical address : 0x27e00000 Virtual address : 0xc7e00000 Kernel Physical address : 0x20008000 Virtual address : 0xc0008000 9 9
TFTP, ARM CROSS COMPILER 설치 10 10
설정 공유폴더 공유폴더설정 (VirtualBox) 11 11
공유폴더설정 (VirtualBox) 1. 폴더경로 : 기타 선택 2. c드라이브의 syslab 폴더선택 3. 자동마운트에체크 12 12
공유폴더확인 (VirtualBox) Virtual Linux 에서공유할폴더생성 >> mkdir /home/hanyang/syslab >> mount t vboxsf syslab /home/hanyang/syslab mount t vboxsf [ 윈도우폴더 ] [ 리눅스폴더 ] 공유폴더확인 >> ls /home/hanyang/syslab 13 13
자동으로마운트하기 >> vi.bashrc 공유폴더확인 (VirtualBox) 문서마지막줄에 su mount t vboxsf syslab/ /home/hanyang/syslab 추가 14 14
공유폴더설정 (VMware) 1. Edit virtual machine settings 클릭 2. Option 탭에서 Shared Folders 를클릭 15 15
공유폴더설정 (VMware) 1. Always enabled 를선택 2. Add 버튼을클릭하고 Browse 에서 syslab 폴더선택 16 16
공유폴더확인 (VMware) 공유폴더위치 : /mnt/hgfs/[ 공유폴더 ] >> ls /mnt/hgfs/syslab 17 17
>> apt-get update 업데이트파일받아오기 18 18
리눅스기반개발환경설치및설정 Package 설치 >> apt-get install nfs-kernel-server tftp tftpd xinetd 19 19
리눅스기반개발환경설치및설정 >> apt-get install libncurses5 libncurses5-dev build-essential >> apt-get install gcc-multilib 20 20
TFTP 란? TFTP Trivial File Transfer Protocol FTP처럼파일을전송하기위한프로토콜 FTP보다더단순한방식으로전송 임베디드시스템에서운영체제업로드로주로사용됨 + 구현이간단 - 데이터전송중데이터가손실될수있음 21 21
TFTP 설정 tftpboot 폴더만들기 >> mkdir /tftpboot tftpboot 폴더권한설정 >> chmod 777 /tftpboot TFTP 설정 22 22
TFTP 환경설정 >> gedit /etc/xinetd.d/tftpd 아래그림과같이작성후저장 TFTP 설정 23 23
Xinetd 재실행 >> /etc/init.d/xinetd restart TFTP 설정 24 24
크로스컴파일러 (Cross Compiler) 크로스컴파일러의필요성 Hello world x86 Compile x86 ARM 25 25
크로스컴파일러 (Cross Compiler) 크로스컴파일러의필요성 통상의컴퓨터 (x86) 에서는컴파일과실행을동일한기계 (x86) 로함 임베디드시스템 (ARM) 에서는컴파일을호스트컴퓨터 (x86) 에서함 일반적인컴파일러를쓸경우 x86 의기계어로번역되어 ARM 에서실행할수없음 크로스컴파일러란? 프로그램을컴파일러가수행되고있는컴퓨터의기계어로번역하는것이아니라, 다른기종에맞는기계어로번역하는컴파일 Toolchain 원하는임베디드시스템의소프트웨어개발을하기위한호스트컴퓨터의컴파일환경 크로스컴파일러포함 26 26
ToolChain 설치 제공받은 ToolChain 복사 >> cd /opt ToolChain 설치 >> cp /home/hanyang/syslab/toolchain/*. (VirtualBox) >> cp /mnt/hgfs/syslab/toolchain/*. (Vmware) 압축풀기 >> tar zxvf toolchain-s5pc1xx.tar.gz 27 27
ToolChain 설치 크로스컴파일러환경변수설정 >> gedit /etc/profile PATH=$PATH:$HOME/bin:/opt/s5pc1xx/cross/armv7a/bin 를추가 28 28
수정된사항을적용 >> source /etc/profile ToolChain 설치 크로스컴파일러가적용이되었는지확인 쉘에 arm 을입력하고 Tap 키를 2 번누름 29 29
U-BOOT 포팅 30 30
U-boot 컴파일 U-boot 파일을복사후압축풀기 >> cp /home/hanyang/syslab/bootloader_kernel_source/u-boot- 1.3.4.tar.gz /home/hanyang/ (VirtualBox) >> cp /mnt/hgfs/syslab/bootloader_kernel_source/u-boot- 1.3.4.tar.gz /home/hanyang/ (VMware) >> cd /home/hanyang >> tar zxvf u-boot-1.3.4.tar.gz 31 31
U-boot 컴파일 U-boot 가제대로설치되었는지확인하기위해코드를수정 >> gedit /home/hanyang/u-boot-1.3.4/include/configs/smdkc100.h 229 번째줄 CFG_PROMPT 의문자열을수정 # define CFG_PROMPT SL2_C100 # HANYANG # 32 32
Makefile 확인 U-boot 컴파일 >> gedit /home/hanyang/u-boot-1.3.4/makefile 144번째줄 #CROSS_COMPILE = arm-linux- 를주석처리 [arm-s5pc1xx-linux-gnueabi- 크로스컴파일러사용 ] 33 33
U-boot make U-boot 컴파일 >> cd /home/hanyang/u-boot-1.3.4 >> source /etc/profile >> make clean >> make clobber >> make smdkc100_config >> make U-boot.bin 파일이생성되었는지확인 >> ls l u-boot.bin 34 34
U-boot 컴파일 u-boot.bin 을 /tftpboot 폴더로복사 >> cp /home/hanyang/u-boot-1.3.4/u-boot.bin /tftpboot u-boot.bin 파일이복사되었는지확인 >> ls l /tftpboot 35 35
Network 설정 Network 설정 리눅스 IP 설정 시스템 기본설정 네트워크연결 유선탭에서추가를클릭 36 36
Auto eth1 편집 Network 설정 IPv4 설정 방식 : 수동 주소 : 166.104.146.5 넷마스크 : 255.255.255.0 게이트웨이 : 166.104.146.1 적용버튼클릭 37 37
Network 설정 Virtual machine 의네트워크설정 (Virtual Box) 리눅스종료 설정 네트워크 브리지어댑터를선택 38 38
Network 설정 Virtual machine 의네트워크설정 (VMware) 리눅스종료 Hardware 탭 Network Adapter Bridged에체크 39 39
보드연결 시리얼케이블을 pc에연결 랜선을 pc에연결 Network 연결 40 40
Network 연결 리눅스재실행후네트워크를 Auto eth1 로연결 41 41
시리얼케이블연결 장치 USB 장치 (Virtual Box) Prolific Technology Inc. USB-Serial Controller 클릭 ( 체크 ) 42 42
시리얼케이블연결 Player Removable Devices (VMware) Prolific USB-Serial Controller Connect 클릭 43 43
보드가연결되었는지확인 >> ls /dev/tty + Tap 2 번 시리얼케이블연결 44 44
Minicom 미니컴설정 ( 반드시 root 계정으로 ) >> minicom -s Serial port setup 에서 Serial Device 와 Hardware Flow Control 을아래와같이바꾼다 ( 키보드 a 키와 f 키를누르면해당항목으로이동 ) 45 45
미니컴설정 Minicom Save setup as dfl 로미니컴설정을저장 미니컴으로보드에접속 (1) >> minicom (2) >> minicom s 후 Exit 46 46
U-boot 포팅 보드에전원을키고 Enter 키를누름 아래와같은화면이나오면보드에접속성공 화면이안뜨면리셋버튼을눌러리셋 47 47
네트워크환경설정 U-boot 포팅 아래 U-boot 명령으로호스트 PC 의 IP 와타겟보드의 IP 를설정한다 # setenv ipaddr 166.104.146.10 : 타겟보드 IP 주소저장 # setenv serverip 166.104.146.5 : 리눅스 IP 주소 # setenv gatewayip 166.104.146.1 : 게이트웨이주소 # setenv netmask 255.255.255.0 : 넷마스크주소 환경설정저장 # saveenv 48 48
U-boot 포팅 TFTP 를이용하여 u-boot write Network 를이용하여 tftp 로 u-boot 를 nand 에 write # tftp c0008000 u-boot.bin # nand erase 0 60000 # nand write c0008000 0 40000 Load, Erase, Write 연산이제대로됐는지반드시확인할것!! 49 49
U-boot 포팅 보드리셋후 Enter 키를누름 HANYANG # 으로변경되었는지확인 U-boot write 완료 50 50
VPOS 부팅 51 51
이미지파일다운로드 vpos 부팅준비 Courses - Embedded System Design Lab Schedule and Materials vpos.bin 파일다운로드 윈도우공유폴더 (C:\syslab) 에 vpos.bin 복사 공유폴더에서 /tftpboot 파일로복사 리눅스공유폴더에서 /tftpboot로 vpos.bin 복사 >> cp /home/hanyang/syslab/vpos.bin /tftpboot (VirtualBox) >> cp /mnt/hgfs/syslab/vpos.bin /tftpboot (VMware) 52 52
미니컴으로보드에접속 (1) >> minicom (2) >> minicom s 후 Exit Minicom 53 53
VPOS 커널다운로드 (NAND 미사용 ) 본실습수업에서는 NAND 에저장하지않고 SDRAM 에직접 write TFTP 를이용하여 kernel write Network를이용하여 tftp로 vpos kernel을 SDRAM에 write # setenv bootcmd tftp c0008000 vpos.bin\;bootm c0008000 # saveenv 부팅명령어 # boot 54 54
VPOS 커널다운로드 (NAND 사용 ) TFTP 를이용하여 kernel write Network 를이용하여 tftp 로 vpos kernel 을 nand 에 write # tftp c0008000 vpos.bin # nand erase 80000 400000 # nand write c0008000 80000 400000 # setenv bootcmd nand read c0008000 80000 300000\;bootm c0008000 # saveenv 부팅명령어 # boot 55 55
VPOS 부팅 VPOS 부팅화면 56 56
VPOS 의스레드 VPOS 에서스레드실행 Shell 에명령어를입력하면 shell 은명령어를해석 해당명령어처리루틴을 thread 로생성 Ready 큐에적재시키고스케줄러를호출해 thread 실행 VPOS 의명령어 ls : 명령어목록을보여줌 help : 명령어목록을보여줌 debug : Debug 용명령어 temp : 스레드 2 개로 context switching 실험 thread : 스레드 2 개로 context switching 실험 ( 무한루프 ) 명령어를하나씩입력하여 UART, TIMER, INTERRUPT 가제대로동작하는지확인하세요 57 57
소스코드디렉토리및파일구조 58 58
소스코드파일다운로드 VPOS 커널코드배포 Courses - Embedded System Design Lab Schedule and Materials vpos.zip파일다운로드 압축을풀고공유폴더로복사 59 59
소스코드디렉토리및파일 hal/cpu CPU Architecture 에의존적인코드를작성하고관리 HAL_arch_startup.S : 커널초기화소스코드파일 hal_swi_handler.c : 소프트웨어인터럽트핸들러소스코드파일 vpos_kernel-ld-script : 링커스크립트 hal/include CPU 와 I/O 관련레지스터들의주소나매크로를저장 vh_io_hal.h : I/O 관련레지스터주소나매크로를저장 hal/io I/O 관련코드를작성하고관리 serial.c : UART 관련소스코드파일 timer.c : TIMER 관련소스코드파일 led.c : LED 관련소스코드파일 60 60
소스코드디렉토리및파일 kernel 커널관련소스코드를작성하고관리하는디렉토리 exception_handler.c : exception 처리관련소스코드파일 kernel_start.c : 커널의 C 코드진입소스코드파일 machine_init.c : 필요한하드웨어를초기화하는소스코드파일 include 헤더파일을관리하는디렉토리 images 컴파일후실행이미지들이존재하는디렉토리 objs 컴파일후오브젝트파일이적재되는디렉토리 61 61
커널포팅준비 62 62
VPOS 커널을포팅하기위한준비 1. 커널컴파일 + 커널이미지를 RAM 에적재 2. STARTUP code 구현 3. UART 설정 4. TIMER 설정 5. Hardware Interrupt Handler 구현 (1) UART Interrupt (2) Timer Interrupt 6. Software Interrupt Entering/Leaving Routine 구현 63 63
커널이미지를 RAM 에적재 U-Boot 를통해커널이미지를 RAM 에적재 # setenv bootcmd tftp c0008000 vpos.bin\;bootm c0008000 명령어설명 tftp c0008000 vpos.bin TFTP 를통해 VPOS 커널이미지를 RAM 의 c0008000 번지에적재 bootm c0008000 c0008000 번지에저장된이미지로부팅 64 64
왜 c0008000 번지인가? mddr(sdram) 에서커널의위치 Physical address : 0x20008000 Virtual address : 0xc0008000 U-Boot 에서는 MMU 를사용하므로 virtual address 를사용하여메모리에접근 VPOS 커널에서는 MMU 를사용하지않으므로 physical address 를사용하여메모리에접근 65 65
ctags & cscope vpos/ 폴더에서 ctags 와 cscope 설정 ctags 소스코드분석 >> ctags R 사용법 cscope 함수가정의된파일로이동 Ctrl + ] 이전위치로이동 Ctrl + t 설정방법 >> find./ -name *.[chs] -print > cscope.files >> cscope -i cscope.files 사용법 cscope 실행 >> cscope cscope 종료 Ctrl + D 66 66
Makefile 확인 Makefile 에서 Cross Compiler 설정 디렉토리 : vpos/ >> vi Makefile 67 67
Linker Script 수정 Linker Script 수정 >> vi hal/cpu/vpos_kernel-ld-script SECTIONS 첫줄을. = 0x20008000; 로변경 68 68
Linker Script 란? Linker Script 링커는오브젝트파일을조합하여하나의실행파일을만듦 Linker Script는링킹과정에서링커의동작을제어 Linker Script 분석 OUTPUT_FORMAT( elf32-littlearm, ) ELF32의 little endian으로코드를생성 OUTPUT_ARCH(arm) Binary를실행할수있는 CPU architectur로 ARM을지정 ENTRY(vh_VPOS_STARTUP) 프로그램의시작을가리킴 SECTION {} 출력파일의메모리레이아웃을설명 69 69
Linker Script 분석 Linker Script SECTION {} 프로그램의각섹션을정의 프로그램의전체영역과각섹션이어디에저장될지를결정 각섹션이저장될위치를가리키는위치카운터를지정 특별심볼. 을사용 출력섹션의주소를표시 ex). = 0x20008000; 70 70
objdump 실행파일분석하기 실행파일에대한정보를출력하는리눅스명령어 옵션으로 h 를사용하면실행파일의섹션헤더에서요약된정보를출력 >> cd images >> objdump h vpos_kernel-elf32 71 71
Shell Script 커널컴파일후이미지를 /tftpboot 로복사 1. make clean 2. make 3. cp images/vpos.bin /tftpboot Shell Script 만들기 >> vi rr.sh 아래와같이입력후저장 72 72
커널컴파일 Shell Script 를실행하여자동으로컴파일후 /tftpboot 로복사 >>./rr.sh U-Boot 를통해커널을 RAM 에적재하고부팅 73 73
보고서 보고서제출 학과, 학번, 이름 부트로더, 크로스컴파일에대해조사하고 A4 1장내외로정리 수정한 U-boot 실행화면및 VPOS 부팅화면도첨부 74 74
제출방법 제출방법 워드나한글로작성하여메일에첨부 문서제목에학번과이름을적을것 E-mail jypark@rtcc.hanyang.ac.kr 메일제목 [ 임베디드시스템실습과제 2] 학번 _ 이름 마감일 다음실습수업시간전까지 75 75
수고하셨습니다. 76 76