네모난 세상

리눅스 우분투에서 커널 컴파일 본문

ⓢtudy/Operating System

리눅스 우분투에서 커널 컴파일

막다른골목 2009. 4. 6. 19:43

1. 준비과정

(1) VMWare에서 리눅스 설치

설치가 비교적 간단한 우분투 리눅스 (8.04, 테스크탑 버전)을 설치하였다.

(2) 커널 컴파일에 필요한 패키지 설치

우분투에서 커널 컴파일을 하려면 다음과 같은 패키지들이 필요하다.

build-essential, fakeroot, kernel-package

$ sudo apt-get install build-essential fakeroot kernel-package

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

$ sudo adduser kklyoon src (kklyoon는 유저 ID)

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

libncurses5-dev는 menuconfig를 하는데 필요하고 libqt3-mt-dev는 xconfig를 하는데 필요한다. System->Preferences->Synaptic Package Manager 메뉴에서 설치해준다.

(5) 커널 소스 다운받기

- 커널 최신 버전 확인

$ apt-cache search source 2.6


- 커널 최신 버전 다운로드

- 다운받은 소스 파일 압출 풀기

$ tar xjvf linux-source-2.6.29.tar.bz2

- linux 디렉토리로 링크를 건다.

$ ln -s linux-source-2.6.29.tar.bz2 linux

2. 시스템 콜 추가하기

(1) 시스템콜 명칭 정의 및 번호 할당

/usr/src/linux/include/asm-x86/unistd_32.h 파일에 시스템 콜의 명칭과 번호를 할당한다.

 

(2) 시스템 콜 테이블에 등록

usr/src/linux/arch/x86/kernel/syscall_table_32.s 의 시스템 콜 테이블에 새로 만들 함수를 등록한다.

 

 

(3) 시스템콜 처리 함수 구현

/usr/src/linux/kernel/newfile.c 에 간단하게 코드를 작성한다.

 

(4) 커널 컴파일

컴파일하기 전에 /usr/src/linux/kernel/Makefile에 newfile.o 의 오브젝트 파일을 추가해준다.

 

 

- 커널 환경설정

$ make menuconfig

리눅스 설정창에서 컴파일에 필요한 설정을 해준다. (이번 실습에서는 VM환경이기 때문에 특별히 설정을 바꾸지는 않았다.)

- 커널을 빌드한다.

$ fakeroot make-kpkg --append-to-version=0.0507 kernel-image -initrd

--append-to-version : 커널 버전에 원하는 문자를 더 할 수 있게 한다. (숫자만 가능)

kernel-image : 커널 이미지 파일명

fakeroot를 사용하면 make-kpkg를 일반 유저 권한으로 대부분의 작업이 가능

 ※커널 빌드는 약 2시간이라는 긴 시간이 걸렸다.

(5) 커널 이미지 설치

빌드가 완료 되고 나서는 /usr/src/ 경로에 커널 이미지 파일이 생성된다. 이제 이 이미지 파일을 설치한다.

$ sudo dpkg -i linux-image-2.6.24.60.0507_2.6.24 ~ .deb

 

(6) 재부팅 및 커널설치 확인

재부팅시 ESC키를 입력하면 다음과 같은 화면이 나온다.

 

끝자리에 generic이 붙은 것은 원래 있던 커널이고 .0505가 붙은 것은 시스템콜을 추가하기 전에 시험 삼아 만든 커널이고 0.0507이 시스템 콜을 추가한 커널이다.

3. 결과 확인

(1) 시스템 콜을 사용하는 프로그램 작성

 

(2) 컴파일 및 결과 확인

$./test

$./test

$dmesg

 

시스템의 로그기록에 잘 출력이 되는 것을 확인 할 수 있다.