+ -
当前位置:首页 → 问答吧 → 提问:怎么在自己编写的模块中使用系统调用(2.4.20)

提问:怎么在自己编写的模块中使用系统调用(2.4.20)

时间:2006-01-06

来源:互联网

我想用read、write的系统调用,可是总是说这两个系统调用的名字无法识别。

作者: andy_taoke   发布时间: 2006-01-06

是可以用的,不过不能直接用这几个函数名,在 init/main.c 中调用了系统调用 dup ,从中可以看到:

* 不能直接使用系统调用原名,main.c 中用的是 (void) sys_dup(0);

作者: crquan   发布时间: 2006-01-07

要用_syscall0 ~ _syscall6
这几个宏先定义一下的,自己google一下这几个宏吧

作者: xieweiyi   发布时间: 2006-01-08

这个活放下了好久了~~哪天试试~~谢谢你~~~

作者: andy_taoke   发布时间: 2006-01-08

就是有!在核心态调用也不会成功!核心没有描述符!

作者: gotop2004   发布时间: 2006-01-11

那怎么办呢?

作者: andy_taoke   发布时间: 2006-01-11

那就自己动手,丰衣足食
自己调用 file_open 获取 file 结构,然后:
代码:
loff_t pos = file_pos_read(file);
ret = vfs_write(file, buf, count, &pos);
file_pos_write(file, pos);
fput_light(file, fput_needed);
不过这样很危险,因为很有可能睡眠。可以考虑交给工作队列(workqueue)或者自己创建内核线程

作者: rickxbx   发布时间: 2006-01-11

首先 在文件中包含#define __KERNEI_SYSCALLS__ 也可以在编译选项中添加

还要包含#include <linux/unistd.h>
必须自定义一个 int error;

/*
#include <asm/access.h>
#include <asm/process.h>
#include <linux/fs.h>
#include <linux/file.h>*/是否必要,不清楚,我用的时候一律全加上了,呵呵

mm_segment_t old_fs = get_fs();
set_fs(KERNELK_DS);

...................//调用read write函数

set_fs(old_fs);

作者: pangumax   发布时间: 2006-04-19