본문 바로가기

OS /Linux 2.6 kernel basic (LKD)

05. System Calls

1. System Call (syscall)

; application이 h/w를 사용할 수 있도록 kernel이 추상화시켜 제공하는 interface 

(for. user application이 kernel에 진입하기 위한 유일한 수단, because task는 kernel mode에 있어야만 h/w를 사용할 수 있기 때문에)


cf) 다음 장의 interrupt, exception과 비교하기 (kernel code를 수행하는 context관점에서)



- 추상화된 h/w interface제공

- system 보안, 안정성 제공 (제공된 interface내에서 kernel resource 활용)

- virtualized system 환경 제공


* API (Application Programming Interface)

; application은 보통 syscall을 직접 사용 x, API를 이용해 접근함.






2. System Call Handler

; syscall number에 맞는 syscall을 찾아 호출

- exception이 발생하면 exception handler가 실행 (이 때 syscall을 호출하는 경우 exception handler를 syscall handler로 봄)

- (in x86) syscall을 통한 kernel로의 진입 방법

-int $0x80 (128번 interrupt가 system call exception)

-최근 sysenter (더 빠름)


*sysenter가 더 빠른 이유

-int 0x80은 context_switch에 필요한 모든 값을 백업/복구

-sysenter는 필요한 소수의 register만 백업/복구 

-parameter passing

-syscall number : %eax를 통해 전달

-parameters : register에 저장, 6개 이상일 시 모든 parameter가 저장된 user space address를 가리키는 pointer를 register에 저장

*asmlinkage 선언시 

해당 함수의 parameter를 stack에서만 찾을 수 있게 register가 아닌 stack에 참조하도록 compile함

*asmlinkage 사용이유 

register에 저장하는 방식이 빠르나, 직접 작성한 assembly code를 실행 할 경우 문제가 있을 수 있기 때문에 stack에 저장

-return value :  %eax를 통해 전달


* register 로 user space address 전달 하기 때문에 kernel에서 user space address로 access할 수 있음.



3. Process Context

; user application의 system call request으로 user application '대신에' kernel code를 수행하고 있는 상태 


- current()시 syscall 호출한 task 반환

- process context 에서 가능한 상태는 다음과 같음 

-sleeping

-syscall이 kernel에 대다수의 기능을 사용할 수 있음

-cf. interrupt handler

-실행중에 sleep상태가 될 수 있는 함수들은 interrupt context에서 사용 불가

-preemptible

-다른 task에 의해 preemption될 수 있음

-재진입이 가능해야함

-preemption 후 next process가 prev process와 같은 system call 실행할 수 있음 





'OS > Linux 2.6 kernel basic (LKD)' 카테고리의 다른 글

08. Interrupt (2) Bottom-Halves [예정]  (0) 2019.02.11
07. Interrupt (1) Top-Halves  (0) 2019.02.11
04. Process Scheduling  (0) 2019.01.25
03. Process Management  (2) 2019.01.25