分类: LINUX
2010-06-29 19:35:53
系统调用实现机制
由于操作系统的不同,其系统调用的实现方式可能不同,然而实现的机制应该大致相同,包括一下几个步骤:
l 设置系统调用号:系统当中往往设置多条调用命令,并赋予每条系统调用命令一个唯一的系统调用号;
l 处理系统调用:操作系统中有一张系统调用入口表,表中的每个表目都对应一条系统调用命令,它包含有该系统调用自带参数的数目,系统调用命令处理程序的入口地址等,操作系统内核便是根据所输入的调用号在该表中查找到对应的系统调用,进而转入它的入口地址执行它。
1.添加源代码
即编写加到内核中的源程序,也就是将要加到一个内核文件中去的一个函数,函数名为系统调用名称(sys_标志);添加位置在:、linux/kernel/sys.c
如:
asmlinkage int sys_foo(int x)
{
Printk("%d",x);
}
2.连接新的系统调用
添加新的系统调用后,下一个任务就是让linux内核的其余部分知道该 程序的存在,为了从已有的内核程序中增加到新函数的链接,操作如下:
进入:/linux/include/asm-i386/unistd.h.这个文件包含系统调用的清单,用来给 每个系统调用分配一个唯一的号码,系统调用号的定义格式:
#define _NR_name NNN //NNN为系统调用对应的号码,name用系统调用名称替代,在:/linux/arch/i386/kernel/entry.S中加入.long SYMBOL_NAME(sys_foo)
3.重新编译内核
为使新的系统调用生效,需重建linux内核,必须以root的身份登录,进入/linux下重建内核:
#make menuconfig //配置内核,注意在filesystem中选上ext3文件系统支持
#make clean //清除以前编译的中间件
#make dep //读取配置文件,创建依赖关系树
#make bzImage //编译内核
#make modules //编译内核
#make modules_install //把模块复制到需要的目录中
#depmod -a //生成模块间的依赖
4.装载内核
将/linux/arch/i386/boot/bzImage拷贝到/boot下
修改/boot/grub/grub.conf 重启
5.编写测试程序
Int error;
_syscall1(char*,foo,int,ret)