430 likes | 943 Views
프로젝트랩 6 장 . 부트로더와 커널 이미지. 수원과학대학 정보통신과. 1. 부트로더의 개요. 부트스트랩 로더 (bootstrap loader) 의 준말로 컴퓨터를 사용자가 사용할 수 있도록 디스크나 플래시에 저장된 운영체제를 읽어 주기억장치에 적재해주는 프로그램 부트로더의 종류 LILO(LInux LOader) – 예전 Linux GRUB(GRand Unified Boot loader) – 요즘 Linux NTLDR(NT LoaDeR) – Windows 계열 BOOTX – 매킨토시
E N D
프로젝트랩6장. 부트로더와 커널 이미지 수원과학대학 정보통신과
1. 부트로더의 개요 • 부트스트랩 로더(bootstrap loader)의 준말로 컴퓨터를 사용자가 사용할 수 있도록 디스크나 플래시에 저장된 운영체제를 읽어 주기억장치에 적재해주는 프로그램 • 부트로더의 종류 • LILO(LInux LOader) – 예전 Linux • GRUB(GRand Unified Boot loader) – 요즘 Linux • NTLDR(NT LoaDeR) – Windows 계열 • BOOTX – 매킨토시 • ARMBOOT – ARM과 StrongARM을 위한 공개 소스 부트로더 • BLOB(Boot Loader OBject) – StrongARM용 • BOOTLDR – (주)컴팩에서 만든 StrongARM을 사용하는 PDA • PPCBOOT – MPC 계열의 CPU와 타겟 시스템 • REDBOOT – 레드햇의 임베디드 OS인 eCOS의 일부를 이용 • U-BOOT(Universal BOOTloader) – PPCBOOT와 ARMBOOT를 통합 수원과학대학 정보통신과
부트로더의 기능 • 타겟 시스템을 위한 스타트업, 로더, 링커 기능 • 기본적인 시스템 진단 기능 • 모니터 기능 • 직렬 통신을 사용한 프로그램 적재 기능 • 네트워크를 통해 이미지 전송 • 메모리 내용 표시 및 수정 명령어를 제공 • 간단한 플래시 파일시스템 수원과학대학 정보통신과
2. 타겟 시스템의 부트 로더 분석 • 타겟 시스템에서 사용하는 부트로더는 BLOB를 수정 및 보완한 (주)하이버스의 BBOOT 버전 1.0.1 • 타겟 시스템의 플래시 메모리에 상주 • 운영체제 부팅 • 직렬 통신 혹은 이더넷을 통해 타겟 시스템에 접근 • 모니터 기능도 제공 • 콘솔을 통한 CLI(Command Line Interface)를 제공 • 이더넷을 통해 타겟 시스템에 접근 및 제어 가능 수원과학대학 정보통신과
X-HYPER270-TKU의 부트로더 흐름도 수원과학대학 정보통신과
부트로더 소스 해부 [1] • 부트로더 소스 • 어셈블리 코드 파일: 3개 • C 프로그램: 21개 • 기타: 스크립트 파일, Makefile, 헤더 파일 수원과학대학 정보통신과
부트로더 소스 해부 [2] • main.c • <bootloader>/bboot-1.0.1/src/main.c 수원과학대학 정보통신과
BBOOT 명령어 [1] 수원과학대학 정보통신과
BBOOT 명령어 [2] 수원과학대학 정보통신과
실습 6-1 부트로더 명령어 실습 • 미니컴을 이용해 타겟 시스템에 접속 • 타겟 시스템에 전원을 인가한 후 즉시 임의의 키를 입력해 수동 부팅 • help 명령, ping 명령 등 실행 ① ②
실습 6-2 부트로더 명령어로 디바이스 제어 • 타겟 시스템 수동으로 부팅 • 부트로더 명령어 write를 이용해 LED, FND, DOT 매트릭스 디바이스의 변화 관찰 ① ② ③
3. 부트로더 생성 • 부트로더를 생성하려면 툴체인이 설치되어 있어야 함 • 생성된 부트로더는 jflashmm이나 이미 설치된 부트로더의 부트 명령을 이용해 타겟 시스템에 있는 플래시 메모리에 퓨징 • BBOOT 소스 코드와 make를 이용해 부트로더 이미지를 생성 수원과학대학 정보통신과
① ② ③ ① ② ③ ④ ⑤ ⑥ 실습 6-3 부트로더 이미지 생성[1] • 가상머신 디렉토리에 있는 내용을 다른 디렉토리로 복사 • 복사된 디렉토리로 이동해 부트로더 파일의 압축을 풀고 Make 유틸리티로 컴파일
실습 6-3 부트로더 이미지 생성[2] • 에디터를 사용해 Makefile을 내용 중에서 /opt/iwmmxt-1.0.0을 /usr/local/hybus/toolchain으로 수정 • Make 유틸리티로 새로운 부트로더 이미지를 생성
실습 6-3 부트로더 이미지 생성[3] • 생성된 부트로더 이미지를 확인 후 플래시에 퓨징 • jtag 케이블 연결 • PC의 병렬 포트와 타겟보드의 LPT와 연결 • 부트로더 퓨징 • /usr/local/hybus/jtag/jflashmm pxa27x32.dat boot 부트로더 이미지(boot)를 cpu와 flash 메모리에 대한 정보가 보관된 pxa27x32.dat을 이용해서 퓨징시키고 있다. 수원과학대학 정보통신과
추가 실습 #1 • 자동 부팅을 위한 임의의 키 대기 시간이 현재 2초로 맞추어져 있다. 이 시간을 5초로 늘려 보자. • 힌트: main.c 수정 수원과학대학 정보통신과
4. 커널 빌드 과정 - 리눅스 커널을 빌드하는 일반적인 순서 - • 커널 환경 설정 유틸리티 • 텍스트 기반의 make config • 텍스트 메뉴 기반의 make menuconfig • X 윈도우 기반의 make xconfig 수원과학대학 정보통신과
커널환경설정 <linux>/arch/arm/Kconfig 수원과학대학 정보통신과
Kconfig 문법 구조 [1] 수원과학대학 정보통신과
Kconfig 문법 구조 [2] 수원과학대학 정보통신과
Kconfig 문법 구조 [3] 수원과학대학 정보통신과
Kconfig 옵션 [1] 수원과학대학 정보통신과
Kconfig 옵션 [2] • 문자 디바이스에 관한 설정 파일 예 • <linux>/drivers/char/Kconfig 수원과학대학 정보통신과
Kconfig 옵션 [3] • 문자 디바이스에 관한 설정 화면 수원과학대학 정보통신과
Makefile 문법 규칙 [1] • 커널 컴파일 옵션에 설정된 컴파일 조건 변수에 의해 특정 소스를 컴파일해 커널에 포함시킬 것인지 여부를 결정 • 최상위 Makefile은 <linux>/Makefile를 의미 • 커널 설정을 완료하면 생성되는 커널 설정 파일인 .config를 사용 • 최종 결과물인 커널 이미지와 모듈을 생성하기 위해 하위 디렉토리에 있는 Makefile을 재귀적으로 찾아가면서 사용 수원과학대학 정보통신과
Makefile 문법 규칙 [2] 수원과학대학 정보통신과
Makefile 문법 규칙 [3] 수원과학대학 정보통신과
Makefile 문법 규칙 [4] • 문자 디바이스 생성을 위한 Makefile 수원과학대학 정보통신과
커널 포팅 [1] • 커널 포팅(kernel porting): 커널 소스를 타겟 시스템에 적합하게 프로그래밍 및 컴파일해 생성된 커널 이미지를 타겟 시스템에 적재하는 과정 • 커널 소스의 패치 • 파일 준비 • 커널 소스 파일(linux-2.6.11.1.tar.gz) • PXA270용 패치 파일(linux-2.6.11-pxa.diff.gz) • X-HYPER270-TKU용 패치 파일(linux-2.6.11-pxa-270tku.diff.gz) • 차례대로 패치 적용 # tar zxvf linux-2.6.11.1.tar.gz # cd linux-2.6.11.1 # zcat ../ linux-2.6.11-pxa.diff.gz | patch –p1 # zcat ../ linux-2.6.11-pxa-270tku.diff.gz | patch –p1 수원과학대학 정보통신과
커널 포팅 [2] • 커널 환경 설정 • 타겟 시스템의 하드웨어 특성(프로세서, 메모리 등)뿐만 아니라 파일시스템 등에 대해 정확하게 파악하고 있어야 함 • 환경 설정에서 중요한 항목 몇 가지 • 커널 소스의 최상위 디렉토리에서 make menuconfig라고 입력한 후 나타나는 항목 수원과학대학 정보통신과
커널 포팅 [3] 수원과학대학 정보통신과
커널 포팅 [4] 수원과학대학 정보통신과
커널 포팅 [5] 수원과학대학 정보통신과
① ② ① ② ③ ④ ⑤ ⑥ 실습 6-4 커널 이미지 생성 • 커널 압축 파일이 있는 디렉토리로 이동해 압축 해제 • 압축을 푼 파일을 포함하는 디렉토리와 설정 관련 파일의 존재 여부 확인
① ② ③ 실습 6-4 커널 이미지 생성 • 에디터를 사용해 <linux>/Makefile의 arm-linux에 대한 경로를 조정 • /opt/iwmmxt-1.0.0을 /usr/local/hybus/toolchain으로 수정 • 타겟 시스템의 기본 설정 후 생성된 파일을 조사하고 메뉴 설정 단계를 시행
실습 6-4 커널 이미지 생성 • 커널 메뉴 설정 화면이 나타나면 [Tab] 키를 사용해 <Exit> 컨트롤로 이동한 후 [Enter] 키 입력 • 새로운 커널 설정을 저장하기 위해 <Yes>를 선택한 후 [Enter] 키 입력
실습 6-4 커널 이미지 생성 • .config 파일과 autoconf.h 파일을 다시 확인 후 make로 커널 이미지 생성 • 커널 이미지 생성을 확인한 후 생성된 zImage를 /tftpboot 디렉토리로 복사 • 부트로더 명령을 사용해 타겟 시스템에 전송한 후 퓨징 • hybus> tftp zImage kernel • hybus> flash kernel • 타겟 시스템을 재부팅 ① ② ③ ① ②
① ③ ④ ⑤ 실습 6-5 커널 이미지에hello.o 모듈 추가하기 • 필요한 파일을 생성 및 수정한 후 메뉴 설정 단계로 진입 ② 01 #include <linux/init.h> 02 #include <linux/module.h> 03 #include <linux/kernel.h> 04 05 static int hello_init(void) 06 { 07 printk("Hello, world!\n"); 08 return 0; 09 } 10 11 static void hello_exit(void) 12 { 13 printk("Goodbye, world!\n"); 14 } 15 16 module_init(hello_init); 17 module_exit(hello_exit); 18 MODULE_LICENSE("GPL");
실습 6-5 커널 이미지에hello.o 모듈 추가하기 • 환경 설정 메뉴의 주 화면에서 [Character devices --->] 하위 메뉴로 이동 • Character devices 하위 메뉴에서 “Hello, World” 항목이 생성되었음을 확인 후 화살표 키를 사용해 “Hello, World” 항목으로 이동
실습 6-5 커널 이미지에hello.o 모듈 추가하기 • Character devices 하위 메뉴에서 “Hello, World” 항목을 선택하기 위해 [Space] 키를 두 번 누른 후 공백에서 ‘*’로 바뀐 것을 확인 • [Esc] 키를 두 번 누른 후 수정한 설정 내용을 저장 • [실습 6-4]의 7) ~ 10) 단계를 수행 • 부팅 과정 중에 나오는 “Hello, World!” 메시지를 dmesg 명령을 사용해 관찰