Module 8: System Call ESP30076 임베디드시스템프로그래밍 (Embedded System Programming) 조윤석 전산전자공학부
주차별목표 시스템콜인터페이스이해하기 커널에시스템콜추가하는방법알아보기 커널에시스템콜추가하기 추가한시스템콜검증하기 인자를갖는시스템콜작성하기 2
시스템콜인터페이스 일반적으로사용자모드의프로세스 (user mode process, 또는응용프로그램 ) 는커널영역에직접접근할수없음. 즉프로세스는커널메모리에접근하거나커널함수를호출할수없음 ( 보호모드 ) 시스템콜은사용자모드의프로세스와커널간의 interface 제공 이를통해응용프로그램이 kernel 이가지고있는시스템의상태정보를열람하거나, hardware 에접근하여 hardware 를제어하기위한커널과의통신채널로사용 3
시스템콜인터페이스 User Application User Level API( 시스템라이브러리 ) Kernel Level System Call Interface File System Buffer Cache Process Management (IPC-interprocess Communication, Scheduling, Memory Management Process Accounting, etc) Character Device Driver Block Device Driver Hardware Interface 4
시스템콜인터페이스사용해보기 시스템콜테스트프로그램작성해보기 소스코드작성 /* filename: mysyscall_test.c */ #include <syscall.h> #include <unistd.h> #include <stdio.h> #include <sys/types.h> int main(void) { long ID1, ID2; /* syscall() 함수를직접사용한시스템콜 */ ID1 = syscall(sys_getpid); printf( syscall(sys_getpid)=%ld\n, ID1); /* libc 에서포장된함수를사용한시스템콜 */ ID2 = getpid(); printf( getpid()=%ld\n, ID2); return(0); } 5
시스템콜인터페이스사용해보기 시스템콜테스트프로그램작성해보기 컴파일하기 (i386 용 ) root@esp:~/work/systemcall# gcc -o mysyscall_test mysyscall_test.c root@esp:~/work/systemcall#./mysyscall_test syscall(sys_getpid) = 1711 getpid() = 1711 root@esp:~/work/systemcall# 6
시스템콜인터페이스사용해보기 시스템콜테스트프로그램작성해보기 컴파일하기 (ARM 용 ) root@esp:~/work/systemcall# arm-linux-gcc mysyscall_test.c -o arm_mysyscall_test 실행및결과확인 7
POSIX API & System Call POSIX API (Application Programming Interface) 유닉스운영체계에기반을두고있는일련의표준운영체계인터페이스 Application 이시스템에각서비스를요청할때에어떠한함수를사용해야하는지지정한것 표준을두어각각다른시스템에응용프로그램을 porting 하는것을용이하게하기위한목적 open(), close(), read(), write() 등 System Call 소프트웨어인터럽트를통해커널에서비스를요청하는것 Linux 에서는 POSIX API 를준수하는 library 함수안에서 system call 함수를호출함으로써 system call 을사용함 8
POSIX API POSIX API 의전체구조도 9
POSIX API POSIX API 에서시스템콜사용의개념도 10
시스템콜인터페이스 시스템콜호출시내부동작개념도 11
커널에시스템콜추가 새로운시스템콜만들기 기존커널에서제공하지않는서비스를 user application 에제공 단계 커널수정 System Call 번호할당 System Call 호출테이블등록 System Call 호출함수구현 Kernel 컴파일및 target board 에적재 User application 제작 새로구현한 System Call 을사용하는 application 제작 library 작성 ( 반드시필요한것은아님 ) 커널이미지에포함시켜서 target board 에적재 12
커널에시스템콜추가 커널에시스템콜을추가하는과정 13
커널에시스템콜추가 시스템콜번호할당 리눅스커널이제공하는모든시스템호출은각각고유번호를가지고있으며, 그번호는 [kernel]/include/asmarm/unistd.h 에정의되어있음 새로추가할시스템콜의고유번호를할당하기위해 [kernel]/arch/arm/include/asm/unistd.h 파일열기 root@esp:~/download# vi /root/download/kernel-2.6.35/ arch/arm/include/asm/unistd.h 14
커널에시스템콜추가관련파일들 unistd.h 파일내용 15 /* * This file contains the system call numbers. */ #define NR_restart_syscall ( NR_SYSCALL_BASE+ 0) #define NR_exit ( NR_SYSCALL_BASE+ 1) #define NR_fork ( NR_SYSCALL_BASE+ 2) #define NR_read ( NR_SYSCALL_BASE+ 3) #define NR_write ( NR_SYSCALL_BASE+ 4) #define NR_open ( NR_SYSCALL_BASE+ 5) #define NR_close ( NR_SYSCALL_BASE+ 6) ( 중략 ) #define NR_pwritev ( NR_SYSCALL_BASE+362) #define NR_rt_tgsigqueueinfo ( NR_SYSCALL_BASE+363) #define NR_perf_event_open ( NR_SYSCALL_BASE+364) #define NR_recvmmsg ( NR_SYSCALL_BASE+365) /* added for system call example */ #define NR_mysyscall ( NR_SYSCALL_BASE+366)
커널에시스템콜추가관련파일들 unistd.h 파일내용 시스템콜번호는 unistd.h 파일내에 NR_ 의접두어와시스템콜명으로구성된이름으로정의되어있음 ( 예 : #define NR_exit) 타겟보드에서사용되는커널 2.6.35 의경우 unistd.h 파일내용을보면기존에 365 번까지정의되어있는것을확인할수있음 365 번다음번호인 366 번번호를지정하고시스템콜명은 mysyscall 로함 16
새로운시스템콜등록 시스템콜관리테이블에등록 시스템콜을관리하는테이블인 sys_call_table 에시스템콜서비스루틴함수를등록 시스템콜테이블은 [kernel]/arch/arm/kernel/entrycommon.s 에 sys_call_table 이라는엔트리로구현되어있음 entry-common.s 파일열기 root@esp:~/download# vi /root/download/kernel-2.6.35/ arch/arm/kernel/entry-common.s 17
커널에시스템콜추가관련파일들 entry-common.s 파일내용 ( 생략 ) #define CALL(x).equ NR_syscalls,NR_syscalls+1 #include "calls.s" #undef CALL #define CALL(x).long x #ifdef CONFIG_FUNCTION_TRACER #ifdef CONFIG_DYNAMIC_FTRACE ( 생략 ) 18
커널에시스템콜추가관련파일들 entry-common.s 파일내용 시스템콜테이블에는시스템콜처리함수의시작주소들이들어있음 각함수들은 [kernel]/arch/arm/include/asm/unistd.h 에정의되어있는시스템콜번호를인덱스로하여접근 실제적인 sys_call_table 내용관리는 entry-common.s 파일내부를보면 calls.s 라는파일에서관리하고있음을알수있음 파일 entry-common.s 를닫고, calls.s 파일열기 root@esp:~/download/kernel-2.6.35# vi /root/download/ kernel-2.6.35/arch/arm/kernel/calls.s 19
커널에시스템콜추가관련파일들 calls.s 파일내용 /* 0 */ CALL(sys_restart_syscall) CALL(sys_exit) CALL(sys_fork_wrapper) CALL(sys_read) CALL(sys_write) /* 5 */ CALL(sys_open) CALL(sys_close) 20
커널에시스템콜추가관련파일들 calls.s 파일내용 시스템콜서비스루틴이름은 calls.s 파일내에시스템콜고유번호순서대로순차적으로등록됨 추가하고자하는시스템콜은 366 번이므로 /* 0 */ /* 5 */ 등으로부터마크된번호를기초로하여 365 를찾고그뒤에 366 번을추가 시스템콜서비스루틴이름은시스템콜명앞에접두어 sys_ 를붙임 여기서사용된시스템콜명은 mysyscall 이므로, 이에해당하는시스템콜서비스루틴명은 sys_mysyscall 임 21
새로운시스템콜등록 calls.s 파일내용 /* 360 */ CALL(sys_inotify_init1) CALL(sys_preadv) CALL(sys_pwritev) CALL(sys_rt_tgsigqueueinfo) CALL(sys_perf_event_open) /* 365 */ CALL(sys_recvmmsg) /* added for system call example */ /* 366 */ CALL(sys_mysyscall) 22
커널에시스템콜처리함수작성 시스템콜처리함수구현 이제사용자프로그램에서요청한시스템콜을실제로처리해주는함수를구현해야함 시스템콜을처리해주는함수들은커널최상위디렉토리밑의 kernel 디렉토리, 즉 [kernel]/kernel/ 에모아져있음 추가한시스템콜 mysyscall() 에서는간단히한문장을출력하는것으로하고, test_syscall.c 파일로저장하는것으로함 test_syscall.c 파일작성하기 root@esp:~/download/kernel-2.6.35# vi /root/download/ kernel-2.6.35/kernel/test_syscall.c 23
커널에시스템콜처리함수작성 test_syscall.c #include <linux/linkage.h> #include <linux/errno.h> #include <linux/kernel.h> asmlinkage long sys_mysyscall(void); asmlinkage long sys_mysyscall(void) { printk("welcome to the embedded system.\n"); return -ENOSYS; } 24
새로운커널컴파일 커널컴파일 앞서구현한 test_syscall.c 의내용이커널에반영되도록커널을컴파일해야함 커널에서시스템콜처리루틴들에대한컴파일규칙은 [kernel]/kernel/makefile 에지정되어있음 이파일을열고오브젝트생성규칙을지정하는부분에 test_syscall.o 를추가 root@esp:~/download/kernel-2.6.35# vi /root/download/ kernel-2.6.35/kernel/makefile 25
새로운커널컴파일 커널컴파일 Makefile 내용 # # Makefile for the linux kernel. # obj-y = sched.o fork.o exec_domain.o panic.o printk.o \ cpu.o exit.o itimer.o time.o softirq.o resource.o \ sysctl.o sysctl_binary.o capability.o ptrace.o timer.o user.o \ signal.o sys.o kmod.o workqueue.o pid.o \ rcupdate.o extable.o params.o posix-timers.o \ kthread.o wait.o kfifo.o sys_ni.o posix-cpu-timers.o mutex.o \ hrtimer.o rwsem.o nsproxy.o srcu.o semaphore.o \ notifier.o ksysfs.o pm_qos_params.o sched_clock.o cred.o \ async.o range.o test_syscall.o obj-$(config_have_early_res) += early_res.o obj-y += groups.o 26
새로운커널컴파일 커널컴파일 커널소스의최상위디렉토리로이동 root@esp:~/download/kernel-2.6.35# cd /root/download/kernel- 2.6.35/ 컴파일은크게세단계로이루어짐 첫번째, 이전커널컴파일과정에서생성된파일들을 make distclean 명령어를이용하여삭제 두번째, Achro-210T 보드에맞는커널설정을해야하는데, make achro210t_defconfig 명령어를이용 마지막단계, make 명령어를이용하여커널을컴파일 27
새로운커널컴파일 커널컴파일 이전커널컴파일과정에서생성된파일들삭제 root@esp:~/download/kernel-2.6.35# make distclean CLEAN arch/arm/boot/compressed CLEAN arch/arm/boot CLEAN /root/download/kernel-2.6.35 ( 생략 ) CLEAN include/config include/generated CLEAN.config.version include/linux/version.h Module.symvers root@esp:~/download/kernel-2.6.35# 28
새로운커널컴파일 커널컴파일 Achro-210T 보드에맞게커널컴파일되도록 make achro210t_defconfig 명령어를사용하여커널설정정보를가지고있는.config 파일을생성 root@esp:~/download/kernel-2.6.35# make achro210t_defconfig HOSTCC scripts/basic/fixdep HOSTCC scripts/basic/docproc HOSTCC scripts/basic/hash.( 생략 ) HOSTCC scripts/kconfig/zconf.tab.o HOSTLD scripts/kconfig/conf # # configuration written to.config # 29
새로운커널컴파일 커널컴파일 make 명령어를사용하여커널이미지 (zimage) 생성 root@esp:~/download/kernel-2.6.35# make ( 생략 ) CC arch/arm/boot/compressed/decompress.o SHIPPED arch/arm/boot/compressed/lib1funcs.s AS arch/arm/boot/compressed/lib1funcs.o LD arch/arm/boot/compressed/vmlinux OBJCOPY arch/arm/boot/zimage Kernel: arch/arm/boot/zimage is ready Building modules, stage 2. MODPOST 3 modules ( 생략 ) LD [M] drivers/scsi/scsi_wait_scan.ko root@esp:~/download/kernel-2.6.35# 30
새로생성한커널이미지올리기 컴파일된커널이미지를타겟보드에적재하기 이제새로생성한시스템콜인 mysyscall 을사용하려면추가된시스템콜을담고있는커널이미지 (zimage) 를타겟보드에있는 MicroSD(µSD) 카드에써야함 호스트컴퓨터와 Achro-210T 타겟보드를직렬케이블과 USB OTG 케이블로연결 USB to Serial 케이블 호스트에서타겟보드의콘솔화면연결에사용 USB OTG 케이블 zimage 파일을전송하기위해서필요 31
새로생성한커널이미지올리기 컴파일된커널이미지를타겟보드에적재하기 호스트컴퓨터와타겟보드연결 32
새로생성한커널이미지올리기 컴파일된커널이미지를타겟보드에적재하기 minicom 설정하기 root@esp:~# minicom -s minicom 설정메뉴 +-----[configuration]------+ Filenames and paths File transfer protocols Serial port setup Modem and dialing Screen and keyboard Save setup as dfl Save setup as.. Exit Exit from Minicom +--------------------------+ 33
새로생성한커널이미지올리기 컴파일된커널이미지를타겟보드에적재하기 Serial port setup 선택화면 +-----------------------------------------------------------------------+ A - Serial Device : /dev/ttyusb0 B - Lockfile Location : /var/lock C - Callin Program : D - Callout Program : E - Bps/Par/Bits : 115200 8N1 F - Hardware Flow Control : No G - Software Flow Control : No Change which setting? +-----------------------------------------------------------------------+ 설정변경된내용을 Save setup as dfl 을선택하여저장하고 Exit 을선택하여종료 34
새로생성한커널이미지올리기 컴파일된커널이미지를타겟보드에적재하기 35 minicom 실행후타겟보드전원켜기 OK U-Boot 1.3.4 (Oct 12 2013-20:38:07) for AchroPV210 CPU: S5PV210@1000MHz(OK) APLL = 1000MHz, HclkMsys = 200MHz, PclkMsys = 100MHz MPLL = 667MHz, EPLL = 80MHz HclkDsys = 166MHz, PclkDsys = 83MHz HclkPsys = 133MHz, PclkPsys = 66MHz SCLKA2M = 200MHz Serial = CLKUART Board: AchroPV210 DRAM: 512 MB SD/MMC: 1886MB In: serial Out: serial Err: serial Hit any key to stop autoboot: 3
새로생성한커널이미지올리기 컴파일된커널이미지를타겟보드에적재하기 마지막의 Hit any key to stop autoboot 다음에나오는숫자가 0 이되기전에아무키나입력 부트로더명령어대기상태로들어가기 Hit any key to stop autoboot: 0 PV210 # 36
새로생성한커널이미지올리기 컴파일된커널이미지를타겟보드에적재하기 커널이미지전송하기 37
추가한시스템콜검증 시스템콜용포장함수 syscall() 사용법 라이브러리 libc 에서제공하는시스템콜함수들의포장함수 (wrapper routine) 처럼일반프로그램에서도쉽게포장함수를선언하여사용할수있도록 linux/unistd.h 헤더파일에선언되어있는매크로인 syscall() 을사용하여처리 예전커널 2.4 에서는인자개수에따라서 _syscall0() 부터 _syscall5() 까지여섯개의매크로를이용하였지만, 커널 2.6 부터는해당매크로를사용할수없음 syscall() 의경우매크로로처리하던기존커널 2.4 버전과달리, 커널 2.6 버전부터는 syscall() 자체도시스템콜로호출 38
추가한시스템콜검증 시스템콜용포장함수 syscall() 사용법 unistd.h 파일 #define NR_fstat ( NR_SYSCALL_BASE+108) /* 109 was sys_uname */ /* 110 was sys_iopl */ #define NR_vhangup ( NR_SYSCALL_BASE+111) /* 112 was sys_idle */ #define NR_syscall ( NR_SYSCALL_BASE+113) /* syscall to call a syscall! */ #define NR_wait4 ( NR_SYSCALL_BASE+114) #define NR_swapoff ( NR_SYSCALL_BASE+115) 39
추가한시스템콜검증 시스템콜용포장함수 syscall() 사용법 여러개의매크로를통해서처리되는시스템콜을하나의시스템콜을통하여효율적으로처리하기위해 "arch/arm/kernel/calls.s" 에시스템콜로등록 calls.s 파일 /* 110 */ CALL(sys_ni_syscall) /* was sys_iopl */ CALL(sys_vhangup) CALL(sys_ni_syscall) CALL(OBSOLETE(sys_syscall)) /* call a syscall */ CALL(sys_wait4) /* 115 */ CALL(sys_swapoff) CALL(sys_sysinfo) CALL(OBSOLETE(ABI(sys_ipc, sys_oabi_ipc))) CALL(sys_fsync) 40
추가한시스템콜검증 시스템콜용포장함수 syscall() 사용법 41 해당시스템콜이호출되면 "./arch/arm/kernel/entrycommon.s" 에등록된 Special system call wrappers 를실행하여시스템콜을처리 entry-common.s 파일 #include "calls.s" #undef ABI #undef OBSOLETE /*==================================================== * Special system call wrappers */ @ r0 = syscall number @ r8 = syscall table sys_syscall: bic scno, r0, # NR_OABI_SYSCALL_BASE ( 생략 ) ENDPROC(sys_syscall)
추가한시스템콜검증 응용프로그램작성하기 응용프로그램에서시스템콜을호출시키는코드 no_lib_syscall.c 를작성하여실행해보기 이파일은 /root/work 디렉토리하위에 systemcall 디렉토리를만들어이디렉토리하위에저장 no_lib_syscall.c 응용프로그램에서는시스템콜호출을포장함수용시스템콜을이용 no_lib_syscall.c 파일작성 root@esp:~# cd ~/work/ root@esp:~/work# mkdir systemcall root@esp:~/work# cd systemcall/ root@esp:~/work/systemcall# vi no_lib_syscall.c 42
추가한시스템콜검증 응용프로그램작성하기 no_lib_syscall.c /* File Name : no_lib_syscall.c */ #include <linux/unistd.h> #define NR_mysyscall 366 int main(int argc, char **argv) { syscall( NR_mysyscall); return 0; } 43
추가한시스템콜검증 추가된시스템콜확인용응용프로그램컴파일 44
추가한시스템콜검증 타겟보드에서검증하기 시스템콜검증용응용프로그램이제대로동작하는지를알아보기위해작성된코드들을타겟보드에서실행시켜보기 NFS 를이용하여타겟보드로파일전송 호스트와타겟보드의 IP 주소설정하기 [ 호스트에서수행 ] root@esp:~# ifconfig eth1 192.168.10.100 [Achro-210T 에서수행 ] root@achro210t:~# ifconfig eth0 192.168.10.110 45
추가한시스템콜검증 타겟보드에서검증하기 마운트하기 root@achro210t:~# mount -t nfs -o nolock 192.168.10.100:/root /root/nfs root@achro210t:~# cd ~/nfs/work/systemcall root@achro210t:~/nfs/work/systemcall#./my_syscall Welcome to the embedded system. root@achro210t:~/nfs/work/systemcall# 타겟보드에서시스템콜검증용프로그램실행 46
인자를갖는시스템콜작성 두개의정수의연산자에해당하는사칙연산을수행하여정수결과값을출력하는시스템콜함수작성하기 시스템콜추가하기 [kernel]/arch/arm/include/asm/unistd.h 파일을열어 367 번을지정 시스템콜명은 mycal root@esp:~# cd /root/download/kernel-2.6.35/arch/arm/include/asm/ root@esp:~/download/kernel-2.6.35/arch/arm/include/asm# vi unistd.h 47
인자를갖는시스템콜작성 시스템콜추가하기 unistd.h 파일 #define NR_perf_event_open ( NR_SYSCALL_BASE+364) #define NR_recvmmsg ( NR_SYSCALL_BASE+365) /* added for system call example */ #define NR_mysyscall ( NR_SYSCALL_BASE+366) /* added for calculator system call example */ #define NR_mycal ( NR_SYSCALL_BASE+367) 48
인자를갖는시스템콜작성 시스템콜추가하기 [kernel]/arch/arm/kernel/calls.s 파일을열어아래와같이새로운함수내용을추가 root@esp:~# cd root@esp:~# cd download/kernel-2.6.35/arch/arm/kernel/ root@esp:~/download/kernel-2.6.35/arch/arm/kernel# vi calls.s call.s 파일 /* 365 */ CALL(sys_recvmmsg) /* added for system call example */ /* 366 */ CALL(sys_mysyscall) /* added for calculator system call example */ /* 367 */ CALL(sys_mycal) 49
인자를갖는시스템콜작성 시스템콜처리함수구현 mycal_syscall.c 파일 /* File Name : mycal_syscall.c */ #include <linux/linkage.h> #include <linux/errno.h> #include <linux/kernel.h> asmlinkage long sys_mycal(int a, int b, char op); 50 asmlinkage long sys_mycal(int a, int b, char op) { switch(op) { case '+' : printk("%d + %d = %d \n", a, b, a+b); break;
인자를갖는시스템콜작성 시스템콜처리함수구현 mycal_syscall.c 파일 } case '-' : printk("%d - %d = %d \n", a, b, a-b); break; case 'X' : case 'x' : printk("%d x %d = %d \n", a, b, a*b); break; case '/' : printk("%d / %d = %d \n", a, b, a/b); break; } return -ENOSYS; 51
인자를갖는시스템콜작성 커널컴파일및타겟보드에적용하기 앞서구현한 mycal_syscall.c 의내용이커널에반영되도록커널을컴파일해야함 [kernel]/kernel/makefile 을열고오브젝트생성규칙을지정하는부분에 mycal_syscall.o 를추가 root@esp:~# cd /root/download/kernel-2.6.35/kernel/ root@esp:~/download/kernel-2.6.35/kernel# vi Makefile 52
인자를갖는시스템콜작성 커널컴파일및타겟보드에적용하기 53 Makefile # # Makefile for the linux kernel. # obj-y = sched.o fork.o exec_domain.o panic.o printk.o \ cpu.o exit.o itimer.o time.o softirq.o resource.o \ sysctl.o sysctl_binary.o capability.o ptrace.o timer.o user.o \ signal.o sys.o kmod.o workqueue.o pid.o \ rcupdate.o extable.o params.o posix-timers.o \ kthread.o wait.o kfifo.o sys_ni.o posix-cpu-timers.o mutex.o \ hrtimer.o rwsem.o nsproxy.o srcu.o semaphore.o \ notifier.o ksysfs.o pm_qos_params.o sched_clock.o cred.o \ async.o range.o test_syscall.o mycal_syscall.o obj-$(config_have_early_res) += early_res.o obj-y += groups.o
인자를갖는시스템콜작성 커널컴파일및타겟보드에적용하기 커널컴파일 (make distclean) root@esp:~/download/kernel-2.6.35# make distclean CLEAN arch/arm/boot/compressed CLEAN arch/arm/boot CLEAN /root/download/kernel-2.6.35 ( 생략 ) CLEAN include/config include/generated CLEAN.config.version include/linux/version.h Module.symvers 커널컴파일 (make achro210t_defconfig) 54 root@esp:~/download/kernel-2.6.35# make achro210t_defconfig HOSTCC scripts/basic/fixdep ( 생략 ) HOSTLD scripts/kconfig/conf # # configuration written to.config #
인자를갖는시스템콜작성 커널컴파일및타겟보드에적용하기 커널컴파일 (make) root@esp:~/download/kernel-2.6.35-111202# make.( 생략 ) OBJCOPY arch/arm/boot/zimage Kernel: arch/arm/boot/zimage is ready Building modules, stage 2. MODPOST 3 modules CC crypto/ansi_cprng.mod.o LD [M] crypto/ansi_cprng.ko CC drivers/media/video/gspca/gspca_main.mod.o LD [M] drivers/media/video/gspca/gspca_main.ko CC drivers/scsi/scsi_wait_scan.mod.o LD [M] drivers/scsi/scsi_wait_scan.ko root@esp:~/download/kernel-2.6.35# 55
인자를갖는시스템콜작성 커널업데이트 새로생성된커널이미지 (zimage) 를타겟보드로전송하여추가한시스템콜을포함하는커널로업데이트하기 호스트컴퓨터와타겟보드연결 minicom 실행 부트로더명령어모드진입 커널이미지전송 커널업데이트 56
인자를갖는시스템콜작성 응용프로그램작성및검증 응용프로그램에서시스템콜을호출시키는코드 test_mycal.c 를작성하여실행해보기 이파일은이전에작업하였던 /root/work/systemcall 디렉토리하위에저장 test_mycal.c 응용프로그램에서는시스템콜호출을포장함수용시스템콜을이용 root@esp:~# cd ~/work/systemcall/ root@esp:~/work/systemcall# vi test_mycal.c 57
인자를갖는시스템콜작성 응용프로그램작성및검증 test_mycal.c /* File Name : test_mycal.c */ #include <linux/unistd.h> #include <string.h> #include <stdio.h> #define NR_mycal 367 int main(int argc, char **argv) { int a, b; char op; 58
인자를갖는시스템콜작성 응용프로그램작성및검증 test_mycal.c } if(argc!= 4) { printf("usage :./test_mycal num op num \n"); return 0; } a = atoi(argv[1]); b = atoi(argv[3]); op = argv[2][0]; syscall( NR_mycal, a, b, op); return 0; 59
인자를갖는시스템콜작성 응용프로그램작성및검증 테스트프로그램컴파일 root@esp:/work/code/no_lib_syscall# arm-linux-gcc o test_mycal I/usr/src/kernel-2.6.35/ test_mycal.c 호스트컴퓨터와타겟보드의 IP 주소설정 [ 호스트에서수행 ] root@esp:~# ifconfig eth1 192.168.10.100 [Achro-210T 에서수행 ] root@achro210t:~# ifconfig eth0 192.168.10.110 60
인자를갖는시스템콜작성 응용프로그램작성및검증 마운트하기 root@achro210t:~# mount -t nfs -o nolock 192.168.10.100:/root /root/nfs 테스트프로그램실행결과 61