System call User Level Libraries (ex: C Runtime Library) User Program & Application System Call Interface (X 86 Interface 0 x 80) Kernel Level Memory Management Virtual File System (VFS) Process Management Buffer Char Block Device Driver Kernel Level Hardware Control H/W Level Hardware Control OS 2 강의교재 3
System call 처리과정 fork system call의 흐름 ENTRY(system_call) user task IDT main() {. . // 0 x 00 fork(); devide_error(); Debug(); . . . Nmi(); } /* arch/i 386/kernel/entry. S */ SAVE_ALL … Call *SYMBOL_NAME(sys_call_table) (, %eax, 4) . . . 0 x 80 libc. c System_call(); . . . …ret_from_sys_call(schedule, signal, bh_active, nested interrupt handling) . . . sys_call_table fork() { 1 sys_exit(); . . . 2 sys_fork(); movl 2, %eax 3 sys_read(); int $0 x 80 4 sys_write(); sys_fork(); …} . . . /* kernel/fork. c */ . . . OS 2 강의교재 5
파일 구성 모든 시스템 콜 번호는 /include/asm/unistd. h 에 정의 #define __NR_exit 1 #define __NR_fork 2 #define __NR_read 3. . . #define __NR_sched_getaffinity 242 시스템 콜 테이블은 /arch/i 386/entry. S에 정의. long SYMBOL_NAME(sys_ni_syscall). long SYMBOL_NAME(sys_exit). long SYMBOL_NAME(sys_fork). long SYMBOL_NAME(sys_read). . long SYMBOL_NAME(sys_getaffinity) OS 2 강의교재 7
실습 시스템 콜 추가 linux/include/asm/unistd. h 을 편집 ‘#define __NR_newcall 253’ 을 추가 OS 2 강의교재 9
실습 arch/i 386/kernel/entry. S 을 편집해서 시스템콜 테이블 등록. long SYMBOL_NAME(sys_newcall) 을 추가 OS 2 강의교재 10