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. 커널 컴파일
시스템 콜을 추가하는 하고자 하는데 잘안되네요
시스템 콜 함수까지는 제대로 구현되는 거는 같은데
그것을 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별로 나뉘어 있는 것입니다.
2010/01/29 00:43 [수정/삭제] [답글]
관리자만 볼 수 있는 댓글입니다.
2010/01/29 20:43 [수정/삭제]
헛