C 在Linux中构建系统调用。内核>;3.x.x
我最初的尝试是借助此工具构建系统调用 我的发行版信息:C 在Linux中构建系统调用。内核>;3.x.x,c,linux,gcc,linux-kernel,glibc,C,Linux,Gcc,Linux Kernel,Glibc,我最初的尝试是借助此工具构建系统调用 我的发行版信息:Linux-epq2.site 3.7.10-1.16-default\1 SMP周五5月31日20:21:23 UTC 2013(97c14ba)x86\u 64 x86\u 64 GNU/Linux 在我的程序的当前版本中,这将允许我将其嵌入到系统调用中,因为它确实有一个main(愚蠢的说法,但仅仅是为了制造一些东西) (更明确) 在我目前的计划中: 它接收用户的两个输入,进行一些计算,并以图形和一些数据的形式给出输出 我最初的尝试是通过
Linux-epq2.site 3.7.10-1.16-default\1 SMP周五5月31日20:21:23 UTC 2013(97c14ba)x86\u 64 x86\u 64 GNU/Linux
在我的程序的当前版本中,这将允许我将其嵌入到系统调用中,因为它确实有一个main(愚蠢的说法,但仅仅是为了制造一些东西)
(更明确)
在我目前的计划中:
它接收用户的两个输入,进行一些计算,并以图形和一些数据的形式给出输出
我最初的尝试是通过unistd
库中的execlp
调用该程序,如下所示:
#include<linux/linkage.h>
#include<linux/kernel.h>
#include<unistd.h>
asmlinkage long graph(const char* granularity, char* application)
{
pid_t child;
child = fork();
if (!child) {
execlp("./system-call", granularity, application, NULL);
}
sleep(0.2);
return 0;
}
我检查了是否安装了glibc,我看到所有内核头文件都可用
zypper search glibc
Loading repository data...
Reading installed packages...
S | Name | Summary | Type
--+--------------------------+-------------------------------------------------------+--------
i | glibc | Standard Shared Libraries (from the GNU C Library) | package
i | glibc-32bit | Standard Shared Libraries (from the GNU C Library) | package
i | glibc-devel | Include Files and Libraries Mandatory for Development | package
i | glibc-devel-32bit | Include Files and Libraries Mandatory for Development | package
i | glibc-devel-static | C library static libraries for -static linking | package
i | glibc-devel-static-32bit | C library static libraries for -static linking | package
i | glibc-extra | Extra binaries from GNU C Library | package
i | glibc-info | Info Files for the GNU C Library | package
i | glibc-locale | Locale Data for Localized Programs | package
i | glibc-locale-32bit | Locale Data for Localized Programs | package
i | glibc-utils | Development utilities from GNU C library | package
i | linux-glibc-devel | Linux headers for userspace development | package
我检查了它在新内核转储中是否可用,但它不可用
将unistd.h
从/usr/include/unistd.h
复制到我要编译的新内核转储是否安全
还是有别的办法
这里有一个更新:编辑
我不得不把它从#include
改为#include
但我还是得到了错误
error: implicit declaration of function ‘fork’ [-Werror=implicit-function-declaration]
error: implicit declaration of function ‘execlp’ [-Werror=implicit-function-declaration]
warning: incompatible implicit declaration of built-in function ‘execlp’ [enabled by default]
确实不确定问题出在哪里。On fork()/exec()错误:不能从内核模式调用库代码。考虑一下您正在尝试做什么,fork生成一个新的用户进程作为当前进程的克隆,exec用一个新进程替换该进程。Fork和exec本身就是系统调用(尽管您通常调用的函数是围绕调用本身的libc包装器),因此尝试通过调用系统调用来创建系统调用有点落后
关于实现graph():您不能从内核模式运行用户空间程序(如“graph”程序),至少不容易。您需要将图形程序的代码编译到内核中的某个地方(这里有一个模块很好,但这比将.c文件放到源代码树中并编译它们要困难得多)
可以直接从内核模式调用fork和exec,但这不是创建graph()系统调用所需的操作。内核空间不是用户空间。不要期望内核的开发方式与用户空间的开发方式相同。@tangrs:当然,但我看不出有什么错误:-)这是链接文件还是其他问题?使用
#include
同样的错误仍然存在。你想在图形函数中做什么?让我们知道,以便我们能为您提供更多帮助。同时也发布模块代码。这是真的。但是,内核应该有一种生成子进程的方法,对吗?你知道函数调用的确切位置吗?@pistal-如果你想生成一个新线程,请阅读关于kthreads的内容。你可以看看usermode helper API。
error: implicit declaration of function ‘fork’ [-Werror=implicit-function-declaration]
error: implicit declaration of function ‘execlp’ [-Werror=implicit-function-declaration]
warning: incompatible implicit declaration of built-in function ‘execlp’ [enabled by default]