arm linux kernel에 system call 추가 Mar 18, 2008

기본적으로 뼈대는 x86과 동일하다. 약간의 매크로가 틀릴 뿐인데.. 중요한 것은 제일 나중에..

먼저 커널의 다음 3 파일을 수정하여 새로운 system call을 추가하자.

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

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

#include "/home/barrios/work/xxx/linux/include/asm-arm/unistd.h"
#include

_syscall1(int,barrios_write,int,arg);
_syscall1(int,barrios_t,int,arg);

int main()
{
int i;

i = barrios_write(2);
i = barrios_t(2);

return 0;
}

자. 컴파일 하자.

arm_unknown-linux-gnu-gcc -o barrios_syscall barrios_syscall.c

에러 뜨나??
barrios_syscall.c:5: error: expected declaration specifiers or ‘...’ before ‘barrios_write’
barrios_syscall.c:5: error: expected declaration specifiers or ‘...’ before ‘arg’
barrios_syscall.c:5: warning: data definition has no type or storage class
barrios_syscall.c:6: error: expected declaration specifiers or ‘...’ before ‘barrios_t’
barrios_syscall.c:6: error: expected declaration specifiers or ‘...’ before ‘arg’
barrios_syscall.c:6: warning: data definition has no type or storage class

그럼 다음과 같이...

arm_unknown-linux-gnu-gcc -o barrios_syscall barrios_syscall.c -D__KERNEL__

1 개의 덧글:

barrios said...

2.6.18 이후로 _syscall macro는 더 이상 사용되지 않는다. 대신에 syscall syscall을 사용하라. 더 편리해졌다. man syscall 참조.