簡體   English   中英

在Linux中構建系統調用。 內核> 3.xx

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM