'커널'에 해당되는 글 2건

  1. 2009.03.20 ARM보드 - 커널 모듈적재
  2. 2009.03.13 커널 설정 및 생성


커널 모듈(Kernel Module) 이란?

시스템 부팅 후에 동적으로 loading 할 수 있는 커널 구성요소. 커널을 다시 컴파일 하거나 시스템 리부팅 할 필요 없이 커널의 일부분을 교체하는 것이 가능하며, 디바이스 드라이버, 파일 시스템, 네트워크 프로토콜 등이 모듈로 제공된다.

컴파일한 커널 버전 정보가 들어가야 하고, 현재 실행되고 있는 커널 버전과 일치해야 한다. <linux/module.h>에 정의되어 있으며, 모듈 정보는 전체 모듈에서 하나만 존재해야 한다.


일반 응용 프로그램과의 차이점

main() 함수가 없으며 커널에 로딩 및 제거 될 때 불러지는 함수가 존재 한다.
Loading 시 - int init_module(void) 함수 호출
Unloading 시 - void cleanup_module() 함수 호출


커널에 적재할 파일작성

hello.c 작성


/* hello.c */

#include <linux/module.h> /* 모든 모듈에 필요 */
#include <linux/kernel.h>   /* printk() 등에 필요 */

int hello_init(void) { // 모듈이 로딩될 때 호출
 printk (“Hello world\n”);
 return 0;
}

void hello_exit(void) { // 제거 될 때 호출
 printk (“Goodbye world”);
}

module_init(hello_init);
module_exit(hello_exit);

MODULE_LICENSE(“GPL”);

Makefile 작성


#Makefile

obj-m   := hello.o
 
KDIR    :=$(커널 소스가 설치된 절대 경로)
PWD     :=$(shell pwd)
 
all:
        $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
       
clean:
        rm -rf *.ko
        rm -rf *.mod.*
        rm -rf .*.cmd
        rm -rf *.o



커널에 모듈 적재 및 확인(insmod, lsmod, rmmod)

생성된 모듈을 로딩

# rx hello.ko


시리얼 통신(x모뎀)을 통해 타겟으로 컴파일한 ko 파일 전송을 하도록 한다.


# insmod hello.ko


커널에 적재된 모듈 목록 보기

# lsmod


모듈 제거

# rmmod hello 


모듈 적재와 제거 시에 원래 의도했던 메시지들이 출력되는 지 확인


참조 PPT(국민대학교 임베디드 랩, KESL)



Posted by 리트모스
:


1. 커널 다운로드

리눅스 커널 소스코드 : http://kernel.org/


linux-2.6.26.3.tar.gz        20-Aug-2008 18:18   60M


.config : 커널 설정을 하게 되면 생성되는 결과 파일


2. 커널 업데이트

 2-1. xdownload kernel : 비정상적인 커널 다운로드
 2-2. flashdownload kernel : 커널 시스템 업데이트
 2-3. xdownload kernel : 정상적인 커널 다운로드
 2-4. 비정상적인 커널이 올라간 상태였으므로 정상적인 커널이 다운로드 되는 동시에 업데이트


3. 커널 이미지 생성

Shell 스크립트 파일 생성 (pathstart.sh)


#!/bin/bash

export PATH=/home/test/cdt_2007-07-20/bin:$PATH
export ARCH=arm
export CROSS_COMPILE=arm-linux-


PATH 설정이므로 자신의 경로에 맞게 넣어주도록 한다. ARCH라는 부분은 아키텍처를 arm용으로 하겠다고 선언하도록 하는 부분이다. 작성한 쉘 스크립트 파일을 실행하도록 한다.

Shell 스크립트 파일 실행


test@test-desktop:~$
source ./pathstart.sh


위와 같이 실행하면 ARM용으로 설정하게 된다.


4. 생성할 커널 설정

커널설정 초기화

test@test-desktop:~/linux-2.6.26.3$ make allnoconfig
 

커널설정 실행

test@test-desktop:~/linux-2.6.26.3$ make menuconfig
 

각종 config 목록 보기

test@test-desktop:~/linux-2.6.26.3$
ls arch/arm/configs


MainStone 기본설정 불러오기

test@test-desktop:~/linux-2.6.26.3$
 make mainstone_defconfig



시스템 타입 설정 - 체크사항
System Type ---> Arm System Type(arm id....) ---> PXA2xx/PXA3xx-based

장치 드라이버 설정 - 체크사항
Device drivers ---> Character Devices ---> Serial drivers ---> PXA serial port support + Console on PXA serial port

Intel 플레폼과의 차이점에 의한 설정 변경 - 설정해체
Kernel Features ---> Timer and CPU usage LEDs (설정해체) + CPU usage LED


munuconfig의 세부명령어
/ : 단어로 관련된 사항을 검색
? : 관련된 사항의 세부사항을 살펴본다.

설정이 완료되면 ARM용 환경변수를 설정하고 컴파일 하도록 한다.


test@test-desktop: export LD_LIBRARY_PATH=/home/test/cdt_2007-07-20/i686-pc-linux-gnu/arm-linux/lib:$LD_LIBRARY_PATH

test@test-desktop:~/linux-2.6.26.3$
make zImage


i386타입에서 작업을 한뒤 i686(ARM) 타입으로 작업을 하므로 처음에 쉘 스크립트에서는 LD_LIBRARY_PATH를 추가 하지 말고 컴파일하기 직전에 export로 추가하도록 한다. 환경변수 설정은 자신의 폴더에 맞게 경로 설정하여 오류가 생기지 않게 주의하도록 한다.


test@test-desktop:~/linux-2.6.26.3/arch/arm/boot$ ls
Image  Makefile  bootp  compressed  install.sh  zImage


컴파일이 완료 되면 위의 경로에 zImage 파일이 생성이 되었다면 정상적으로 컴파일 된 것이다.

Posted by 리트모스
: