========================================== Stage 1: To modify the kernel to add our own system call ==========================================
1. Edit file /usr/src/linux/arch/i386/kernel/syscall_table.S
Find the 223 syscall and modified like this:
arch/i386/kernel/syscall_table.S …… 233 .long sys_mysyscall 234 .long sys_gettid 235 .long sys_readahead /* 225 */ ……
2. Edit file /usr/src/linux/arch/i386/kernel/Makefile Add obj-y += mysyscall.o
3. Create a new file call mysyscall.c under /usr/src/linux/arch/i386/kernel/ directory. Type the following into the file:
#include <linux/linkage.h> #include <linux/kernel.h>
asmlinkage int sys_mysyscall(void) { printk("This is the my new system call build in the kernel!/n"); return 0; }
4. Edit file unistd.h include/asm-i386/unistd.h /usr/include/asm/unistd.h
231 #define __NR_mysyscall 223 /* mysyscall adds here */
5. At this point, you can start building your new kernel.
make menuconfig && make && make modules_install && make install
6.After a successful build, reboot the machine and boot into the newly built kernel.
=========================== Stage 2: To test the new system call ===========================
7.Create a new file call testsyscall.c in your directory. Type the following into the file:
#include <linux/unistd.h>
_syscall0(long, mysyscall);
int main () { mysyscall(); return 0; }
8.Compile the above testsyscall.c source code with :
gcc -Wall testsyscall.c -o testsyscall
9.If you arrive here without problems, you can now test the newly created system call just type
./testsyscall
10. To check if it works, you can use:
dmesg | tail -n 5