Computers/Adv. Linux System Programming

system call / 시스템콜 추가

emzei 2014. 3. 10. 15:53

[환경]

windows 8.1 

VMware player

Fedora 20 (linux kernel ver  3.13.5) 64bit





작년에는 32비트 환경에서해봤는데

지금은 컴퓨터가 64비트여서 정말로 약~간 차이나는 것 빼곤 거의 다 같은 과정...ㅇ.ㅇ!!!


이전 포스팅 커널 컴파일로 새로 받은 커널(3.13.5) 환경에서 시스템콜을 추가하는게 이번 포스팅의 목표!




step 0.

/usr/src/linux 디렉토리 하위에 커널 소스코드를 두고 아래 단계들을 전부 실행했음을 미리 알림.



step 1. System call 번호 부여



> 컴퓨터 환경이 32bit라면

 - /usr/src/linux/arch/x86/syscalls/syscall_32.tbl 에 추가

 - 32비트 경우 맨 마지막 번호를 할당해주면 됨.





 > 컴퓨터 환경이 64bit라면

  - /usr/src/linux/arch/x86/syscalls/syscall_64.tbl 에 추가


64비트엔 common(64, 32 둘다 가능) , 64(64bit) , x32(32bit) 으로 구분되는데

간단한 시스템콜을 추가할거라 common으로 두고 추가.

주석으로도 나와있지만,  32비트용 시스템 콜은 512 이후로 할당하라고 되어있음.


314번에 새로운 시스템콜 mycall()을 등록



+ 번호는 커널 버전이나 리눅스 배포판 마다 다를 수 있음을 유의!






step 2. System call 테이블 등록


- /usr/src/linux/include/linux/syscalls.h 파일에 등록

- #endif 전에 asmlinkage long sys_mycall() 추가








step 3. System call 처리 함수 구현

- 커널에 포함되어 컴파일 할 함수니까 /usr/src/linux/kernel/ 하위에 mycall.c 작성






- /usr/src/linux/kernel/Makefile 을 수정하여, 위에서 작성한 파일명의 오브젝트 파일을 obj-y에 추가  (mycall.o 추가)

※ obj-y : built-in 되어 커널이미지의 일부가 됨

    obj-m : module로 컴파일 됨



step 4. 

방법 1. 커널 전체 컴파일 (커널 컴파일 참고)

# make mrproper

# make menuconfig (혹은 기타 다른 방법으로 configuration 설정...)

# make

# make modules

# make modules_install


방법 2. 이미 커널 컴파일을 완료 해서 System.map 파일과 initrd-#.#.img 파일이 /boot 디렉토리에 존재하는 경우
--> 커널이미지만 만 새로만들어 /boot 디렉토리로 덮어쓰기

# make bzImage





# reboot 하여 3.13.5 커널로 부팅


step 5.

 ⑴ 사용자 프로그램 작성


 코드를 작성합니다. 시스템 콜을 호출 할때, 앞에서 할당해준 번호로 접근을 하게되요.


코드 작성 후 컴파일 할 떄 -I 옵션을 줍니다.

-I 옵션은 헤더파일의 경로를 지정할 수 있습니다. (갑자기 존대말...???)


# gcc -I/usr/src/linux/include -o test test.c

# ./test


올바르게 실행된 결과를 볼 수 있다. 



+ 또한 dmesg 명령어를 통해 커널 메시지에 본 시스템콜로 인해 출력된 메시지를 볼 수 있음. " do it mycall(int n)! "




⑵ 사용자 라이브러리 작성

- mysys.c 로 아래와 같은 코드를 작성

- mycall()을 호출하면 내부에서 시스템 콜을 호출하도록 한다



- 컴파일 할 때 오브젝트 파일로 생성되도록 -c 옵션을 준다. 

(mysys.c ---> mysys.o 생성)

# gcc -I/usr/src/linux/include/ -c mysys.c


- 라이브러리 아카이브 생성

  -r 옵션 : libmy.a 라는 라이브러리 아카이브에 mysys.o 를 추가 

  (라이브러리명이 뭐가 되도 좋지만 앞에 접두로 lib를 반드시 붙이길 바람)


# ar -r  libmy.a mysys.o





그리고 라이브러리를 이용하는 프로그램을 작성 ↓↓↓


컴파일 하고 실행하면 다음과 같은 결과가!

# gcc -I/usr/src/linux/include/ -O -o test test.c -L./ -lmy


( ※ 라이브러리 파일명이 libabcd.a 이면 옵션에서 -labcd 로 )


'Computers > Adv. Linux System Programming' 카테고리의 다른 글

change sources.list  (0) 2014.05.20
install RT linux  (0) 2014.05.19
ubuntu initrd.img 생성  (0) 2014.05.01
커널 컴파일 / kernel compile  (0) 2014.03.07
checkpoint +_at_ Embedded board  (0) 2013.04.26