|
发表于 2003-4-16 16:53:02
|
显示全部楼层
我写了下面代码,实现了open()系统调用对文件操作(创建文件)。其他调用你自然就明白了:
- /*************************************
- *
- * kopen.c by keenor [email]keenor@sohu.com[/email]
- * gcc -O2 -I/usr/src/linux/include -c -o kopen.o kopen.c
- * 4/16/2003
- *
- * ***********************************
- */
- #ifndef __KERNEL__
- #define __KERNEL__
- #endif
- #ifndef MODULE
- #define MODULE
- #endif
- #include <linux/modversions.h>
- #include <sys/syscall.h>
- #include <linux/kernel.h>
- #include <linux/module.h>
- #include <asm-i386/uaccess.h>
- #include <asm-i386/segment.h>
- #include <linux/types.h>
- #include <linux/unistd.h>
- #include <linux/fs.h>
- extern void *sys_call_table[];
- int (*open)(char *, int, int);
- int kread_init(){
- open = sys_call_table[SYS_open];
- // printk("<1>%s%x\n", "open=", (unsigned long)open);
- mm_segment_t old_fs_value=get_fs();
- set_fs(get_ds());
- int res = open("/aaa", O_CREAT|O_RDWR|O_EXCL, 0640);
- // printk("<1>%s%d\n", "res of open = ", res);
- set_fs(old_fs_value);
-
- return 0;
- }
- void kread_cleanup(){
- //
- }
- module_init(kread_init);
- module_exit(kread_cleanup);
- MODULE_LICENSE("GPL");
复制代码
编译通过,我的内核为2.4.20,老内核你再改改吧:)。执行insmod kopen.o 后会在产生 /aaa 文件,权限为640。
注意:redhat等某些dist的某些版本内核并不输出 sys_call_table 符号,这种情况下你可以考虑升级内核,或者把原来的内核原码的sys_call_table输出(还是升级内核好:p)。 |
|