2014-10-16 88 views
2

我會一步引導您一步錯誤使用自定義的系統編譯Linux內核模塊調用

首先,我編輯的3個文件在我的Linux內核目錄

  1. 打開LINUX_DIRECTORY/arch/x86/syscalls/syscall_64.tbl並添加自定義來電我「M實施 - 使用適當的格式

  2. 這裏聲明它們:LINUX_DIRECTORY/include/linux/syscalls.h - 使用適當的格式:

  3. 打開LINUX_DIRECTORY/Makefile並添加我存儲我的新系統的目錄調用到core-y行:

    核心-Y:= USR/my_system_call_directory/

這裏就是我遇到的問題。在LINUX_DIRECTORY/my_system_call_directory內部,我添加了一個C文件,其中包含我的自定義系統調用定義及其相應的Makefile。我離開的定義空,因爲我的內核模塊的C文件裏面,我宣佈一個外部功能(我自定義的系統調用),並定義其設置爲我的外部函數一個獨立的功能:

extern long (*start_shuttle)(void); 

long my_start_shuttle(void) { 

    // stuff here 

} 


int init_module(void) { 

    // stuff here 

    start_shuttle = my_start_shuttle; 

    // more stuff 
} 

重新編譯內核我後嘗試make內核模塊並得到一個no definition for start_shuttle錯誤。

這是因爲我在my_system_call_directory中留下了start_shuttle空白的定義嗎?它應該與我在內核模塊中定義的my_start_shuttle完全匹配,還是有我應該添加的特殊內容?我事先詢問了一些愚蠢的問題,因爲我的機器需要很長時間才能重新編譯Linux,而我不知道要改變什麼。謝謝

回答

1

想通了。對於像我這樣慢的人,你必須使用包裝和存根。

所以在這個例子中,在my_system_call_directory,在c文件爲您的新的系統調用的定義,你需要的東西是這樣的:

#include <linux/linkage.h> 
#include <linux/kernel.h> 
#include <linux/module.h> 
#include <linux/export.h> 

// initialize the stub function to be NULL 

long (*start_shuttle)(void) = NULL; 

EXPORT_SYMBOL(start_shuttle); 

// wrapper 

asmlinkage long sys_start_shuttle(void) 
{ 
if (start_shuttle) 
    return start_shuttle(); 
else 
    return -ENOSYS; 
}