Operating System 4 주차 - System Call Implementation - Real-Time Computing and Communications Lab. Hanyang University jtlim@rtcc.hanyang.ac.kr yschoi@rtcc.hanyang.ac.kr shpark@rtcc.hanyang.ac.kr
Contents Ctags Cscope Ccache System Call Adding System Call 과제 2 2 2
About Linux Kernel Linux Kernel provides fundamental environment for applications to work The Kernel s responsibilities include controlling computer H/W instead of applications Applications call out functions of kernel using system call 3 3
Ctags 소스코드분석을위해인덱스파일을생성하는명령 Vim 과연동하여사용가능 인덱스파일은변수, 함수정의, 매크로선언을포함한다. Ctags 설치 $ sudo apt-get install ctags Ctags 설치확인 $ ctags --version 4 4
Ctags Vim 연동 vimrc 파일에 ctags 후생성되는인덱스파일위치지정 $vim ~/.vimrc 아래그림처럼추가입력후저장 Kernel Source 분석을위해사용하기때문에, 위와같이설정 5 5
Ctags 명령을실행하는디렉터리부터하위디렉터리를탐색하면서각소스의정보수집 Example> $ cd /usr/src/linux $ sudo ctags -R 인덱스파일 (tags) 생성 ( -R 옵션은하위디렉토리를포함하여검색 ) $ vim tags 태그명파일명정의된타입 6 6
Ctags 사용법 (vi 명령모드에서 ) :ts [target name] [target name] 가정의된위치를나열하고선택한위치로점프 현재위치는 stack 에 push 된다. Ctrl + t stack 에저장되어있는이전위치로되돌아간다. Command Ctrl+] Ctrl+t :ts <target name> 설명 함수가정의된파일로이동 이동하기전단계의위치로이동 같은이름의 function-name 이여러개일때, 목록을보여준다. 번호를이용해서선택할수있다 :tn 여러개의함수이름이존재할때, 다음함수를선택한다. :tp 이전함수를선택한다. :tf 가장처음에찾았던함수를선택한다. :tl 가장마지막함수를선택한다. 7 7
Cscope 대화식 C 소스코드분석프로그램 Ctags 만으로찾기어려운지역변수나전역변수혹은함수들의호출관계를파악하는데사용 Vim 과연동하여사용가능 Cscope 설치 $ sudo apt-get install cscope Cscope 설치확인 $ cscope --version 8 8
Cscope Cscope 프로그램을사용하기위해 mkcscope.sh 파일을작성한다. mkcscope.sh 를실행시기존의 cscope 관련파일들을정리하고, 새롭게 DB 를생성하고그것을바탕으로 cscope 프로그램을생성한다. mkcscope.sh 의권한과위치를이동시킨다. $ chmod 755 mkcscope.sh (/usr/src/ 에서사용하기위한퍼미션조정 ) $ sudo mv mkcscope.sh /usr/bin/ 9 9
Cscope Vim 연동 Cscope는 vim과연동하여서도사용할수있다. vimrc 파일에아래의내용추가 $vim ~/.vimrc 57 번째와 59 번째줄에서 tab 을이용한다. 10 10
Cscope 사용법 /usr/src/linux 에서다음을입력 Vim 이용 $ sudo mkcscope.sh Cscope 프로그램생성완료후, 프로그램이용혹은 vim을이용해서활용가능 여기서는 vim을이용하는방법만다룬다. Ctrl + d 를눌러 cscope 프로그램종료 Vim editor 실행후 (vi 명령모드에서 ) :cs find [ 검색유형 ] [ 검색어 ] 검색유형설명 s 심볼을검색한다. g 전역선언을검색한다. d 함수에의해호출되는함수들을검색한다. c 함수를호출하는함수들을검색한다. t 텍스트문자열을검색한다. f 파일이름을검색한다. i 이파일을 include하는파일을검색한다. 11 11
Quiz Cscope 와 Ctags 를이용하여 3 주차과제에있던 start_kernel 함수를찾아보시오. Cscope 와 Ctags 를이용하여 Kmalloc 함수정의위치를찾아보시오. Cscope 와 Ctags 를이용하여 Kfree 함수정의위치를찾아보시오. 12 12
Ccache Ccache is a software development tool that caches the output of C/C++ compilation so that the next time, the same compilation can be avoided and the results can be taken from the cache. This can greatly speed up recompiling time. [Wikipedia] Ccache Install & check 13 13
Ccache 환경변수설정 terminal을키고다음을입력한다. $ sudo vim /etc/environment 아래의그림처럼표시된부분을추가한다. 저장을하고나온다. 위와같이설정하면 gcc 를이용해컴파일을할경우자동으로 Ccache 를이용하기때문에빌드시간을단축할수있다. ex> Kernel Build 14 14
System Call 사용자수준응용프로그램에게커널이자신의서비스를제공하는인터페이스 리눅스커널은각시스템콜을 Handler 로구현해놓고, 요청되었을때해당 Handler 를호출하여서비스를제공한다. 15 15
Adding System Call Step 1: 새로운시스템콜을시스템콜테이블과헤더에추가한다. Step 2: 커널에 Handler 부분함수를구현하고커널 Makefile 을수정한다. Step 3: 새롭게컴파일후재부팅하고테스트프로그램으로동작을확인한다. 16 16
Adding System Call Step1 (64bit) /usr/src/linux/arch/x86/syscalls/syscall_64.tbl 관리자권한으로접속후아래와같이추가하려는시스템콜정보를입력한다. 17 17
Adding System Call Step1 (32bit) /usr/src/linux/arch/x86/syscalls/syscall_32.tbl 관리자권한으로접속후아래와같이추가하려는시스템콜정보를입력한다. 18 18
Adding System Call Step1 /usr/src/linux/include/linux/syscalls.h 헤더파일맨끝에아래와같이등록하고자하는핸들러함수를선언한다. 19 19
Adding System Call Step2 /usr/src/linux/kernel 내부에 handler 함수를구현한다. helloworld.c printk 함수는커널버퍼에출력하는함수이다. 커널컴파일후시스템콜동작을확인할때 terminal 에서 $ dmesg 를통해확인할수있다. asmlinkage 는어셈블리코드에서직접호출할수있다는의미로, linux/linkage.h 에정의되어있다. 20 20
Adding System Call Step2 /usr/src/linux/kernel/makefile 에다음을추가한다. 21 21
Adding System Call Step3 다음과같이 test 프로그램을만든다. 시스템콜을사용하기위해 linux/unistd.h 를 include 한다. 실행후 $ dmesg 를입력하면아래의결과를확인할수있다. $ dmesg --clear 를하면기존의 dmesg 내용을지울수있다. $ man dmesg 참조 22 22
과제 2 (System Call Implementation) 1. 위의실습자료를토대로 helloworld 시스템콜을커널에추가한다. 2. 현재 task 의정보를출력하는 get_task_info 라는시스템콜을추가한다. helloworld 시스템콜추가에서와같이 printk 를이용해커널버퍼에출력하도록한다. Hint1 : 현재실행중인 task 의정보를출력하기위해커널소스에 task_struct 구조체의내용을참고한다. Hint2 : current 라는포인터변수가 task_struct 를가리킨다. ex> current->pid 등 Hint3 : ctags 와 cscope 를이용하면쉽게 task_struct 를찾을수있다. 23 23
과제 2 (System Call Implementation) Due: 2016/04/01 실습수업시간 제출방법보고서로출력해서제출 제출물 보고서 표지 과제내용요약 task_struct의위치 ( 소스파일 ) 시스템콜을추가하는과정에대한스크린샷과캡처 각각의정보들 (get_task_info) 이의미하는것설명 결과및분석 (dmesg 출력결과 ) Quiz에서 3가지문제의경로와해당위치스크린샷캡쳐 후기 24 24
과제 2 (System Call Implementation) Example> 25 25
과제 2 (System Call Implementation) 문의사항 이름 : 임정택 Tel : 010-4780 - 9294 E-Mail : jtlim@rtcc.hanyang.ac.kr 이름 : 최윤식 Tel : 010-7970 - 0906 E-Mail : yschoi@rtcc.hanyang.ac.kr 이름 : 박성현 Tel : 010-6612 - 8957 E-Mail : shpark@rtcc.hanyang.ac.kr 실습관련질문시제목을아래의양식에맞춰서메일을보내주세요 ex> [ 운영체제 ] 학번 _ 이름 지연제출에대해서는감점이있을수있음. 26 26