Results 1 to 2 of 2
I encountered a variety of difficulties when implementing a system call as simple as HelloWorld example in Linux so far.
Firstly, according to the book "Linux Kernel Development Second Edition", ...
- 12-05-2009 #1Just Joined!
- Join Date
- Nov 2009
- Posts
- 4
SOS: how to implement a system call in linux
I encountered a variety of difficulties when implementing a system call as simple as HelloWorld example in Linux so far.
Firstly, according to the book "Linux Kernel Development Second Edition", I tried to implement a syscall in 2.6.31 but no way absolutely because 2.6.10 has a very different way to deal with it by comparison to 2.6.31. In fedora 4(2.6.11) I tried to compile the new kernel versions 2.6.10 or 2.6.11 but failed with unexpected errors. Even "make menuconfig" fails to work in this case.
Secondly, I tried to get help from the example from "HOWTO/html_single/Implement-Sys-Call-Linux-2.6-i386/" but still not work. Even the compilation of new kernel 2.6.17 in Ubuntu 6.10(exact 2.6.17) fails to add a syscall.
Last I also got no help from the example "imada.sdu.dk/~daniel/DM510/assignment1/system-call.html" which indicates how to implement a syscall in recent 2.6.28. But the error always take place when compiling the source with new system call modification on source:
arch/x86/built-in.o: In function `sys_call_table':
(.rodata+0x724): undefined reference to `sys_hellokernel'
make: *** [.tmp_vmlinux1] Error 1
Now can somebody give me a detailed step-by-step howto example to implement a syscall in linux?
Thank you!
- 12-05-2009 #2Just Joined!
- Join Date
- Nov 2009
- Posts
- 4
1 I downloaded 2.6.26 kernel. Fedora 9 is my OS with kernel version 2.6.25;
2. I extract the source into /usr/src/linux-2.6.26;
3. Make a directory "/mysyscall" under the source folder;
4. Add two files in "/mysyscall".
(1) mysyscall.c
#include <linux/kernel.h>
#include <linux/linkage.h>
asmlinkage long mysyscall(int i){
printk(KERN_DEBUG "Hello World with number %d \n", i);
return(1);}
(2) mysyscall.h with only one line
obj-y := mysyscall.o
3. Modify Makefile under the source folder.
just add the new folder in the end of this line
core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/
So the change line is
core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/ mysyscall/
4. Add an entry for the new syscall by modifying source/arch/x86/kernel/syscall_table_32.S. The new line is
.long sys_mysyscall
5. Add a new #define line in source/include/asm-x86/unistd_32.h with
#define __NR_mysyscall 327
6. I compile the kernel 2.6.26 and get the following error message:
arch/x86/built-in.o: In function `sys_call_table':
(.rodata+0x724): undefined reference to `sys_mysyscall'
make: *** [.tmp_vmlinux1] Error 1
It's all. Please tell me how to implement the syscall successfully. Thank you very much!


Reply With Quote

