为什么刚才的信全是乱码 -----原始邮件----- 发件人: oyk [mailto:oyk@xxxxxxxxxxx] 发送时间: 2003年5月29日 1:00 收件人: kernelreadfans@xxxxxxxxxxxxx 主题: [kernelreadfans] Re: setup our own syscall based linux2.4.20 Hi,guys 我想linux不支持module方式创建自己的系统调用,因为它并没有预留系统调用表的 slot来动态指定对应的函数,它都是固定了的。而FreeBSD预留了210-219给内核开发人 员使用,开发人员可以通过kernel动态分配slot,也可以自己指定slot,即可以在 kernel里实现,又可以module实现。 不知道我对linux的系统调用这个方面的理解对吗? Best Regards Ouyang Kai >Hi, guys, > 基于我前面转载的syscall例子,这封信给出我基于2.4.20写的myfunc。至于 myfunc的模块实现,还没有研究。这是在内核里实现的,和例子的步骤有点不同。 >1. 添加myfunc标志,涉及到两个文件 > a. /usr/src/linux/arch/i386/kernel/entry.S > 找到: > .long SYMBOL_NAME(sys_fcntl64) > 在上句下面添加: > .long SYMBOL_NAME(sys_myfunc) /*jjww test*/ > 注释下面一句: >/* .long SYMBOL_NAME(sys_ni_syscall) reserved for TUX */ > b./usr/src/linux/include/asm/unistd.h > 找到: > #define __NR_fcntl64 221 > 在上句下面添加: > #define __NR_myfunc 222 /*jjww test*/ >2. 添加sys_myfunc实体 > 在/usr/src/linux/kernel/sys.c中添加 >/* > * myfunc() is implemented by jjww > * 1. only printk > */ >asmlinkage int sys_myfunc(int myinput) >{ > printk("1. jjww printk from kernel d\n", myinput); > return myinput; >} >3. 编译、安装内核,重启。 > >4. 编写用户调用程序 >user_myfunc.c >#include <stdio.h> >#include <stdlib.h> >#include <linux/unistd.h> > >static inline _syscall1(int,myfunc,int,a) > >int main(void){ > printf("Return Value: d\n",myfunc(1)); > return 0; >} > >user_myfunc.mk >INCLUDEDIR = /usr/src/linux/include > >CC = gcc >DEBFLAG = -O2 > >CFLAG = -Wall $(DEBFLAG) >CFLAG += -I$(INCLUDEDIR) > >TARGET = usr_myfunc >SRC = $(TARGET).c > >all: > $(CC) $(CFLAG) -o $(TARGET) $(SRC) >clean: > rm -f *.o *.core usr_myfunc >5. 测试 >#./usr_myfunc >#tail -f /var/log/messages >May 29 00:33:18 RHL24 kernel: 1. jjww printk from kernel 1 > >BTW: 我在想怎么能够在模块里实现系统调用的添加,就避免了系统的重启? > >Best Regards > Ouyang Kai >----------------------------------------- >a HUST guy >FreeBSD: http://www.freebsd.org > http://daily.daemonnews.org >Linux: http://www.kernel.org > http://www.linuxfans.org >----------------------------------------- ----------------------------------------- a HUST guy FreeBSD: http://www.freebsd.org http://daily.daemonnews.org Linux: http://www.kernel.org http://www.linuxfans.org -----------------------------------------