2007년 9월 4주차 리눅스 커널 스터디 후기

 오늘은 진도를 나가는것보다 x86_64 아키텍처에서 시스템 콜을 어떻게 호출하는지 찾아보는데 주력하였다.
 기존 x86 시스템에서 시스템 콜 관련 instruction은 오래된 int 0x80, syscall, sysenter 이렇게 세가지 방법이 존재한다. 이중 sysenter를 이용한 방법이 가장 효율이 좋다. int 명령어를 이용한 소프트웨어 인터럽트는 권한 체크 및 몇가지 부하가 있는데 이를 생략한 명령어가 sysenter이다. 하지만 x86_64 아키텍처 중에 대표격인 amd64 cpu에서 64bit mode인 long mode에서는 sysenter 명령어를 완전히 지원하지 못한다. 그래서 x86_64 아키텍처에서는 시스템콜을 syscall이라는 instruction을 이용해서 시스템 콜을 호출한다.

 오늘 분석한 부분은 저번 스터디때 분석하다만 start_kerenl() 함수안에 trab_init() 함수가 마지막으로 호출하는 함수,  cpu_init()를 분석하였다. 함수명 그대로 cpu를 초기화하는 함수인데, 대부분의 작업은 이미 부트스트랩 과정에서 했던 작업을 한다. 그런데 또 하는 이유는 부트스트랩 과정에서 빠진 초기화 작업을 하고, smp 환경에서 다른 cpu를 활성화 시킬때 이 함수를 호출하여 부팅 작업을 하는 cpu 아닌 다른 cpu를 초기화 시킬때 이 함수를 사용한다.

 그리고 오늘 대부분의 시간을 할애해서 분석했던 syscall 관련된 내용인 syscall_init() 함수를 cpu_init() 함수 안에서 호출해 준다. syscall_init() 함수는 함수명 그대로 시스템 콜을 초기화 해주는 함수 이다. 주요 작업은 syscall instruction을 실행할때 사용되는 msr 레지스터의 LSTAR 영역(0xc0000082)에 시스템 콜을 호출할때 사용하는 system_call() 함수의 주소를 등록하는 것이다.

 systam_call() 함수의 특이한 점은 x86_64 아키텍처에서 새로 도입된 instruction인 swapgs를 사용한다는 점이 었다. 이전에 분석했던 내용에 따라, gs 레지스터에는 cpu 별로 필요한 정보를 담고있는 x8664_pda 자료구조의 주소를 담고있다. swapgs instruction은 msr 레지스터의 0xC0000102의 값을 gs 레지스터와 바꾸어 준다. 시스템 콜을 호출하기 전에 msr 레지스터, 0xC0000102에 현재 cpu의 x8664_pda 자료구조의 주소를 쓰고 system_call() 함수를 호출하면 gs 레지스터에 현재 동작하는 cpu의 pda 자료구조가 들어가게 된다. 그외 동작은 다른 아키텍처에서와 마찬가지로 시스템 콜 번호에따라 적절한 시스템콜 핸들러를 호출하는 역활을 한다.

스터디 진행이 전체적으로 진도는 느린편인것 같긴 하지만, 대충대충 넘어가지 않고 하나하나 이슈들을 빠짐없이 보고 넘어가는것이 마음에 든다. 느리긴 하지만 예상했던 기간인 1년안에는 끝나지 않겠나?


Trackback 1 Comment 0
prev 1 ··· 55 56 57 58 59 60 61 62 63 ··· 72 next