【IT168 服务器频道】首先介绍内核模块的概念,还有系统调用的概念,说明的一点就是freebsd安全级别问题,通常在2级就不可以加载模块了
可以用sysctl 调整设置或者在/etc/rc.conf中增加如下条目在启动时调整:
kern_securelevel_enable="YES"
kern_securelevel="2"
本文only用来教育目的,:)所有涉及的代码都可以在Curious Yellow (CY)中找到.
1.2. 内核模块
请参考 scz@nsfocus 前辈翻译的 内核链接机制(KLD)编程指南>,如果你对linux的lkm了解,这个很好理解。在/usr/share/examples/kld/ 有简单的例子。
1.2 一些有用的的函数
这里给出一些有用的函数,通常在系统调用中用到copyin/copyout/copyinstr/copyoutstr 这几个函数可以用来从用户空间得到
连续的大块数据,manpage copy(9)可以得到更多了解,在KLD tutorial也可以找到
下面是个小例子来展示copyin的用法,我们构造了一个带有一个字符串指针做参数的系统调用,通过copyin把字符串从用户空间移动
到内核空间来
struct example_call_args {
char *buffer;
};
int
example_call(struct proc *p, struct example_call_args *uap)
{
int error;
char kernel_buffer_copy[BUFSIZE];
/* copy in the user data */
error = copyin(uap->buffer, &kernel_buffer_copy, BUFSIZE);
[...]
}
fetch/store
这两个函数用来得到比较小块的数荩〉阶纸诨蛘咦殖さ氖?BR> spl..
这个函数用来调整中断优先级,可以用来阻止某些中断处理程序的执行,下面的例子中当中断处理函数指针icmp_input修改时,因为
它通常要经过一些时时间,所以我们要防止对这个中断的处理。
Freebsd内核模块源码实现以及应用探
0
相关文章