임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과
System call table and linkage v Ref. http://www.ibm.com/developerworks/linux/library/l-system-calls/ - 2 - Young-Jin Kim
SYSCALL_DEFINE 함수 v SYSCALL_DEFINEx Ø Invoking a system call without library support (i.e., wrapper function) Ø Macro 함수로 [kernel4412] / include/linux/syscalls.h 에있음 Ø 문법은다음과같음 ü SYSCALL_DEFINE0( func-name ) ü SYSCALL_DEFINE1( func-name, arg1-type, arg1-name ) ü SYSCALL_DEFINE2( func-name, arg1-type, arg1-name, arg2-type, arg2-name ) Ø 매개변수 (args) 의수에따라서 SYSCALL_DEFINE0 ~ SYSCALL_DEFINE6 까지존재 Ø Header file ü #include <linux/syscalls.h> Ø 리눅스 2.6.34 버전부터 syscall 매크로대신에 SYSCALL_DEFINE 매크로가사용되고있음 ü http://lxr.free-electrons.com/ident?v=3.0;i=syscall_define - 3 - Young-Jin Kim
v 학습내용 Ø 사용자프로그램에서 int 1 개를입력받아서 system call 호출시매개변수로하여커널에넘겨주고커널의 system call 함수에서는이값을 5 증가시켜다시사용자응용으로반환함 Ø 사용자프로그램과커널간의데이터이동시문제파악 Ø 사용자프로그램과커널간의데이터이동문제해결 - 4 - Young-Jin Kim
v System call 번호할당 Ø [kernel4412] / arch/arm/include/asm/unistd.h Ø 새로추가할 system call의고유번호정의추가 #define NR_newcall ( NR_SYSCALL_BASE+377) - 5 - Young-Jin Kim
v System call 테이블에 system call 처리함수등록 Ø [kernel4412] / arch/arm/kernel/calls.s 수정 è calls.s 에 CALL(sys_newcall1) 등록 Ø unistd.h 에서정의한호출번호와일치 - 6 - Young-Jin Kim
v System call 처리함수를 syscalls.h 에함수선언등록 Ø [kernel4412] / include/linux/syscalls.h 수정 è Function prototype declaration - 7 - Young-Jin Kim
v System call 처리함수구현 Ø [kernel4412] / kernel/newcall.c 작성 Ø user 영역으로부터넘겨받은값을출력하고 5 를증가시켜서 return Ø printk, a = a+ 5; (kernel operation) - 8 - Young-Jin Kim
vmakefile 수정 Ø [kernel4412] /kernel/makefile - 9 - Young-Jin Kim
v Kernel Compile Ø Ø Ubuntu에서다음을수행 # make zimage v Kernel fusing Ø Ø Windows에서다음을수행 > fastboot.exe flash kernel zimage - 10 - Young-Jin Kim
v System Call 을호출하는 User Application 제작 Ø /usr/local/app/newcall_test.c 구현 Ø unistd.h 에서정의한호출번호와일치 - 11 - Young-Jin Kim
v User Application 컴파일 (makefile 사용 ) Ø System call 호출응용프로그램의컴파일용 Makefile 을작성 Ø /usr/local/app/makefile - 12 - Young-Jin Kim
v User Application 전송 Ø Ø Ø 실행파일을 Tera Term의 zmodem을이용하여보드로옮김 Applicatoin File 실행권한설정 : chmod 755 newcall_test 시스템호출실행 :./newcall_test 사용자프로그램에서전달받은값이 30 으로사용자응용 - 커널간데이터전달에서문제발생 - 13 - Young-Jin Kim
v 사용자영역과커널영역사이에서값을교환하는커널함수들 함수 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-14 - Young-Jin Kim
v 사용자응용에서버퍼에대한포인터로 system call stub( 응용측에서시스템호출을위해서호출하는함수 ) 함수를호출함. v 호출되는 system call stub 함수에서인자로포인터를넘겨받음 v 넘겨받은포인터를이용하여새로이작성한 system call 함수내에서 put_user(), get_user(), copy_to_user(), copy_from_user() 를호출하여사용자 - 커널영역간의데이터교환이일어나게됨 - 15 - Young-Jin Kim
v [kernel4412] / kernel/newcall.c 수정 v newcall.c 에서커널에서사용자로의데이터전달을위해포인터매개변수 (int *b) 와 put_user() 함수사용 v #include <asm/uaccess.h> 필요 - 16 - Young-Jin Kim
vnewcall_test.c 에서시스템콜함수에대응하는 system stub function 수정 Ø /usr/local/app/newcall_test.c 수정 - 17 - Young-Jin Kim
v System call 처리함수를 syscalls.h 에함수선언등록 Ø [kernel4412] / include/linux/syscalls.h 수정 è Function prototype declaration - 18 - Young-Jin Kim
v 타겟보드에서실행파일 newcall_test 실행시 b 의값이 35 이므로제대로동작함. Ø 함수리턴값은 35 로항상제대로동작함. - 19 - Young-Jin Kim
v 질문 : 전달해야하는데이터의수가많은경우, 사용자 - 커널간데이터전달은? - 20 - Young-Jin Kim