강의 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