arm linux 커널에 system call 추가

Posted at 2009/04/01 17:01 // in Programming // by Daniel

http://barriosstory.blogspot.com/2008/03/arm-linux-kernel-system-call.html

먼저 커널의 다음 3 파일을 수정하여 새로운 system call을 추가하자.
1. arch/arm/kernel/calls.S
2. include/asm-arm/unistd.h
3. 해당 system call을 구현 할 부분(따로 분리해서 구현해도 상관없고 기존의 아무 소스 파일에나 구현해도 상관없다. 단지 makefile만 잘 수정해준다면)

 

마지막으로 해당 system call을 사용하는 application을 작성하여야 한다.

 

http://www.4ellene.net/tt/1168

system call 추가 방법
1. vi /usr/src/linux/arch/i386/kernel/entry.S
: system call 번호를 추가
.long SYMBOL_NAME(sys_mysyscall)  // 240

2. vi /usr/src/linux/include/asm-i386/unistd.h
#define __NR_mysyscall      240

3. vi /usr/src/linux/kernel/test.c
#include <linux/kernel.h>

asmlinkage int sys_mysyscall()
{  
    printk("Hello linux\n");
    return 2007;
}

4. vi /usr/src/linux/kernel/Makefile
obj-y = sched.o dma.o fork.o exec_domain.o panic.o printk.o \
        module.o exit.o itimer.o info.o time.o softirq.o resource.o \
        sysctl.o acct.o capability.o ptrace.o timer.o user.o \
        signal.o sys.o kmod.o context.o test.o 

5. vi app.c

#include <asm-i386/unistd.h>
#include <errno.h>

_syscall0( int, mysyscall );

int main()
{
    int i;
    i = mysyscall();

    printf("%d\n", i );
    return 0;
}

6. cc -I/usr/src/linux/include app.c

7. 커널 컴파일

http://kldp.org/node/87344

시스템 콜을 추가하는 하고자 하는데 잘안되네요
시스템 콜 함수까지는 제대로 구현되는 거는 같은데
그것을 test하는 user application이 잘되지 않네요
_syscall2(int, pedagogictime, int, flag, struct timeval *, thetime);

이런식으로 해주고 user application을 작성해서 컴파일 해주면
'__NR_pedagogictime' undeclared라고 나오네요
분명히 include/asm/arch/unistd.h에서 추가해줬는데 말입니다.

그런데 여러 자료를 보니까 include/asm-arm/unistd.h를 변경해준다고 하고
그런데 거기에 include에 가보니까 asm~~이런 것들이 굉장히 많은데
이것들의 차이는 무언가요 제가 맞게 바꾼거는 맞나요??

 

혹시 arch디렉토리가 없지 않나요?
인텔칩을 사용한다면 include/asm-i386/unistd.h 파일을 수정해주세요.
저 파일에

#define __NR_eventfd            323
#define __NR_pedagogictime            324
#ifdef __KERNEL__

#define NR_syscalls 325

라고 굵은 글씨로 되어 있는 부분을 입력해주시면 됩니다.

asm-???? 들은 각 CPU별로 어셈블리어가 다르기 때문에 CPU별로 나뉘어 있는 것입니다.

크리에이티브 커먼즈 라이센스
Creative Commons License

make image script (u-boot용 커널 이미지 생성)

Posted at 2008/04/08 15:00 // in Tips // by Daniel

$ cat make_image.sh
#!/bin/sh
TARGET_IMAGE=MPkernel`grep "EXTRAVERSION =" Makefile | awk '{print $3}'`         # ---->  MPkernel이름에 Makefile에 있는 버전정보를 붙인다.
TARGET_IMAGE=${TARGET_IMAGE}-`date +%m-%d`   # ---> 추가로 날짜를 붙인다.
mkimage -A arm -T kernel -C none -a 0x7fc0 -e 0x8000 -n MPCore -d arch/arm/boot/Image ${TARGET_IMAGE} && echo resulting image name = ${TARGET_IMAGE}


$ ./make_image.sh
Image Name:   MPCore
Created:      Tue Apr  8 14:54:37 2008
Image Type:   ARM Linux Kernel Image (uncompressed)
Data Size:    2549424 Bytes = 2489.67 kB = 2.43 MB
Load Address: 0x00007FC0
Entry Point:  0x00008000
resulting image name = MPkernel-arm1-perfctr-04-08


실행하면 위와같이 생성된다.

개인적으로 나중에 보려고 올림.

크리에이티브 커먼즈 라이센스
Creative Commons License