2014년 10월 6일 월요일

리눅스 커널 심층 분석 - 5장, 시스템 호출

커널과 통신 
  • system call apps 정상적으로 커널로 진입하는 유일한 방법임 
  • 장치 파일이나 /proc system call 통하게 되어 있음 
API, POSIX, C 라이브러리 
  • POSIX: 유닉스 기반 운영체제 간의 이식성 제공을 목적으로 정해진 IEEE 표준의 집합 
syscall 
  • getpid() 같은 syscall 다음과 같이 구현되어 있음 
  • SYSCALL_DEFINE0(getpid) --> asmlinkage long sys_getpid(void) // 인자가 없는 syscall 선언임 { return task_tgid_vnr(current); //current tgid 반환. } 
  • 일반적으로 sys_xxxx 선언함. 
  • 등록된 모든 syscall 목록을 sys_call_table 저장함. 
  • # strace <명령> --> system call trace . 
시스템 호출 핸들러 
  • 사용자 공간의 apps 직접 커널 코드를 호출할 없다  
    • 심지어 변수도 호출 없으므로 copy_from_user 같은 함수를 사용한다. 
    • 커널에 신호를 보내는 방법은 SW interrupt 이용함. 인터럽트 발생하면 kernel mode 전환되어 커널 코드를 실행할 있다. 여기에 호출 번호까지 전달하면 알맞은 system call 찾아서 동작한다. 
  • architecture dependent하게 구현되어 있음. 

signal(시그날)에 대해서… 
  • ^C HW interrupt 아니라 interrupt signal. 
  • 외에도 ^\, ^s/^q, ^z 등이 있음. 이는 $ stty -a 확인 가능함. 
  • 리눅스의 모든 signal 보고 싶으면 $ kill -l 해볼  
    • ex. SIGCHLD child exit 하면 parent에게 보내는 signal 
  • , signal kernel 주는 signal 말하는 것임 
  • signal default 행동이 있는데 이를 process에서 변경할 있음. 
    • signal deault 변경하는 것을 등록하는 함수는 signal() 
  • signal 우선순위: HW interrupt > signal > 일반 app 
  • signal handler 동작 중에 같은 signal 오면 무시, 다른 signal 오면 동작함. 이는 있는 다른 함수들을 사용해서 조정할 있음. 
    • 예를 들어, kill -3 으로 죽이면 죽는데 kill 하면 안죽는다.. 이는 quit 보낸 것인데 이는 내부적인 signal 변경했을 것이다. 이는 kill -9 하면 kill 있다. 9 sigkill SIGIGN setting 업음. 
  • 시그널 처리 동작 
  • 이미지

댓글 없음: