Linux

如何在 linux kernel 4.x 中添加系統呼叫

  • August 18, 2015

我正在嘗試使用 linux kernel 4.1.6 添加系統呼叫,但我能找到的所有文件都是針對舊版本的。有誰知道它是如何在較新的核心中完成的或者有什麼好的參考資料?

應該有3個步驟:

  1. 添加到系統呼叫表。我發現他們現在使用 arch/x86/syscalls/syscall_64.tbl 而不是 entry.S。所以我在裡面放了一些東西。
  2. 添加到 asm/unistd.h 文件中。顯然 unistd.h 文件現在是自動生成的,所以我們不必手動更新它?所以我沒有為這一步做任何事情,因為文件不存在。 https://stackoverflow.com/questions/10988759/arch-x86-include-asm-unistd-h-vs-include-asm-generic-unistd-h
  3. 將系統呼叫編譯到核心中。我已按照基於核心 2.6 的書(Robert Love 的 linux 核心開發書)中的建議將實際的系統呼叫程式碼添加到 kernel/sys.c。我又編譯了核心。

然後我按照書中的建議編寫了一個客戶端程序,但是當我嘗試編譯它時它顯示未知類型名稱“helloworld”。我的程序與書不同,但結構相同。

#include <stdio.h>

#define __NR_helloworld 323 
__syscall0(long, helloworld)

int main()
{
   printf("I will now call helloworld syscall:\n");
   helloworld();

   return 0;
}

網際網路(和可用的書籍)似乎嚴重缺乏這些資訊——或者Google並不像它想的那樣聰明。無論如何,任何幫助表示讚賞。

謝謝。~

~

~

根據_syscall(2)手冊頁,_syscall0宏可能已過時並且需要 #include <linux/unistd.h>;確實 Linux 4.x 沒有它

但是,您可以安裝musl-libc並使用它的_syscall功能。

您可以簡單地在使用者程式碼中使用間接系統呼叫(2)。所以你的測試程序將是

#define _GNU_SOURCE         /* See feature_test_macros(7) */
#include <unistd.h>
#include <sys/syscall.h> 
#include <stdio.h>
#define __NR_helloworld 323
static inline long mysys_helloworld(void) { return syscall(__NR_helloworld,NULL); }

int main (int argc, char**argv) {  
  printf("will do the helloworld syscall\n");
  if (mysys_helloworld()) perror("helloworld");
  return 0;
}

以上程式碼未經測試!

引用自:https://unix.stackexchange.com/questions/223888