임베디드시스템설계강의자료 6 system call 1/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과
시스템호출개요 리눅스에서는사용자공간과커널공간을구분 사용자프로그램은사용자모드, 운영체제는커널모드에서수행 커널공간에대한접근은커널 ( 특권, priviledged) 모드에서가능 컴퓨팅자원 (CPU, memory, I/O 등 ) 을안전하게보호 커널수행을안전하게유지 사용자모드 커널모드는인터럽트 (interrupt) 또는예외 (exception) 발생을통함 - 2 - Young-Jin Kim
시스템호출개요 Interrupt and Exceptions Interrupt Communication interface between CPU and I/O devices Hardware (by external devices) Software: INT 0x80 (Intel x86), SWI (ARM) We call this system call! Exceptions Program or system error: faults, traps, and aborts Software generated: INT 3 (Intel x86) Machine-check exceptions - 3 - Young-Jin Kim
시스템호출개요 INT 0x80 (Intel x86) - 4 - Young-Jin Kim
시스템호출개요 CPL (Current Privilege Level) CPL (Current Privilege Level) CPU 에서현재실행중인특권레벨을지정 인터럽트또는시스템호출처리시특권레벨의변화를추적하기위해사용 - 5 - Young-Jin Kim
시스템호출개요 x86 Protection Rings Operating system kernel Operating system services Applications Level 0 Level 1 Level 2 Level 3 Privileged instructions can be executed only when current privileged level (CPL) is 0-6 - Young-Jin Kim
시스템호출개요 fork 시스템호출과정 1 fork() 시스템호출함수를사용하려면 fork() 함수정보가있는 <linux>/include/linux/unistd.h 헤더파일을 include. 링커로라이브러리에서대응하는함수와연결 2 라이브러리내부의 fork() 함수 : swi 900002 3 호출번호 2 에해당하는시스템호출함수 sys_fork() 실행 4 가상파일시스템을통해커널자원인파일, 디렉토리, 디바이스등을하나의파일처럼접근 - 7 - Young-Jin Kim
시스템호출개요 - 8 - Young-Jin Kim
시스템호출개요 리눅스에서지원하는시스템호출 프로세스관리 : fork(), execve(), getpid(), signal() 등 파일관리 : open(), read(), write() close() 등 메모리관리 : brk() 등 네트워크관리 : socket(), bind(), connect() 등 장치관리, 기타시스템정보나제어 : time() 등 Ref. http://www.digilife.be/quickreferences/qrc/linux%20system%2 0Call%20Quick%20Reference.pdf - 9 - Young-Jin Kim
시스템호출개요 시스템호출함수는특정디렉토리에저장 프로세스관련함수 : <kernel_4412>/kernel 파일시스템관련함수 : <kernel_4412>/fs 특정프로세서관련함수 : <kernel_4412>/arch ARM 프로세서관련함수 : <kernel_4412>/arch/arm/kernel 시스템호출함수는 sys_ 함수명 이라는이름으로정의, 사용자프로그램에서는접두사없이함수명만사용 시스템호출함수는커널함수이므로헤더파일은 <kernel_4412>/include 디렉토리에존재 - 10 - Young-Jin Kim
시스템호출프로그래밍 시스템호출구현 - 11 - Young-Jin Kim
시스템호출프로그래밍 System call 번호할당 [ 코드 ] 시스템콜처리함수할당 < kernel_4412 >/arch/arm/include/asm/unistd.h #define NR_hellocall ( NR_SYSCALL_BASE+376) Linux 커널이제공하는모든시스템호출은각각고요한번호를가지고있으며 unistd.h에각시스템호출번호가정의되어있음. unistd.h 파일의위내용을보면현재 system call 은 375개가있는것을확인할수있으며추가할 system call 은 376번으로할당 NR_ 은 System Call 고유번호를나타내는접두어이며그뒤의 hellocall이추가할 System Call 처리함수의이름 - 12 - Young-Jin Kim
시스템호출프로그래밍 System call 테이블에 system call 처리함수등록 [kernel_4412]/arch/arm/kernel/entry-comm.s 에 sys_call_table 이라는 entry 로구현 sys_call_table 에는 system call 처리함수의시작주소들이들어있고각함수들은 unistd.h 에정의되어있는 system call 번호를인덱스로하여접근 sys_call_table 에추가할 System Call 처리함수등록 entry(sys_call_table) 다음에 calls.s 를 include 시스템호출함수와할당한시스템호출번호를연관시켜줄필요가있다. [ 코드 ] 시스템콜처리함수등록 < kernel_4412 >/arch/arm/kernel/calls.s /* 376 */ CALL(sys_hellocall) unistd.h 에정의한호출번호와일치 - 13 - Young-Jin Kim
시스템호출프로그래밍 system call 처리함수구현 System Call 이발생했을때수행될함수구현 [kernel]/kernel/hellocall.c 생성 [ 코드 ] 시스템콜호출함수생성 < kernel_4412 >/kernel/hellocall.c - 14 - Young-Jin Kim
시스템호출프로그래밍 Makefile 수정 만들어진처리함수를커널이컴파일될때에함께컴파일될수있도록 Makefile을수정한다. [ 코드 ] makefile 수정 < kernel_4412 >/kernel/makefile - 15 - Young-Jin Kim
시스템호출프로그래밍 Kernel Compile Ubuntu 에서다음을수행 # make zimage Kernel fusing Windows 에서다음을수행 > fastboot.exe flash kernel zimage - 16 - Young-Jin Kim
시스템호출프로그래밍 System Call 을호출하는 User Application 제작 vi hellocall_test.c - 17 - Young-Jin Kim
시스템호출프로그래밍 User Application 컴파일하기위한 Makefile 작성 #make - 18 - Young-Jin Kim
시스템호출프로그래밍 User Application 전송 Transfer >ZMODEM > send Applicatoin File 권한설정 시스템호출실행 #./hellocall_test - 19 - Young-Jin Kim
매개변수를이용한시스템호출 사용자영역과커널영역사이에서값을교환하는커널함수들 함수 put_user(x, ptr) get_user(x, ptr) copy_to_user(void user *to, const void * from, unsigned long n) copy_from_user(void * to, void user *from, unsigned long n) 설명 커널영역의데이터를사용자영역으로복사함. (ptr 은사용자메모리영역의선두주소, x 는커널변수 ) 사용자영역의데이터를커널영역으로복사함. (ptr 은사용자메모리영역의선두주소, x 는커널변수 ) 커널영역의 n 크기만큼의데이터를사용자영역으로복사함. 사용자영역의 n 크기만큼의데이터를커널영역으로복사함. Ref. http://blog.naver.com/idthek?redirect=log&logno=90119626977-20 - Young-Jin Kim
매개변수를이용한시스템호출 사용자응용에서버퍼에대한포인터로 system call stub 함수를호출함. 호출되는 system call stub 함수에서인자로포인터를넘겨받음 넘겨받은포인터를이용하여새로이작성한 system call 함수내에서 put_user(), get_user(), copy_to_user(), copy_from_user() 를호출하여사용자 - 커널영역간의데이터교환이일어나게됨 - 21 - Young-Jin Kim
매개변수를이용한시스템호출 새로이작성한 system call 함수예 #include <linux/kernel.h> #include <asm/uaccess.h> // put_user() 사용을위함 asmlinkage int sys_mycall(int x, int *buf) { y =...; put_user(y, buf); } - 22 - Young-Jin Kim
매개변수를이용한시스템호출 매개변수를사용하는시스템콜스텁함수및응용프로그램예 #include <linux/unistd.h> _syscall2(int, mycall, int, x, int *, buf) // 매개변수가 2 개임! int main(void) { int i = 0; int temp = 2; int buff = 0; i = mycall(temp, &buff); // 주소연산자사용! } - 23 - Young-Jin Kim