|
|
发表于 2005-6-2 13:16:22
|
显示全部楼层
4.2 在内核中可以使用系统调用吗?
a. 可以。内核源代码中就有使用系统调用的例子,如open()、execve()等。
b. 在内核中使用系统调用必须要在源文件中包括以下两行:
#define __KERNEL_SYSCALLS__
#include <linux/unistd.h>
c. 内核中使用系统调用的相关定义可查看文件include/asm/unistd.h。
如果要用的系统调用该文件中没有定义,可以按照其格式自行添加。
d. 如果要在模块中使用系统调用,必须要自己定义errno如:
int errno;
内核在lib/errno.c中定义了errno,但该符号不导出,所以模块编程时需要自己
定义errno,用以存放系统调用出错号。
4.3 在内核中怎么打开并操作一个文件?
a. 直接用open()、read()等系统调用,见问题4.2。
b. 用filp_open()函数打开文件,得到struct file *的指针fp。
使用指针fp进行相应操作,如读文件可以用fp->f_ops->read。
最后用filp_close()函数关闭文件。
filp_open()、filp_close()函数在fs/open.c定义,在include/linux/fs.h中
声明。
c. 自己写包装函数,可参照文件fs/exec.c中的open_exec()和kernel_read()函数。
在http://www.linuxforum.net/forum/ ... t=&Board=linuxK
&Number=363455&page=&view=&sb=&o=&vc=1上有些代码可以参照。 |
|