260 likes | 478 Views
임베디드시스템 1 10 주차 . 커널 이미지 생성과 시스템 호출. 수원과학대학 정보통신과. 커널 컴파일과 포팅 [1]. 커널 (kernel) 운영체제의 핵심을 이루는 요소로서 컴퓨터 내의 자원을 사용자 프로그램이 사용할 수 있도록 관리하는 프로그램 컴파일 (compile) Compiler 를 이용하여 program source 로부터 수행가능한 binary code 를 만드는 과정 Linux source 는 대부분 C 언어로 작성되어 있음 커널 포팅 (kernel porting)
E N D
임베디드시스템110주차. 커널 이미지 생성과 시스템 호출 수원과학대학 정보통신과
커널 컴파일과 포팅 [1] • 커널(kernel) • 운영체제의 핵심을 이루는 요소로서 컴퓨터 내의 자원을 사용자 프로그램이 사용할 수 있도록 관리하는 프로그램 • 컴파일(compile) • Compiler를 이용하여 program source로부터 수행가능한 binary code를 만드는 과정 • Linux source는 대부분 C 언어로 작성되어 있음 • 커널 포팅(kernel porting) • 커널 소스를 타겟 시스템에 적합하게 프로그래밍 및 컴파일해 생성된 커널 이미지를 타겟 시스템에 적재하는 과정 • 이번 실습의 목적 커널 컴파일과 포팅 • X-Hyper270-TKU target board에 맞게 커널 환경을 설정하고 커널을 컴파일하여 target board에 포팅함 수원과학대학 정보통신과
커널 컴파일과 포팅 [2] • 커널 환경 설정 유틸리티 • 텍스트 기반의 make config • 텍스트 메뉴 기반의 make menuconfig 우리는 이것을 사용함 • X 윈도우 기반의 make xconfig • 커널 컴파일과 포팅의 전체적인 과정 • make xhyper270tku_defconfig • 처음 커널을 컴파일할 때 필요한 옵션을 기본적으로 X-Hyper270-TKU에 맞추어 줌 • make menuconfig • 메뉴를 통해 kernel의 configuration을 수행함 • 커널을 built-in(*) 할것인지 module(M) 형태로 할 것인지 등을 선택 • 새로운 메뉴 추가도 가능 • make zImage • Kernel image 생성 • tftp zImage kernel • flash kernel 수원과학대학 정보통신과
커널환경설정 <linux>/arch/arm/Kconfig 주어진 화면에 모두 표시할 수 없으면 나타나는 표식임 수원과학대학 정보통신과
실습 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)이 발생하여 특권 레벨로 모드가 변경됨 시스템 자원 수원과학대학 정보통신과
리눅스에서 지원하는 시스템 호출들 • 프로세스 관리 • fork(), execve(), getpid(), signal() 등 • 파일 시스템 • open(), read(), write() close() 등 • 메모리 관리 • brk() 등 • 네트워크 관리 • socket(), bind(), connect() 등 • 기타 시스템 정보나 제어 • time() 등 수원과학대학 정보통신과
10.4 시스템 호출 동작 과정 • 사용자 프로그램의 번역 과정 수원과학대학 정보통신과
fork 시스템 호출 과정 참고: fork() 함수 –자식 프로세스 생성 ① fork() 시스템 호출 함수를 사용하려면 fork() 함수 정보가 있는<linux>/include/linux/unistd.h 헤더 파일을 include. 링커로 라이브러리에서 대응하는 함수와 연결 ② 라이브러리 내부의 fork() 함수: “swi 900002” ③ 호출 번호 2에 해당하는 시스템 호출 함수 sys_fork() 실행 ④가상 파일 시스템을 통해 커널 자원인 파일, 디렉토리, 디바이스 등을 하나의 파일처럼 접근 수원과학대학 정보통신과
10.5 시스템 호출 구현 수원과학대학 정보통신과
시스템 호출 함수 정의 • 시스템 호출 함수는 특정 디렉토리에 저장 • 프로세스 관련 함수: <linux>/kernel • 파일 시스템 관련 함수: <linux>/fs • 특정 프로세서 관련 함수: <linux>/arch • ARM 프로세서 관련 함수: <linux>/arch/arm/kernel • 시스템 호출 함수는 “sys_함수명”이라는 이름으로 정의, 사용자 프로그램에서는 접두사 없이 함수명만 사용 • 시스템 호출 함수는 커널 함수이므로 헤더 파일은 <linux>/include 디렉토리에 존재 수원과학대학 정보통신과
시스템 호출 함수 구현 절차 • 시스템 호출 번호 할당 • <linux>/include/asm-arm/unistd.h 헤더 파일에 새로운 시스템 호출 함수 번호를 할당 • 시스템 호출 함수 등록 • <linux>/arch/arm/kernel/ 디렉토리에 존재하는 calls.S에 새로운 시스템 호출 함수 등록 • 커널 빌드 및 타겟 시스템에 퓨징 • 시스템 호출 함수 파일이 존재하는 동일한 디렉토리의 Makefile을 수정한 후 커널 이미지를 다시 빌드 • 빌드된 커널 이미지를 타겟 시스템의 플래시에 퓨징 • 시스템 호출 함수의 검증 • 시스템 호출 스텁 함수(system call stub function) 사용 • _syscallx (type, name, type1, arg1, type2, arg2, …, typex, argx); 수원과학대학 정보통신과
실습 10-2 ~ 10-5 시스템 호출 함수 작성 및 커널 빌드 • 10-2 시스템 호출 함수 정의 • 에디터를 사용해 <linux>/kernel/hello.c 작성 • 10-3 시스템 호출 번호 할당 • <linux>/include/asm-arm/unistd.h 헤더 파일의 마지막 부분에 새로운 시스템 호출 함수에 대한 고유 번호를 추가 • 10-4 시스템 호출 함수 등록 • <linux>/arch/arm/kernel/calls.S 파일에 시스템 호출 함수를 마지막 행에 추가 • 10-5 커널 재컴파일 및 타겟 시스템에 퓨징 • 에디터를 사용해 <linux>/kernel/Makefile 을 수정 • 커널을 다시 빌드하고 커널 이미지를 /tftpboot로 복사 • 빌드한 커널을 타겟 시스템에 탑재하고 재부팅 수원과학대학 정보통신과
실습 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>/kernel/Makefile 수정 • <linux> 디렉토리로 이동
실습 8-4 커널 재컴파일 및 타겟 시스템에 퓨징 • 커널을 다시 빌드하고 커널 이미지를 /tftpboot로 복사 • 빌드한 커널을 타겟 시스템에 탑재하고 재부팅
10.5.5 시스템 호출 함수의 검증 • 시스템 호출을 사용하는 두 가지 방법 • 응용 프로그램에서 시스템 호출 직접 사용 • 라이브러리를 통해 시스템 호출 사용 라이브러리 구축 필요 • 응용프로그램에서 시스템 호출을 직접 사용하려면 _syscall0와 같은 매크로(시스템 호출 스텁 함수, system call stub function)를 사용한다. • System call stub function의 형식 • _syscallx(type, name, type1, arg1, type2, arg2, ..., typex, argx); • syscallx, typex, argx의 x: 인자(argument)의 개수임 • type: 시스템 호출 함수의 반환 형식 • name: 시스템 호출 함수 이름으로 sys_접두사를 제거한 이름 • arg1, arg2 등은 인자. • type1, type2 등은 대응하는 인자의 형식 • 예 • _syscall0(void, hello) • 시스템호출함수이름 hello, 반환값 void, 인자없음 • 문자열 형식 인자 2개, 정수를 반환하는 testcall()이라는시스템 호출함수를 사용하는 매크로 _syscallx의 형식 • _syscall2(int, testcall, char *, argc1, char *, arg2) 수원과학대학 정보통신과
실습 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. 수원과학대학 정보통신과