Chinaunix

标题: 模块初始化中为什么不能调用系统调用? [打印本页]

作者: scopengl    时间: 2009-12-15 10:52
标题: 模块初始化中为什么不能调用系统调用?
RT  谢谢
作者: Godbach    时间: 2009-12-15 10:56
类似于sys_open之类的是可以调用的
作者: liying_gg    时间: 2009-12-15 11:09
标题: 回复 #1 scopengl 的帖子
可以调用啊。
作者: scopengl    时间: 2009-12-15 11:41
我在模块初始化中创建了一个kernel_thread,然后在这个kernel_thread中调用kernel_execve,结果显示unknown symbol kernel_execve,kernel_execve也是一个系统调用吧?
作者: Godbach    时间: 2009-12-15 11:44
原帖由 scopengl 于 2009-12-15 11:41 发表
我在模块初始化中创建了一个kernel_thread,然后在这个kernel_thread中调用kernel_execve,结果显示unknown symbol kernel_execve,kernel_execve也是一个系统调用吧?

这个应该不是系统调用。根据你的提示,应该是你没有正确incldue这个函数的头文件,或者该函数并没有EXPORT出来给其他模块使用
作者: liying_gg    时间: 2009-12-15 12:49

  1. /*
  2. * Do a system call from kernel instead of calling sys_execve so we
  3. * end up with proper pt_regs.
  4. */
  5. int kernel_execve(const char *filename, char *const argv[], char *const envp[])
复制代码

内核中并没有EXPORT这个函数
作者: scopengl    时间: 2009-12-15 13:21
标题: 回复 #5 Godbach 的帖子
kernel_execve定义在syscalls.h中,会调用系统调用sys_execve,估计应该是你所得该“函数并没有EXPORT出来”,但是系统调用都会export出来么?还是不太明白。
作者: Godbach    时间: 2009-12-15 13:28
kernel_execve定义在syscalls.h中

你的内核版本是多少,我这里2.6.18的内核,该函数并没有在syscalls.h中
作者: Godbach    时间: 2009-12-15 14:10
另外,如果你调用的系统调用是通过EXPORT_SYMBOL_GPL导出来的,那么你的模块中也要加上MODULE_LICENSE("GPL")的声明才可以
作者: scopengl    时间: 2009-12-15 14:12
标题: 回复 #8 Godbach 的帖子
2.6.27
作者: Godbach    时间: 2009-12-15 14:22
看一下是否存在我9楼中提到的问题
作者: liying_gg    时间: 2009-12-15 15:02
我内核git pull出来的,该函数只有这两种情况被export出来了,其他arch都没有export
arch/alpha/kernel/alpha_ksyms.c
EXPORT_SYMBOL(kernel_execve);
arch/arm/kernel/sys_arm.c
EXPORT_SYMBOL(kernel_execve);

[ 本帖最后由 liying_gg 于 2009-12-15 15:04 编辑 ]
作者: scopengl    时间: 2009-12-15 15:08
标题: 回复 #12 liying_gg 的帖子
恩  ,应该是你说的情况,我用的是mips平台,该函数只在main.c等init相关的代码中使用,谢谢了~

也谢谢Godbach的耐心解答~
作者: emmoblin    时间: 2009-12-15 15:45
在内核中还调什么系统调用?
直接掉对应的函数就行了。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2