system call

21
1 System Call Linux Kernel 수수 3 수수

Upload: william-dale

Post on 01-Jan-2016

74 views

Category:

Documents


3 download

DESCRIPTION

Linux Kernel 수업 3 번째. System Call. 목 차. System call 처리 과정 System call 추가 실습 파라미터를 이용한 시스템 콜 실습 구조체를 이용한 시스템 콜 실습. System call. Libraries (ex: C Runtime Library). User Program & Application. User Level. System Call Interface (X86 Interface 0x80). Kernel Level. Memory Management. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: System Call

1

System CallSystem Call

Linux Kernel 수업 3 번째

Page 2: System Call

OS2 강의교재 2

목 차System call 처리 과정System call 추가 실습파라미터를 이용한 시스템 콜 실습구조체를 이용한 시스템 콜 실습

Page 3: System Call

OS2 강의교재 3

System call

Memory Management

H/W Level

Kernel Level

User Level

Kernel Level

Hardware ControlHardware Control

Hardware ControlHardware Control

Libraries(ex: C Runtime Library)

System Call Interface (X86 Interface 0x80)System Call Interface (X86 Interface 0x80)

Virtual File System (VFS) Process Management

BufferBuffer

CharChar BlockBlock

Device DriverDevice Driver

User Program & Application

Page 4: System Call

OS2 강의교재 4

System call 처리과정시스템 콜 흐름의 예

1. 사용자 프로세스에서 시스템 콜 사용

2. Libc.a Argument stack 에 넣음 시스템 콜 번호 저장 트랩발생

3. system_call() IDT 에 의해 트랩 시작 sys_call_table 사용 핸들러 실행

4. 시스템 콜 핸들러 함수 시스템 콜 핸들러 함수는 256 개 까지 가능 ( 커널 2.4.20)

Page 5: System Call

OS2 강의교재 5

System call 처리과정

ENTRY(system_call)

/* arch/i386/kernel/entry.S */

SAVE_ALL

Call *SYMBOL_NAME(sys_call_table)

(, %eax, 4)

…ret_from_sys_call(schedule, signal,

bh_active, nested interrupt handling)

ENTRY(system_call)

/* arch/i386/kernel/entry.S */

SAVE_ALL

Call *SYMBOL_NAME(sys_call_table)

(, %eax, 4)

…ret_from_sys_call(schedule, signal,

bh_active, nested interrupt handling)

sys_fork();

/* kernel/fork.c */

fork system call 의 흐름

main() { ..//

fork();

...

}

user task

libc.c

0x00

0x80

IDT

devide_error();

Debug();

Nmi();

...

System_call();

...

sys_call_tablesys_exit();

sys_fork();

sys_read();

sys_write();

...

1

2

3

4

..

...

fork()

{

...

movl 2, %eax

int $0x80

…}

...

Page 6: System Call

OS2 강의교재 6

IDT(interrupt Descriptor Table)I386 에서는 IDT 를 통해 모든 인터럽트가 관리시스템 콜은 0x80 번의 인터럽트를 사용

Page 7: System Call

OS2 강의교재 7

파일 구성모든 시스템 콜 번호는 /include/asm/unistd.h 에 정의

시스템 콜 테이블은 /arch/i386/entry.S 에 정의

#define __NR_exit 1

#define __NR_fork 2

#define __NR_read 3

...

#define __NR_sched_getaffinity 242

.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)

Page 8: System Call

OS2 강의교재 8

실 습시스템 콜 추가

syscall_number 할당linux/include/asm/unistd.h 에 정의

맵핑 테이블 등록 (sys_call_table)arch/i386/entry.S 에 시스템 콜 테이블 등록

new system call 함수를 커널에 작성/kernel 디렉토리에 newcall.c 를 작성

커널 재 컴파일

새로 추가한 system call 을 사용해 applicatioin 작성시스템 콜이 추가된 커널로 부팅하여 응용 프로그램을 작성

Page 9: System Call

OS2 강의교재 9

실 습시스템 콜 추가

linux/include/asm/unistd.h 을 편집 ‘#define __NR_newcall 253’ 을 추가

Page 10: System Call

OS2 강의교재 10

실 습arch/i386/kernel/entry.S 을 편집해서 시스템콜 테이블 등록

.long SYMBOL_NAME(sys_newcall) 을 추가

Page 11: System Call

OS2 강의교재 11

실 습/kernel 디렉토리에 newcall.c 를 작성

Page 12: System Call

OS2 강의교재 12

실 습/kernel 디렉터리에 /kernel/Makefile 을 편집

newcall.o 를 추가커널 컴파일 시에 자동으로 목적 파일을 생성함

Page 13: System Call

OS2 강의교재 13

실 습커널 재컴파일

앞장 참조

새로 컴파일한 커널을 부트로더에 등록

리부팅 후 새로 컴파일한 커널로 부팅

Page 14: System Call

OS2 강의교재 14

실 습새로운 시스템 콜 (253 번 ) 을 사용할 프로그램 test.c 파일 작성

시스템 콜의 사용을 위한 stub 작성이 필요함 _syscall0(type,name) 은 인자가 없음을 의미( type: 함수리턴형 , name: 함수이름 )

_syscall1(type,name,type1,type_name) 형식 지정한 type1 변수는 ebx cpu범용레지스터에 들어감

인자가 2 개면 _syscall2,..

unistd.h 에는 인자 6 까지 변환하는 매크로 존재 .

Page 15: System Call

OS2 강의교재 15

실 습파일 작성후 컴파일시 에러

개발 커널에서의 unistd.h 불일치 수정

Page 16: System Call

OS2 강의교재 16

실 습Application 실행

dmesg 명령어를 사용하면 Hello Kernel 메세지를 볼 수 있음

Page 17: System Call

OS2 강의교재 17

파라미터를 전달하는 시스템 콜커널 영역과 유저 영역 사이에 값을 교환하는 Kernel API

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, const void __user * from, unsigned long n)유저영역에서 블록데이터를 받아옴

Page 18: System Call

OS2 강의교재 18

실 습kernel/newcall.c 를 편집

Page 19: System Call

OS2 강의교재 19

실 습커널 컴파일 후 응용 프로그램 수정

파라메터가 3 개이므로 _syscall3 을 이용

내부 선언되는 개수는 8 개가 됨 .

Page 20: System Call

OS2 강의교재 20

구조체를 사용한 시스템 콜newcall.c 편집

Page 21: System Call

OS2 강의교재 21

실 습커널 컴파일 후 , 응용 프로그램 수정