2021. 9. 27. 13:22ㆍLinux
- 목차
System call
system과 user space process간 상호 작용할 수 있게 해 주는 interface가 ssytem call
커널과 통신
system call --> OS의 abstraction
system call은
1) user space에 hardware interface를 abstraction 형태로 제공
2) system 보안 및 안정성 향상
trap을 제외하면 system call은 정상적인 방법으로 kernel에 진입하는 유일한 수단
장치 file이나 /proc file system을 이용하는 다른 interface도 결국은 system call을 통하게 됨
API, POSIC, C library (libc, bionic c)
application은 일반적으로 system call을 직접 사용하지 않고 API(Application Programming Interface)
를 사용 - 즉, OS independent하게 됨
API는 하나 혹은 그 이상의 system call을 사용해 구현됨 (전혀 사용하지 않는 경우도 있음)
유닉스에서 가장 유명한 API는 바로 POSIX 표준
UNIX 기반 OS간의 이식성을 목적으로 정해진 IEEE 표준의 집합
Linux system call interface는 C library 형태로 제공됨
UNIX interface의 공통적인 모토는 "정책이 아닌 방식을 제공하라" 임
즉, UNIX system call은 특정 기능을 아주 일반적인 형태로 제공한다.
Syscall
System call을 줄여서 syscall이라고 함
C library에 정의된 함수를 호출하는 방식
system call에서 오류가 발생하는 경우 C library는 전역 변수인 errno에 특정 오류 코드를 기록
perror()를 사용하면 이 변수의 값을 사람이 보기 편한 문자열 형태로 바꿀 수 있다.
ex.
getpid() system call
SYSCALL_DEFINE0(getpid) {
return task_tgid_vnr(current); // current->tgid 값을 반환
}
SYSCALL_DEFINE0은 인자가 없는 system call이며, 실제로 다음과 같은 macro이다.
asmlinkage long sys_getpid(void)
asmlinkage directive는 해당 함수의 인자를 stack에서만 찾으라고 compiler에게 알려줌
32 bits와 64 bits간의 호환을 위해 int 형 return이 필요한 경우 long을 사용한다.
getpid() system call은 sys_getpid라는 이름으로 정의된다.
모든 system call이 사용하는 명명규칙
bar()라는 system call은 sys_bar라는 함수로 구현
system call 번호
모든 system call에는 syscall 번호가 할당됨 (table의 indexing용)
특정 system call을 참조하는데 사용하는 고유번호
system call 번호는 중요함
한번 할당되면 변경 불가
변경 시 실행 안됨
즉, system call 번호를 재사용하지 않음
sys_ni_syscall()
구현되지 않은 system call을 의미
-ENOSYS (유효하지 않음)을 반환
system call이 제거된 경우 혹은 사용 불가능한 상황 시 이것으로 공백 메우기를 수행
sys_call_table
등록된 모든 system call의 목록을 저장하는 table
CPU architecture 별로 존재
x86-64의 경우
arch/i386/kernel/syscal_64.c file에 저장
system call 성능
Linux의 system call은 다른 OS보다 context switching 속도의 빠름으로 빠르다.
system call handler
커널에 신호를 보내는 방법으로 Software interrupt (SWI @ ARM) 을 사용
예외가 발생하면 system은 kernel mode로 전환되고 exception handler가 실행
x86에서는 Software interrupt는 int $0x80 명령을 통해 발생시키는 128번 interrupt임
-> exception vector의 128번 handler를 실행
system 호출 handler는 system_call() 함수로 구현되어 있으며,
x86-64의 경우 entry_64.S file에 assembly로 구현
알맞은 system call 찾기
user space에서 호출한 sysetm call을 kernel에서 구분하기 위해서는 '번호'를 커널로 전달해야 함
x86은 eax register에 system call number를 전달.
system call handler가 eax register에서 값을 read
system_call() 내에서는 주어진 system call number를 NR_syscalls 값과 비교해 유효성 검사
NR_syscalls값과 같거나 크면 -ENOSYS 오류를 리턴
call *sys_clal_table(, %rax, 8) <-- 8x8 = 64
system call table의 각 item은 64 bits(8 bytes)
kernel은 system call number * 8 하여 offset 계산
read()
|
&nbs
'Linux' 카테고리의 다른 글
virtual address space (0) | 2021.09.27 |
---|---|
input driver (0) | 2021.09.27 |
Ioremap 코드 분석 (0) | 2021.09.27 |
Linux의 kmalloc과 vmalloc에 대해서 (0) | 2021.09.27 |
pthread_barrier_t 사용법 (pthread barrier) (0) | 2021.09.27 |