강의 PPT - 수원과학대학교 정보통신과

Download Report

Transcript 강의 PPT - 수원과학대학교 정보통신과

임베디드시스템1
10주차. 커널 이미지 생
성과 시스템 호출
수원과학대학 정보통신과
커널 컴파일과 포팅 [1]

커널(kernel)


컴파일(compile)



Compiler를 이용하여 program source로부터 수행가능한 binary
code를 만드는 과정
Linux source는 대부분 C 언어로 작성되어 있음
커널 포팅(kernel porting)


운영체제의 핵심을 이루는 요소로서 컴퓨터 내의 자원을 사용자
프로그램이 사용할 수 있도록 관리하는 프로그램
커널 소스를 타겟 시스템에 적합하게 프로그래밍 및 컴파일해 생
성된 커널 이미지를 타겟 시스템에 적재하는 과정
이번 실습의 목적  커널 컴파일과 포팅

X-Hyper270-TKU target board에 맞게 커널 환경을 설정하고 커널
을 컴파일하여 target board에 포팅함
수원과학대학 정보통신과
2
커널 컴파일과 포팅 [2]

커널 환경 설정 유틸리티

텍스트 기반의 make config
텍스트 메뉴 기반의 make menuconfig  우리는 이것을 사용함
X 윈도우 기반의 make xconfig

make xhyper270tku_defconfig



커널 컴파일과 포팅의 전체적인 과정


make menuconfig





메뉴를 통해 kernel의 configuration을 수행함
커널을 built-in(*) 할것인지 module(M) 형태로 할 것인지 등을 선택
새로운 메뉴 추가도 가능
make zImage


처음 커널을 컴파일할 때 필요한 옵션을 기본적으로 X-Hyper270TKU에 맞추어 줌
Kernel image 생성
tftp zImage kernel
flash kernel
수원과학대학 정보통신과
3
커널환경설정
<linux>/arch/arm/Kconfig
주어진 화면에 모두 표시할 수
없으면 나타나는 표식임
수원과학대학 정보통신과
4
실습 10-1 커널 이미지 생성
①
②
커널 압축 파일이 있는 디렉토리로 이동해 압축 해제
압축을 푼 파일을 포함하는 디렉토리와 설정 관련 파일
의 존재 여부 확인
실습 10-1 커널 이미지 생성
③
autoconf.h 파일이 생성되었는지 조사하고 메뉴 설정 단
계를 시행
실습 10-1 커널 이미지 생성
④
⑤
커널 메뉴 설정 화면이 나타나면 [Tab] 키를 사용해
<Exit> 컨트롤로 이동한 후 [Enter] 키 입력
새로운 커널 설정을 저장하기 위해 <Yes>를 선택한 후
[Enter] 키 입력
실습 10-1 커널 이미지 생성
⑥
.config 파일과 autoconf.h 파일을 다시 확인 후 make로 커널 이미지 생성
①
②
⑦
③ 후 생성된 zImage를 /tftpboot 디렉토리로 복사
커널 이미지 생성을 확인한
①
⑧
부트로더 명령을 사용해 타겟 시스템에 전송한 후 퓨징


⑨
②
hybus> tftp zImage kernel
hybus> flash kernel
타겟 시스템을 재부팅
10.3 시스템 호출의 개요


시스템 자원을 사용자가 함부로 잘못 사용할경우 시스템 오류 발생
대책
권한 레벨을 설정하여 시스템 공간을 사용자 공간과 커널 공간 구분
 사용자가 커널 공간에 대한 접근은 시스템 호출(system call)로만 가능
하도록 제한


효과: 컴퓨팅 자원을 안전하게 보호하고 커널 수행을 안전하게 유지
시스템 자원

시스템 호출(system call)이란?
사용자 영역에서 커널 영역의 자원을 사용하기 위하여 사용하는 함수
 시스템 호출 시 소프트웨어 인터럽트(interrupt)인 트랩(trap)이 발생하
여 특권 레벨로 모드가 변경됨

수원과학대학 정보통신과
9
리눅스에서 지원하는 시스템 호출들

프로세스 관리
 fork(),

execve(), getpid(), signal() 등
파일 시스템
 open(),

메모리 관리
 brk()

read(), write() close() 등
등
네트워크 관리
 socket(),

bind(), connect() 등
기타 시스템 정보나 제어
 time()
등
수원과학대학 정보통신과
10
10.4 시스템 호출 동작 과정

사용자 프로그램의 번역 과정
수원과학대학 정보통신과
11
fork 시스템 호출 과정
참고: fork() 함수 – 자식 프로세스 생성
① fork() 시스템 호출 함수를 사용하려면 fork() 함수 정보가 있는
<linux>/include/linux/unistd.h 헤더 파일을 include. 링커로 라이
브러리에서 대응하는 함수와 연결
② 라이브러리 내부의 fork() 함수: “swi 900002”
③ 호출 번호 2에 해당하는 시스
템 호출 함수 sys_fork() 실행
④ 가상 파일 시스템을 통해 커널 자원인 파일, 디렉토리,
디바이스 등을 하나의 파일처럼 접근
수원과학대학 정보통신과
12
10.5 시스템 호출 구현
수원과학대학 정보통신과
13
시스템 호출 함수 정의

시스템 호출 함수는 특정 디렉토리에 저장






프로세스 관련 함수: <linux>/kernel
파일 시스템 관련 함수: <linux>/fs
특정 프로세서 관련 함수: <linux>/arch
ARM 프로세서 관련 함수: <linux>/arch/arm/kernel
시스템 호출 함수는 “sys_함수명”이라는 이름으로 정의,
사용자 프로그램에서는 접두사 없이 함수명만 사용
시스템 호출 함수는 커널 함수이므로 헤더 파일은
<linux>/include 디렉토리에 존재
수원과학대학 정보통신과
14
시스템 호출 함수 구현 절차

시스템 호출 번호 할당


시스템 호출 함수 등록


<linux>/arch/arm/kernel/ 디렉토리에 존재하는 calls.S에 새로운
시스템 호출 함수 등록
커널 빌드 및 타겟 시스템에 퓨징



<linux>/include/asm-arm/unistd.h 헤더 파일에 새로운 시스템 호
출 함수 번호를 할당
시스템 호출 함수 파일이 존재하는 동일한 디렉토리의 Makefile을
수정한 후 커널 이미지를 다시 빌드
빌드된 커널 이미지를 타겟 시스템의 플래시에 퓨징
시스템 호출 함수의 검증


시스템 호출 스텁 함수(system call stub function) 사용
_syscallx (type, name, type1, arg1, type2, arg2, …, typex, argx);
수원과학대학 정보통신과
15
실습 10-2 ~ 10-5 시스템 호출 함수 작성 및 커널 빌드

10-2 시스템 호출 함수 정의


10-3 시스템 호출 번호 할당


<linux>/include/asm-arm/unistd.h 헤더 파일의 마지막 부분에 새
로운 시스템 호출 함수에 대한 고유 번호를 추가
10-4 시스템 호출 함수 등록


에디터를 사용해 <linux>/kernel/hello.c 작성
<linux>/arch/arm/kernel/calls.S 파일에 시스템 호출 함수를 마지
막 행에 추가
10-5 커널 재컴파일 및 타겟 시스템에 퓨징



에디터를 사용해 <linux>/kernel/Makefile 을 수정
커널을 다시 빌드하고 커널 이미지를 /tftpboot로 복사
빌드한 커널을 타겟 시스템에 탑재하고 재부팅
수원과학대학 정보통신과
16
실습 10-2 시스템 호출 함수 정의
①
hello.c 작성((<linux>/kernel/hello.c))
01 #include <linux/kernel.h>
02
03 asmlinkage void sys_hello()
04 {
05 printk ("Hello, this is new system call!\n");
06 }
실습 10-3 시스템 호출 번호 할당
①
<linux>/include/asm-arm/unistd.h 헤더 파일을 염.
②
②
새로운 시스템 호출 함수에 대한 고유 번호 추가
실습 10-4 시스템 호출 함수 등록
①
<linux>/arch/arm/kernel/calls.S에 시스템 호출 함수 추가
①
②
실습 10-5 커널 재컴파일 및 타겟 시스템에 퓨징
에디터를
<linux>
사용해 <linux>/kernel/Makefile 수정
디렉토리로 이동
실습 8-4 커널 재컴파일 및 타겟 시스템에 퓨징
커널을
다시 빌드하고 커널 이미지를 /tftpboot로 복사
빌드한
커널을 타겟 시스템에 탑재하고 재부팅
10.5.5 시스템 호출 함수의 검증



시스템 호출을 사용하는 두 가지 방법
1.
2.
응용 프로그램에서 시스템 호출 직접 사용
라이브러리를 통해 시스템 호출 사용  라이브러리 구축 필요

_syscallx(type, name, type1, arg1, type2, arg2, ..., typex, argx);
응용프로그램에서 시스템 호출을 직접 사용하려면 _syscall0와 같은
매크로(시스템 호출 스텁 함수, system call stub function)를 사용한다.
System call stub function의 형식





예



syscallx, typex, argx의 x: 인자(argument)의 개수임
type: 시스템 호출 함수의 반환 형식
name: 시스템 호출 함수 이름으로 sys_접두사를 제거한 이름
arg1, arg2 등은 인자.
type1, type2 등은 대응하는 인자의 형식
_syscall0(void, hello)

시스템호출함수이름 hello, 반환값 void, 인자없음

_syscall2(int, testcall, char *, argc1, char *, arg2)
문자열 형식 인자 2개, 정수를 반환하는 testcall()이라는시스템 호출함수
를 사용하는 매크로 _syscallx의 형식
수원과학대학 정보통신과
22
실습 10-6 시스템 호출 함수 테스트
① test-hello.c
프로그램 작성(08/hello/test-hello.c )
01 #include <linux/unistd.h>
02 #include <errno.h>
03
04 /* system call stub function */
05 _syscall0 (void, hello);
06
07 int main()
08 {
09 hello();
10 return 0;
11 }
실습 10-6 시스템 호출 함수 테스트
②
Makefile 작성 및 컴파일(08/hello/Makefile )
01 # Modify /embed/kernel/linux to your kernel home directory
02 KDIR := /embed/kernel/linux/include
03 CFLAGS := -I$(KDIR)
04
05 test-hello : test-hello.c
06 arm-linux-gcc $(CFLAGS) -o test-hello test-hello.c
07
08 clean:
09 rm -f test-hello
실습 10-6 시스템 호출 함수 테스트
③
Make 유틸리티를 이용해 응용프로그램 컴파일
①
②
③
④
⑤
컴파일된 응용 프로그램을 타겟 시스템으로 전송
타겟 시스템에서 시스템 호출을 사용하는 응용프로그램
테스트
실습문제


자기이름을 호출하는 시스템 호출 함수 whoami
를 작성한 후 타깃 시스템에서 이를 호출하는 테
스트 프로그램을 검증하시오.
실행예) [root@xhyper ~]#./test-whoami
My name is Myung-Moon Lee.
수원과학대학 정보통신과
26