본문 바로가기

About Programing/06. Linux

Linux System call 함수 만들기 (작성중)

OS : ubuntu-10.04.1-desktop-i386
Linux kernel version : 2.6.32.25

Ubuntu 나 Linux kernel Version에 따라 구조가 다를 수 도 있습니다.

1. 준비과정

(2) Package 설치
Kernel을 build하기 위해서는 다음의 Package들이 필요하다. 아래 명령어를 통해 Package를 Download 받아 설치한다.


(3) libncurses5-dev와 libqt3-mt-dev, grub2 Package 설치
  Ubuntu에서는 [시스템]-[관리]-[시넵틱꾸러미 관리자]에서 검색을 통해 매우 간단하게 설치 할 수 있다.





2. Kernel source download
(1) Kernel 최신 Version download


3. Kernel source 압축 풀기
(1)일단 Download 받은 File을 확인후 압축을 푼다.


(2) Linux directory로 Link를 건다.


4. System call 추가하기
(1)System call을 등록한다.
/usr/src/linux-source-2.6.32/arch/x86/include/asm/unistd_32.h 파일에서 내가 만들 함수를 추가한다.


다음에는 /usr/src/linux-source-2.6.32/arch/x86/kernel/syscall_table_32.s File에 System call 이름을 적어준다.
Syscall_tables_32.h 에 System call을 추가 함으로서 Linux에 System call을 추가 할 수 있다. 


(2) System call 처리 함수 구현
 다음 경로에 System call을 처리할 함수를 구현한다. 간단히 Message를 출력하는 Program을 작성한다.
/user/src/linux-2.6.32/kernel/



(3) Object 추가
 /usr/src/linux-2.6.32.25/kernel/Makefile 에 Object를 추가해준다.
Kernel compile을 실행하면 compiler는 Makerfile에 명시된 순으로 File들을 Compile하기 시작한다.



그리고 다음 경로에 작성한 System call 함수를 선언해준다.
/usr/src/linux-2.6.32.25/arch/x86/include/asm/syscalls.h


(4) System call을 이용할 Program을 작성한다 
 새로운 Linux version에 System call을 추가 하였으므로 그 System call을 호출할 Test program을 작성한다.
경로는 아무곳에나 해도 상관없다.


5. Kernel build하기 
(1) 새로운 Kernel을 만들 준비를 한다.
 Kernel을 설정하는데는 여러가지 방법이 있지만 menuconfig를 사용하여 설정 할 수 있다. 우선 /usr/src/linux Directory로 이동한 후 다음의 명령들을 실행한다.


 make xconfig 를 입력하면 다음과 같은 창이 뜬다.


빨간 줄 친 부분에 Check를 해주고, 저장 한 뒤 닫자.

(2) Kernel을 Build한다.
 드디어 지금까지 만들었던 Kernel을 Build한다. Ubuntu에서는 Kernel을 바로 Package file로 Build해 Image를 편리하게 Linux에 추가할 수 있다.



실행 하는 순간 대망의 Build가 시작된다. 몇시간은 족히 걸리니, 다른것 좀 하다 오자.
Build가 완료되면, Kernel module을 설치해야 한다.


설치가 완료되면 재부팅을 하자.

재부팅이 완료 되면, 4-(4)에서 만들었던, System call 함수를 호출하는 Source를 Compile일 하고 실행해보자.



실행을 해도 아무 반응이 없어서 허무할 수 도있다.

하지만 printk 를 이용하여 Message를 출력했기 때문에, Kernel에서 따로 Message를 확인 해 줘야 한다.