在include/linux/syscalls.**件中的#endif前新增自己的系統呼叫函式宣告,內容如下:
asmlinkage long sys_test(void);
隨便找乙個檔案,我們在這個檔案中新增系統呼叫的原始碼syscall_define0(test),內容如下:
syscall_define0(test)
這裡的 syscall_define0巨集表示我們的系統呼叫是無參的,該巨集在上面syscalls.h標頭檔案中定義。 syscall_define0的引數個數為乙個,syscall_definen的函式個數是n個
新增系統呼叫向量,在arch/x86/syscalls/syscall_64.tbl檔案中新增系統呼叫號和系統呼叫服務程式入口(如果是32位系統,則修改syscall_32.tbl檔案),在313號系統呼叫後面新增如下內容:
314 common test sys_test
系統呼叫會去查詢sys_call_table這個陣列並找到對應的系統呼叫函式去執行,注意其中有乙個關鍵函式do_ni_syscall,(no implement syscall),當系統呼叫遇到一些限制或者問題時會跳轉到該函式去執行。
arch/arm64/kernel/sys.c:
/* * the sys_call_table array must be 4k aligned to be accessible from
* kernel/entry.s.
*/void * const sys_call_table[__nr_syscalls] __aligned(4096) = ;
這個陣列在建立時首先會把所有的陣列成員設定為sys_ni_syscall,而後根據asm/unistd.h中的內容做進一步初始化。其實最終該標頭檔案會把include/uapi/asm-generic包含進來,也就是這個標頭檔案會是最終定義陣列的地方。如下所示:
__syscall(__nr_bpf, sys_bpf)
#define __nr_execveat 387
__syscall(__nr_execveat, compat_sys_execveat)
#define __nr_use***ultfd 388
__syscall(__nr_use***ultfd, sys_use***ultfd)
#define __nr_membarrier 389
__syscall(__nr_membarrier, sys_membarrier)
#define __nr_mlock2 390
__syscall(__nr_mlock2, sys_mlock2)
#define __nr_copy_file_range 391
__syscall(__nr_copy_file_range, sys_copy_file_range)
#define __nr_preadv2 392
__syscall(__nr_preadv2, compat_sys_preadv2)
#define __nr_pwritev2 393
__syscall(__nr_pwritev2, compat_sys_pwritev2)
我們新增系統呼叫之後也需要在此陣列中新增乙個元素,例:
#define __nr_test 394
__syscall(__nr_test, sys_test)
在陣列中新增元素之後,還需要更新這個陣列元素的個數,例:
arch/arm64/include/sam/unistd.h
#define __nr_compat_syscalls 395//394+1
他在unistd.h的檔案中,每個系統呼叫號都已_nr_開頭,我們新增系統呼叫號如下所示:
#define __nr_test 290
__syscall(__nr_test, sys_test)
#undef __nr_syscalls
#define __nr_syscalls 292//291+1
我們建立乙個應用測試程式,原始碼如下所示:
#include #include #include int main(void)
如何向Linux0 11新增乙個系統呼叫?
我們假設這個呼叫是foo 返回值型別是void。linux0.11實現系統呼叫的基本過程如下 舉例說明 include linux sys.h extern intsys iam sys iam include unistd.h define nr iam 72 intiam const char ...
linux 新增系統呼叫
此文於2010 02 26被推薦到csdn首頁 如何被推薦?新的建立檔案描述符的 syscall 一般都支援額外的 flags 引數,可以直接指定 o nonblock 和 fd cloexec,例如 以上 6 個 syscalls,除了最後乙個是新功能,其餘的都是增強原有的呼叫,把數字尾號去掉就是...
Linux新增系統呼叫
修改核心 新增函式,新增函式宣告以及新增系統呼叫id,來實現給自己編譯的核心新增系統呼叫。當然這個過程是在編譯核心之前完成的,核心編譯過程請參照linux核心編譯 進入解壓的檔案目錄 cd usr src linux 5.1 kernel在sys.c中新增函式 執行vim sys.c使用vim開啟s...