'Embedded Linux'에 해당되는 글 2건

  1. 2008/01/22 Rebis 보드용 2.4.18 커널에 시스템 호출 추가하기
  2. 2007/10/08 Embedded Linux 관련 링크들
먼저, Rebis 보드에 딸려 오는 커널 소스 파일을 작업 디렉토리로 복사한 후 압축을 푼다.

tar zxvf s3c2440_kernel2.4.18.tar.gz

cd s3c2440_kernel2.4.18


간단한 시스템 호출을 추가하기 kernel/sys.c 파일을 연후 제일 마지막에 다음 내용을 추가한다.

asmlinkage int sys_my_hello(int i) {
    printk("Hello %s\n", current->comm);
    return i + 1;
}
EXPORT_SYMBOL(sys_my_hello);


작성한 함수를 시스템 호출로 등록하기 위해 arch/arm/kernel 디렉토리에서 calls.S의 끝 부분쯤에 있는 __syscall_end: 바로 앞줄에 다음과 같이 추가한다.

    .long SYMBOL_NAME(sys_my_hello)

이렇게 하면 일단 시스템 호출이 등록된다. 하지만, 사용자가 이걸 호출할 때 번호를 알 수 있도록 하나를 더 추가해 주는 것이 좋다. 그것은 바로 include/asm/ 디렉토리에 있는 unistd.h 헤더 파일에 다음과 같은 내용을 추가하는 것이다. 이때 심볼 테이블내에서 sys_my_hello가 위치하는 번호를 알고 있어야 한다. 만약 그 번호가 226이라면 다음과 같이 작성하면 된다.

#define __NR_my_hello  (__NR_SYSCALL_BASE + 226)


이렇게 하고 나면 이제 커널 컴파일을 해서 보드에 올리면 된다.

커널 소스 디렉토리에서 다음 명령을 수행한다.

make clean
make dep
make zImage

다음에는 이것을 이용하는 어플리케이션을 작성해야 한다.
간단히 다음과 같이 작성한다.

#include <stdio.h>
#include <asm/unistd.h>

_syscall1(int, my_hello, int, i);

int main() {
    printf("Hello\n");
    my_hello(50);
    return 0;
}


이것을 컴파일 할 때에는 반드시 위에서 작성한 커널의 헤더 파일을 사용하도록 해 주어야 한다. 헤더 파일 경로를 바꾸기 위해서는 -I 옵션을 사용하면 된다.

arm-linux-gcc test.c -I~/Work/s3c2440_kernel2.4.18/include

하지만, 크로스 컴파일 환경에서 헤더 파일을 다시 설정해 주는 것도 번거롭기 때문에 컴파일러 안에 있는 헤더 파일을 수정하는 형태로 하겠다. 즉, asm/unistd.h 파일을 다시 수정하겠다.

vi /usr/local/arm/2.95.3/arm-linux/sys-include/asm/unistd.h


위 파일을 앞에서 unistd.h에 했던 것과 같은 방식으로 작성해 준다.

컴파일 된 코드를 보드에 올려서 테스트해 본다.


크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 성주

트랙백 주소 :: http://kernelstudy.net/trackback/15

댓글을 달아 주세요

Embedded Linux를 사용할 경우에 가장 문제가 되는 점 중의 하나는 바로 용량일것이다.

어떻게 하면, 용량을 최소화하면서 필요한 기능들을 해당 장비에 다 구겨 넣을 것인가가 중요한 관건이 될 것이다.

여기에는 여러가지 관점에서 살펴 봐야 할 것들이 있을텐데, 몇가지 관련 링크들을 정리해 보고자 한다.

먼저, 유틸리티를 최소화 할 수 있는 방법으로는 많이 사용하는 것이 Erik Anderson이 관리하고 있는 tinylogin과 busybox 프로그램이 있을 것이다. 이들은 각각 http://tinylogin.busybox.net 과 http://www.busybox.net 에서 구할 수 있다. 이것은 관련된 유틸리티들을 하나의 프로그램에서 처리하게 함으로써 전체적으로 필요한 공간의 양을 줄여주는 프로그램이다.

프로그램 개발에는 많은 라이브러리들이 따라오게 마련이며 이런 라이브러리를 최소화시키는 것도 전체 용량을 줄일수 있는 한가지 방법이 된다. 그중에서도 libc 는 가장 기본이 되는 라이브러리로서 이것을 최소화 시킨 여러 프로젝트들이 있다. 다음은 그 중 유명한 몇몇 프로젝트이다.

uClibc (http://www.uclibc.org) : glibc와 유사하며, 공유 라이브러리와 멀티 쓰레드를 지원한다. MMU가 없는 ARM과 같은 장비에서도 작동된다.

sglibc (http://sourceforge.net/projects/sglibc) : glibc 호환되는 임베디드용 런타임 라이브러리

dietlibc (http://www.fefe.de/dietlibc/) : 정적 링크 방식으로 사용되며 전체적으로 크기를 줄이는데 목적이 있다.


만약, 임베디드 장비가 그래픽 화면을 사용한다면, X 윈도우가 필요하게 될 것이다. 보통은 XFree86 (http://www.xfree86.org)를 사용하며, 여기에 덧붙여서 gtk (http://www.gtk.org)나 qt를 사용할 것이다. 하지만, 이것들만으로도 5~10메가 가까이의 용량을 소모한다. 따라서, 용량이 작은 장비에서는 다음과 같은 프로그램들을 사용하기도 한다.

DinX (http://dinx.sourceforge.net) : 작은 윈도우 시스템으로서 프레임 버퍼를 사용함.

FLTK - Fast Light Toolkit (http://fltk.sourceforge.net) : C++로 작성되었으며 GUI 및 3D 그래픽을 지원함

Microwindows (Nano-X) (http://www.microwindows.org) : Xlib형 API 제공

크리에이티브 커먼즈 라이선스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
Posted by 성주

트랙백 주소 :: http://kernelstudy.net/trackback/1

댓글을 달아 주세요