[英]Building system calls in Linux. Kernel > 3.x.x
我最初嘗試借助此問題來構建系統調用
我的發行信息: Linux linux-epq2.site 3.7.10-1.16-default #1 SMP Fri May 31 20:21:23 UTC 2013 (97c14ba) x86_64 x86_64 x86_64 GNU/Linux
在我程序的當前版本中,這將允許我將其嵌入為系統調用確實具有主要功能(愚蠢的說法,甚至只是為了使事情更明確)。
在我當前的程序中:
它從用戶處接收兩個輸入,並進行一些計算,並以圖形和一些數據的形式給出輸出。
我最初的嘗試是通過像這樣的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;
}
但是,當我嘗試編譯內核(注意:相同的內核版本)和舊的配置文件時(如有必要,我還將上傳配置文件)。 我收到以下錯誤:
linux-3.7.10 % make
make[1]: Nothing to be done for `all'.
make[1]: Nothing to be done for `relocs'.
CHK include/generated/uapi/linux/version.h
CHK include/generated/utsrelease.h
CALL scripts/checksyscalls.sh
CHK include/generated/compile.h
make[3]: `arch/x86/realmode/rm/realmode.bin' is up to date.
CHK kernel/config_data.h
CC test/graph.o
test/graph.c:10:19: fatal error: unistd.h: No such file or directory
compilation terminated.
make[1]: *** [test/graph.o] Error 1
make: *** [test] Error 2
make 4.50s user 1.27s system 75% cpu 7.626 total`
我檢查是否安裝了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<unistd.h>
更改為#include<asm/unistd.h>
但仍然收到錯誤
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]
真的不確定是什么問題。
關於fork()/ exec()錯誤:您不能從內核模式調用庫代碼。 考慮一下您要執行的操作,派生生成一個新的用戶進程作為當前進程的克隆,然后exec用一個新的用戶進程替換該進程。 Fork和exec本身就是系統調用(盡管通常調用的函數是調用本身的libc包裝器),因此嘗試通過調用系統調用來創建系統調用有點落后。
在實現graph()時:至少不能輕易地從內核模式運行用戶空間程序(例如“ graph”程序)。 您將需要將圖程序的代碼編譯到某個地方的內核中(這里的模塊很不錯,但是要把.c文件插入源代碼樹並將其編譯進來就很難了)。
可能可以直接從內核模式調用fork和exec,但這不是您要創建graph()系統調用所要執行的操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.