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

关于在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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值