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