우분투 8.04 커널 만들기 & 시스템콜 추가하기

2008. 10. 27. 01:10
사용자 삽입 이미지

<요약>
1.준비과정
(1)커널 빌드에 필요한 각종 패키지 다운로드, 권한 설정

2.커널 소스 다운로드
(1)커널 최신버전 확인, 커널 최신버전 다운로드

3.커널 소스 압축 풀기
(1) 압축 풀기, linux 디렉토리 링크걸기

4. 시스템콜 추가하기
(1) 시스템콜 등록하기, 시스템 호줄 함수 구현, Makefile 오브젝트 추가
(2) 시스템콜을 호출하는 test프로그램 작성

5. 커널 빌드하기
(1) 새로운 커널을 만들 준비
(2)커널 빌드하기

6.커널 이미지 패키지 설치하기

7.새로운 커널로 재부팅 및 테스트 파일 실행

<참고싸이트>
http://163.239.201.201/ubuntu/wiki.php/KernelHowTo?action=diff
http://blog.naver.com/ltw1372?Redirect=Log&logNo=10030444404


1. 준비과정

(1) 커널을 빌드하기 위해서는 다음의 패키지들이 필요하다. 아래 명령어를 통해 패키지를 다운로드 받아 설치한다.

build-essential, fakeroot, kernel-package

파일다운로드가 완료되면 /usr/src 폴더에 다음과 같은 폴더들이 생성된다. 이 파일들은 커널 컴파일에 필요한 해더 파일과 패키지파일 생성해 필요한 파일들이다.

(2)커널은 /usr/src/ 디렉토리에 빌드되기 때문에 유저는 src 그룹에 속해 있어야 한다.

(3) 내 계정으로 들어가서 그룹 확인

나의 계정 lbj가 속한 그룹은 다음과 같다.

my_username src audio adm dialout cdrom floppy video plugdev lpadmin

(4) libncurses5-dev와 libqt3-mt-dev 패키지 설치

위 패키지들은 커널을 설정하는데 필요한 패키지들이다. libncurses5-dev는 menuconfig를 하는데 필요하고 libqt3-mt-dev는 xconfig를 하는데 필요하기 때문이다. 이 중 적어도 하나는 설치해야한다. 우분투에서는 [시스템]-[관리]-[시넵틱꾸러미 관리자]에서 검색을 통해 매우 간단하게 설치할수 있다.


2. 커널 소스 다운받기

(1)커널 최신 버전 확인

                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

(2)커널 최신 버전 다운로드

다운로드된 소스는 /usr/src 폴더에 있다.


3. 커널 소스 압축 풀기

(1)일단 다운로드 받은 파일을 확인후 압축을 푼다.

(2)linux 디렉토리로 링크를 건다.


(3)모든 것이 제자리에 있는지 확인


4. 시스템콜 추가하기

(1)시스템 콜을 등록한다.

/usr/src/linux-source-2.6.24/include/asm-x86/unistd_32.h 파일에서 내가 만들 함수를 추가한다. 그리고 아래 NR_syscalls 를 326으로 고쳐준다. 이 부분은 시스템 콜 이름에 시스템 콜 넘버를 할당해 주는 과정이다.

다음에는 /usr/src/linux-source-2.6.24/arch/x86/kernel/syscall_table_32.s 파일에 라인 수 325를 맞춰서 적는다. 시스템 콜 이름을 적어준다. Syscall_tables_32.h 에 시스템 콜을 추가 함으로서 리눅스에 시스템 콜을 추가 할 수 있다.

(2)시스템 호출 처리 함구 구현

다음 경로에 시스템 호출을 처리할 함수를 구현한다. 간단히 로그 메시지를 출력하는 프로그램을 작성한다.

lbj@lbj-desktop:/usr/src/linux-source-2.6.24/kernel$ newfile.c (편의상 kenel 디렉토리에 작성)

(3)/usr/src/linux-2.6.24/kernel/Makefile 에 오브젝트를 추가해준다

커널 컴파일을 실행하면 컴파일러는 Makerfile에 명시된 순으로 파일들을 컴파일하기 시작한다. 컴파일의 맨 마지막 부분에서 새로 추가된 newfile 라는 시스템콜파일이 컴파일된다.

(4) 시스템 콜을 이용할 프로그램을 작성한다

새로운 리눅스 버전에 시스템 콜을 추가 하였으므로 그 시스템 콜을 호출할 테스트 프로그램을 작성한다. 

간단하게 systemcall() 함수를 사용해 새롭게 만든 시스템 콜을 호출 할 수 있다. Systemcall(시스템 콜 번호)를 하게 되면 해당 시스템 콜이 추가되는데 이때 시스템 콜의 숫자를 바로 써줘도 되고, 시스템 콜의 이름을 사용해도 된다.


5. 커널 빌드하기

(1)새로운 커널을 만들 준비를 한다.

커널을 설정하는데는 여러가지 방법이 있지만 menuconfig를 사용하여 설정 할 수 있다. 우선 /usr/src/linux 디렉토리로 이동한 후 다음의 명령들을 실행한다.

이제 기본적인 커널 환경 설정을 한다. 커널 환경설정 두 가지가 있는데 먼저 xconfig를 사용한 방법이다. 마우스를 이용한 편리하게 원하는 설정을 바꾸거나 확인할 수 잇다.

   


다음은 menuconfig 를 이용한 방법이다. 

사용자 삽입 이미지


위 메뉴 중 Processor type and fratures 라는 항목에서 자신의 CPU에 맞게 설정해 줘야한다.


이제 마지막으로 혹시 이전에 만든 이미지파일이 있다면 삭제해 주어야 한다. 다음 명령을 통해 이전에 만든 이미지를 삭제한다.


(2) 커널을 빌드한다.

드디어 지금까지 만들었던 커널을 빌드한다. 우분투에서는 커널을 바로 패키지 파일로 빌드해 이미지를 편리하게 리눅스에 추가할 수 있다.

위 명령어의 옵션사항은 다음과 같다.

--append-to-version : 커널 버전에 원하는 문자를 더할 수 있게 해준다.

kernel_image : 데비안 커널 이미지 파일명

fakeroot를 사용하면 make-kpkg를 일반 유저 권한으로 시작하고 대부분의 작업을 마치는 것이 가능

커널 빌드 명령을 입력하면 Makefile파일에 들어가있는 순서대로 컴파일을 수행하고 커널 이미지를 만들기 시작한다. 이 과정은 약 2~3시간 정도 소요된다.


6. 커널 이미지 패키지 설치하기

(1)먼저 빌드가 제대로 되었는지 /usr/src 디렉토리로 가서 확인해본다.

새롭게 생성된 커널이미지의 이름뒤에 .12042108의 새롭게 붙인 이름이 추가 된 것을 볼 수 있다.


(2)커널과 커널 모듈을 설치한다

사용자 삽입 이미지

그냥 생성된 패키지를 더블클릭으로 실행해서 패키지설치를 해도 된다.


7. 마지막 확인

(1)커널 설치 후 재부팅 시 커널 선택창에서 새롭게 설치한 커널을 고른다.

새롭게 추가된 커널을 볼 수 있다. 선택하여 새로운 커널로 부팅한다.


(2) 커널 버전 확인

.12042108이 붙은 새로운 커널이 올라온 것을 확인해 볼 수 있다.


(2) 테스트 파일 컴파일

위에서 만들었던 테스트 파일을 실행가능한 파일로 컴파일 한다. 먼저 test.c가 /usr/src 폴더에 있다고 가정하고 해당 폴더로 이동 컴파일 명령을 실행한다.


이제 컴파일된 테스트 파일을 실행한다.


새롭게 만든 커널을 특별한 메시지를 실제로 출력하거나 하는 기능을 추가 하지 않았기 때문에 특별한 실행결과는 나타나지 않는다. 다만 새로운 시스템 콜 함수의 printk()함수를 통해 로그에 메시지를 남기에 된다. 로그메시지를 출력하기 위해 dmesg 명령어를 입력한다.

맨 마지막 문장에서 새롭게 추가한 커널의 로그메시지를 확인할 수 있다.

뽕다르 컴퓨터 , , ,

  1. Blog Icon

    비밀댓글입니다

  2. Blog Icon

    비밀댓글입니다

  3. 제가 위에 보여드린 unistd_32.h 파일과 같은 내용의 파일을 찾아보세요... 새로운 커널버전에 대해서는 아직 확인을 못해봐서 저도 정확히는 모르겠네요..

  4. Blog Icon
    joo

    우와~ 덕분에 많은 도움이 되었어요^^ 감사감사~

  5. 원래 한번에 잘 안되는 잘 되셨다니 다행이네요. 저도 이거 한지 오래되서 다까먹었어요 ^^