1 / 21

Add a New System Call to Linux

Add a New System Call to Linux. Hw1. Add a New System Call to Linux and Compile Kernel Add a New System Call to Linux by Kernel Module. Compile your own Linux kernel. Get the source The Linux Kernel Archives http://www.kernel.org ftp://linux.cis.nctu.edu.tw/kernel/( 交大資科 )

decker
Download Presentation

Add a New System Call to Linux

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Add aNew System Call to Linux

  2. Hw1 • Add a New System Call to Linux and Compile Kernel • Add a New System Call to Linux by Kernel Module

  3. Compile your own Linux kernel • Get the source • The Linux Kernel Archives • http://www.kernel.org • ftp://linux.cis.nctu.edu.tw/kernel/(交大資科) • http://ftp.nsysu.edu.tw/Linux/Kernel/linux/kernel(中山大學)

  4. Compile your own Linux kernel • Steps: • Get the kernel source from ftp • Installing the kernel source code- kernel source is put in /usr/src- #cd /usr/src - #tar xvzf linux-2.4.x.tar.gz • make mroproper(Cleanup /usr/src/linux/目錄所有.o的object file , dependencies and kernel’s .config)

  5. Compile your own Linux kernel • Steps: • Setup the kernel configurationmake config or menuconfig or xconfig • #make dep • #make clean • #make bzImage • #make modules • #make modules_install(Modules will be installed in /lib/modules/2.4.x) • #make install

  6. Compile your own Linux kernel • Edit BootloaderConfiguration File-- /etc/lilo.conf # lilo (完成)

  7. Add a New System Call • Edit : /usr/src/linux/include/asm/unistd.h#define __NR_exit 1 #define __NR_fork 2 …… #define __NR_lremovexattr 236 #define __NR_fremovexattr 237 #define __NR_hello 239 add #defines for you new system calls at the end

  8. Add a New System Call • Edit the file : • /usr/src/linux/arch/i386/kernel/entry.S .data ENTRY(sys_call_table) .long SYMBOL_NAME(sys_ni_syscall) /* 0 .long SYMBOL_NAME(sys_exit) .long SYMBOL_NAME(sys_fork) … .long SYMBOL_NAME(sys_ni_syscall) .long SYMBOL_NAME(sys_hello) .rept NR_syscalls-(.-sys_call_table)/4 .long SYMBOL_NAME(sys_ni_syscall) .endr

  9. Add a New System Call • Definition your source code files • (hello.c and hello.h) • About Header file • Machine architecture independent system calls and functions are kept under linux/include/linux • Machine architecture dependent ones are kept under linux/include/asm

  10. Add a New System Call • Modify the Makefile in the directory you placed your .c file so that your code gets compiled andlinked in properly • Modify the Makefile line to have a .o of yoursource code • For example . Adding hello.o • O_OBJS += …. Hello.o

  11. Add a New System Call • Example: • hello.c and hello.h • hello.h(assuming hello.h is under inux/include/linux) • #ifndef __LINUX_HELLO_H • #define __LINUX_HELLO_H • #include <linux/linkage.h> • #endif

  12. Add a New System Call • hello.c • hello.c (system call implementation) #include <linux/hello.h> #include <linux/kernel.h> Asmlinkage int sys_hello(){ printk(KERN_EMERG “hello\n”); return 0; }

  13. Add a New System Call • User application • App.c #include <linux/unistd.h> _syscall0(int, hello); int main(){ hello(); return 0; } • p.s if compiler error • mv /usr/include/linux /usr/include/linux.bak • mv /usr/iinclude/asm /usr/include/asm.bak • ln –s /usr/src/linux/include/linux /usr/include/linux • ln –s /usr/src/linux/include/asm /usr/include/asm

  14. Add a New System Call • There are some macros defined for this in <linux/unistd.h> • The format is “_syscallN(return type, function name,arg1 type,arg1 name…)” where “N” is the number of parameters. • For example : _syscall1(int, hello, int, a)

  15. The Simple Kernel Module • A Kernel Module must have at least two functions: • “start” (initialization) function called init_module() which is called when the module is insmoded into kernel. • “end” (cleanup) function called clean_module() which is called just before it is rmmoded.

  16. Compiling Kernel Modules • A kernel module should be compiled with the –c flag. • A kernel modules must be compiled with the optimization flag, -Obecause the kernel make extensive use of inline function • Define symbols using gcc’s –D option: • __KERNEL__:tells the header files that the code will be run in kernel mode. • MODULE: tells the header files to give the appropriate definitions for a kernel module.

  17. Adding System Call by Module CC = gcc CFLAGS = -O -D__KERNEL__ -DMODULE -Wall all: hello.o hello.o: hello.c $(CC) $(CFLAGS) -c hello.c-o hello.o install: /sbin/insmod hello.o remove: /sbin/rmmod hello

  18. Adding System Call by Module #include <linux/kernel.h> /* for kernel function */ #include <linux/module.h> /* for module */ #include <linux/unistd.h> /* for system calls */ #include “hello.h“ extern void *sys_call_table[]; void (*orig_sys_call)(void); /* my system call */ int hello(unsignedlong arg) { printk( KERN_EMERG "Hello System Call: %d\n", arg); return 0; }

  19. Adding System Call by Module /* init function, called when loaded */ int init_module(void) { printk(KERN_EMERG“hello module installed\n"); orig_sys_call= sys_call_table[SYS_hello]; /* backup the original system call*/ sys_call_table[SYS_hello] = hello ; /* replace with my system call */ return 0; } void cleanup_module(void) { printk(KERN_EMERG“hello module uninstalled\n"); sys_call_table[SYS_hello] = orig_sys_call; /* restore the original system call */ } /* try to remove thieline */ MODULE_LICENSE("GPL");

  20. Adding System Call by Module #ifndef __HELLO_H__ #define __HELLO_H__ #include <linux/sys.h> /* NR_syscalls is the system call table size, it is 256. Its definition is in linux/include/linux/sys.h. my system call uses the last one, its number is 255 */ #define __NR_hello (NR_syscalls -1) #define SYS_hello (NR_syscalls -1) #endif

  21. Reference • http://fossil.wpi.edu/docs/howto_add_systemcall.html • http://appsrv.cse.cuhk.edu.hk/~csc3150/tutnote/note1/syscall.html • http://www.study-area.org/ • The Linux Kernel Module Programming Guide • 鳥哥的 Linux 私房菜

More Related