1 / 25

프로젝트랩 8 장 . 시스템 호출

프로젝트랩 8 장 . 시스템 호출. 수원과학대학 정보통신과. 1. 시스템 호출의 개요. 권한 레벨을 설정하여 사용자 공간과 커널 공간 구분 서로 다른 공간에 대한 접근은 시스템 호출 (system call) 로만 가능하도록 제한 컴퓨팅 자원을 안전하게 보호 커널 수행을 안전하게 유지 시스템 호출은 사용자 영역에서 커널 영역의 자원을 사용하기 위하여 사용하는 함수 트랩 (trap) 과 인터럽트 (interrupt). 리눅스에서 지원하는 시스템 호출. 프로세스 관리

jafari
Download Presentation

프로젝트랩 8 장 . 시스템 호출

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 프로젝트랩8장. 시스템 호출 수원과학대학 정보통신과

  2. 1. 시스템 호출의 개요 • 권한 레벨을 설정하여 사용자 공간과 커널 공간 구분 • 서로 다른 공간에 대한 접근은 시스템 호출(system call)로만 가능하도록 제한 • 컴퓨팅 자원을 안전하게 보호 • 커널 수행을 안전하게 유지 • 시스템 호출은 사용자 영역에서 커널 영역의 자원을 사용하기 위하여 사용하는 함수 • 트랩(trap)과 인터럽트(interrupt) 수원과학대학 정보통신과

  3. 리눅스에서 지원하는 시스템 호출 • 프로세스 관리 • fork(), execve(), getpid(), signal() 등 • 파일 시스템 • open(), read(), write() close() 등 • 메모리 관리 • brk() 등 • 네트워크 관리 • socket(), bind(), connect() 등 • 기타 시스템 정보나 제어 • time() 등 수원과학대학 정보통신과

  4. 2. 시스템 호출 동작 과정 • 사용자 프로그램의 번역 과정 수원과학대학 정보통신과

  5. fork 시스템 호출 과정 ① fork() 시스템 호출 함수를 사용하려면 fork() 함수 정보가 있는<linux>/include/linux/unistd.h 헤더 파일을 include. 링커로 라이브러리에서 대응하는 함수와 연결 ② 라이브러리 내부의 fork() 함수: “swi 900002” ③ 호출 번호 2에 해당하는 시스템 호출 함수 sys_fork() 실행 ④가상 파일 시스템을 통해 커널 자원인 파일, 디렉토리, 디바이스 등을 하나의 파일처럼 접근 수원과학대학 정보통신과

  6. 3. 시스템 호출 구현 수원과학대학 정보통신과

  7. 시스템 호출 함수 정의 • 시스템 호출 함수는 특정 디렉토리에 저장 • 프로세스 관련 함수: <linux>/kernel • 파일 시스템 관련 함수: <linux>/fs • 특정 프로세서 관련 함수: <linux>/arch • ARM 프로세서 관련 함수: <linux>/arch/arm/kernel • 시스템 호출 함수는 “sys_함수명”이라는 이름으로 정의, 사용자 프로그램에서는 접두사 없이 함수명만 사용 • 시스템 호출 함수는 커널 함수이므로 헤더 파일은 <linux>/include 디렉토리에 존재 수원과학대학 정보통신과

  8. 시스템 호출 함수 구현 절차 • 시스템 호출 번호 할당 • <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); 수원과학대학 정보통신과

  9. 실습 8-1 ~ 8-4 시스템 호출 함수 작성 및 커널 빌드 • 8-1 시스템 호출 함수 정의 • 에디터를 사용해 <linux>/kernel/hello.c 작성 • 8-2 시스템 호출 번호 할당 • <linux>/include/asm-arm/unistd.h 헤더 파일의 마지막 부분에 새로운 시스템 호출 함수에 대한 고유 번호를 추가 • 8-3 시스템 호출 함수 등록 • <linux>/arch/arm/kernel/calls.S 파일에 시스템 호출 함수를 마지막 행에 추가 • 8-4 커널 재컴파일 및 타겟 시스템에 퓨징 • 에디터를 사용해 <linux>/kernel/Makefile 을 수정 • 커널을 다시 빌드하고 커널 이미지를 /tftpboot로 복사 • 빌드한 커널을 타겟 시스템에 탑재하고 재부팅 수원과학대학 정보통신과

  10. 실습 8-1 시스템 호출 함수 정의 • 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 }

  11. ② 실습 8-2 시스템 호출 번호 할당 • <linux>/include/asm-arm/unistd.h 헤더 파일을 염. • 새로운 시스템 호출 함수에 대한 고유 번호 추가

  12. ② 실습 8-3 시스템 호출 함수 등록 • <linux>/arch/arm/kernel/calls.S에 시스템 호출 함수 추가

  13. 실습 8-4 커널 재컴파일 및 타겟 시스템에 퓨징 • 에디터를 사용해 <linux>/kernel/Makefile 수정 • <linux> 디렉토리로 이동

  14. ③ ④ 실습 8-4 커널 재컴파일 및 타겟 시스템에 퓨징 • 커널을 다시 빌드하고 커널 이미지를 /tftpboot로 복사 • 빌드한 커널을 타겟 시스템에 탑재하고 재부팅 ① ②

  15. 시스템 호출 함수의 검증 • 시스템 호출을 사용하는 두 가지 방법 • 응용 프로그램에서 시스템 호출 직접 사용 • 라이브러리를 통해 시스템 호출 사용  라이브러리 구축 필요 • 응용프로그램에서 시스템 호출을 직접 사용하려면 sys_call0와 같은 매크로(시스템 호출 스텁 함수, 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) 수원과학대학 정보통신과

  16. 실습 8-5 시스템 호출 함수 테스트 • 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 }

  17. 실습 8-5 시스템 호출 함수 테스트 • 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

  18. ② ③ 실습 8-5 시스템 호출 함수 테스트 • Make 유틸리티를 이용해 응용프로그램 컴파일 • 컴파일된 응용 프로그램을 타겟 시스템으로 전송 • 타겟 시스템에서 시스템 호출을 사용하는 응용프로그램 테스트

  19. 7. 시스템 호출로 LED 점등하기 • LED의 점등을 위한 시스템 호출 및 응용프로그램을 작성해 본다. • 타겟 시스템에는 8개의 LED가 있다. 각 LED에 0 혹은 1의 값을 출력함으로써LED를 점등할 수 있다. • LED 점등에 필요한 프로그램 혹은 파일(testLED.c, Makefile, calls.S, unistd.h)을 생성 혹은 수정 실습 8-6 LED를 다루기 위한 시스템 호출 프로그램 작성 수원과학대학 정보통신과

  20. 실습 8-6 LED를 다루기 위한 시스템 호출 프로그램 작성 - testLED.c : 소스 작성

  21. 실습 8-6 LED를 다루기 위한 시스템 호출 프로그램 작성 • Makefile 수정 • calls.S 수정 • unistd.h 수정

  22. 실습 8-6 LED를 다루기 위한 시스템 호출 프로그램 작성 • <linux>에서 커널 이미지 빌드 • 새로운 커널이미지 <linux>/arch/arm/boot/zImage를 /tftpboot에 복사 • 미니컴 화면에서 타겟 보드를 수동 부팅 • zImage를 타겟 시스템에 전송한 후 플래시에 퓨징

  23. 실습 8-7 응용 프로그램으로 LED 점등 • LED 시스템호출 테스트 프로그램(08/testLED/test-LED.c) 작성

  24. 실습 8-7 응용 프로그램으로 LED 점등 • Makefile 작성

  25. 실습 8-7 응용 프로그램으로 LED 점등 • 테스트 프로그램 컴파일 • 미니컴을 이용해 타겟 시스템으로 전송 • 타겟 시스템에서 전송된 응용 프로그램을 실행해 LED가 변화하는 모습을 관찰

More Related