CSDN博客

img bmsdr

关于在BSD系统中简单设计系统调用, --核心开发入门(2)

发表于2004/10/2 19:24:00  780人阅读

关于在BSD系统中简单设计系统调用
作者:xie_minix
在操作系统的分层结构中, 通常把与机器硬件直接有关的部分放在最内层(中断处理, 设备驱动程序), 把与用户关系密切的部分放在
最外层(外壳程序), 把进程调度、内存管理和文件系统放在中间层. 从计算机硬件开始,在指令系统的基础上, 先实现最内层的功能,
于是得到了一个比硬件机器功能强的第一级虚拟机; 再以第一级虚拟机为基础, 实现中间层的功能, 得到第二级虚拟机. 这样逐层扩
充,最后得到一个功能最强的虚拟机, 即用户眼中的虚拟机.这种分层结构, 使得内层为外层提供服务, 外层通过调用内层提供的服务
实现对计算机的控制, 越往外层与计算机硬件的关系越淡薄, 简化了用户对计算机的使用. 这种外层调用内层服务的过程就叫做系统
调用.
以下是一个简单的例子,用户可以调用他取得网络适配器的进出流量情况,如果略加扩展,功能能更加强大.
*/
#include <sys/types.h>
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/proc.h>
#include <sys/mount.h> /*因为在syscallargs.h中有一些变量在mount.h中定义*/
#include <sys/syscallargs.h>

#include <net/if.h> /*要用到的ifnet结构*/

extern struct ifnet_head ifnet;/*ifnet结构队列头.*/

int sys_xiecall(struct proc *p,void *v,register_t *retval)
{
struct sys_xiecall_args *uap=v;
/*
struct sys_xiecall_args {
syscallarg(u_short) len;
syscallarg(struct ifnet *) myifnet;
};
*/
int error;
struct ifnet *ifp;
u_int sz;

sz=sizeof(struct ifnet);/*结构的长度*/
TAILQ_FOREACH(ifp,&ifnet,if_list) {/*遍历所有ifnet*/
if ((u_short)(SCARG(uap,len)) == ifp->if_index) {/*len是由用户执行系统调用时传递进来的参数,即设备的在系统中的唯一序号*/
if ((error=copyout(ifp,SCARG(uap,myifnet),sz))!=0) /*在搜索到后把整个ifnet结构拷贝到用户内存区.*/
return (error);
return (0);/*没有错误*/
}
}
return (EINVAL);/*没找到则返回系统调用的传值错误.*/
}

/*
/sys/kern/syscalls.master文件中的最后加入一行
286 STD { int sys_xiecall(u_short len, struct ifnet *myifnet); }
注意:286是按顺序来的,前一个系统调用是285号,具体看你的系统调用的最大号是多少,新加的系统调用号在最大的
系统调用号上加1.
/sys/conf/files文件中插入一行
找到该行:file kern/vnode_if.c.如果用vi的话,使用命令:/file kern/vnode_if.c就能找到,在下面插入一行:
file kern/sys_mysyscall.c
由于增加一个系统中断调用要涉及到的几个文件的修改,所以对每个相关文件进行单个修改是非常麻烦的事,在
/sys/kern下有一个工具:make,也就是说,执行:
cd /sys/kern
make
后就全部完成了相关的头文件的改变工作.

*/
/*本文可以直接拷贝到/src/sys/kern目录下,并取名为sys_mysyscall.c.程序已经在
openbsd3.0下调试过.*/
阅读全文
0 0

相关文章推荐

img
取 消
img