在Linux Kernel內新增一個System Call(轉)
在Linux Kernel內新增一個System Call(轉)[@more@]本文作者: gpmoney
使用 system call 去呼叫系統的函式是非常好玩的,但是要如何寫出一個自己的system call 呢?這邊有以下數個步驟,如果你是自己想要呼叫 system call 那可以跳過 (1) (2) 直接到第三項這邊假設你己經熟悉 kernel 的 compile 和如何利用新 compile 的 kernel 重新開機
(1) 設定 include 檔內的 syscall function
首先,找到 /usr/inlcude/asm/unistd.h 這個檔案,在這一行
#define __NR_getdents64 220
#define __NR_fcntl64 221
的後面加上 :
#define __NR_myfunc 222
然後找到 /usr/include/bits/syscall.h 這個檔案,再加上一行 :
#define SYS_myfunc __NR_myfunc
找到 /usr/src/linux/arch/i386/kernel/entry.S 這個檔案也是在最後面加上並修改標記為紅色的這二行
.long SYMBOL_NAME(sys_getdents64) /* 220 */
.long SYMBOL_NAME(sys_fcntl64)
.long SYMBOL_NAME(sys_myfunc) --> 增加這一行
#ifdef CONFIG_TUX
.long SYMBOL_NAME(__sys_tux)
#else
# ifdef CONFIG_TUX_MODULE
.long SYMBOL_NAME(sys_tux)
# endif
#endif
/*
* NOTE!! This doesn't have to be exact - we just have
* to make sure we have _enough_ of the "sys_ni_syscall"
* entries. Don't panic if you notice that this hasn't
* been shrunk every time we add a new system call.
*/
.rept NR_syscalls-222 ----> 改成 NR_syscalls-223
.long SYMBOL_NAME(sys_ni_syscall)
.endr
(2) 撰寫 syscall 的範例程式
假設你的 linux kernel code 在 /usr/src/linux 下找到 /usr/src/linux/kernel/sys.c
加上以上這幾行 :
asmlinkageintsys_myfunc(int input){
printk("<1> Input value is : %d ",input);
return input*10;
}
改完以後,就可以重新 compile kernel 並且重新開機了。
(3) 撰寫 user space 的小程式
use_syscall.c
#include
#include
#include
static inline _syscall1(int,myfunc,int,a)
int main(void){
printf("Return Value: %d ",myfunc(10));
}
這樣執行完以後,你就可以看到這個程式輸出 100
如果你還有興趣,可以使用 tail -f /var/log/message 會出現類似的訊息,表示你的程式有經由 printk 印到畫面上
Sep 3 22:02:02 private kernel: Input value is : 10
_syscall1 是一個 macro 指令,事實上是 _syscallN 的指令 , N 代表系統呼叫所需要用到的引數個數
_syscallN(arg1,arg2,arg3,arg4) :
arg1 : 代表的是傳回值
arg2 : 代表的是要呼叫的 syscall name
arg3 : 代表的是傳入引數的型態
arg4 : 代表的是傳入引數的名稱
系統總共定義了 6 個 _syscallN , 從 _syscall0 到 _syscall5 . 因為這是呼叫 int 0x80 的限制,各位大概發現了一件事,這個只是協助各位去呼叫 int 0x80 這個系統中斷函式,不過 linux 幫我們包的很好
(4) 編譯程式
#gcc -O2 use_syscall.c use_syscall
#./use_syscall
Return Value: 100
使用 system call 去呼叫系統的函式是非常好玩的,但是要如何寫出一個自己的system call 呢?這邊有以下數個步驟,如果你是自己想要呼叫 system call 那可以跳過 (1) (2) 直接到第三項這邊假設你己經熟悉 kernel 的 compile 和如何利用新 compile 的 kernel 重新開機
(1) 設定 include 檔內的 syscall function
首先,找到 /usr/inlcude/asm/unistd.h 這個檔案,在這一行
#define __NR_getdents64 220
#define __NR_fcntl64 221
的後面加上 :
#define __NR_myfunc 222
然後找到 /usr/include/bits/syscall.h 這個檔案,再加上一行 :
#define SYS_myfunc __NR_myfunc
找到 /usr/src/linux/arch/i386/kernel/entry.S 這個檔案也是在最後面加上並修改標記為紅色的這二行
.long SYMBOL_NAME(sys_getdents64) /* 220 */
.long SYMBOL_NAME(sys_fcntl64)
.long SYMBOL_NAME(sys_myfunc) --> 增加這一行
#ifdef CONFIG_TUX
.long SYMBOL_NAME(__sys_tux)
#else
# ifdef CONFIG_TUX_MODULE
.long SYMBOL_NAME(sys_tux)
# endif
#endif
/*
* NOTE!! This doesn't have to be exact - we just have
* to make sure we have _enough_ of the "sys_ni_syscall"
* entries. Don't panic if you notice that this hasn't
* been shrunk every time we add a new system call.
*/
.rept NR_syscalls-222 ----> 改成 NR_syscalls-223
.long SYMBOL_NAME(sys_ni_syscall)
.endr
(2) 撰寫 syscall 的範例程式
假設你的 linux kernel code 在 /usr/src/linux 下找到 /usr/src/linux/kernel/sys.c
加上以上這幾行 :
asmlinkageintsys_myfunc(int input){
printk("<1> Input value is : %d ",input);
return input*10;
}
改完以後,就可以重新 compile kernel 並且重新開機了。
(3) 撰寫 user space 的小程式
use_syscall.c
#include
#include
#include
static inline _syscall1(int,myfunc,int,a)
int main(void){
printf("Return Value: %d ",myfunc(10));
}
這樣執行完以後,你就可以看到這個程式輸出 100
如果你還有興趣,可以使用 tail -f /var/log/message 會出現類似的訊息,表示你的程式有經由 printk 印到畫面上
Sep 3 22:02:02 private kernel: Input value is : 10
_syscall1 是一個 macro 指令,事實上是 _syscallN 的指令 , N 代表系統呼叫所需要用到的引數個數
_syscallN(arg1,arg2,arg3,arg4) :
arg1 : 代表的是傳回值
arg2 : 代表的是要呼叫的 syscall name
arg3 : 代表的是傳入引數的型態
arg4 : 代表的是傳入引數的名稱
系統總共定義了 6 個 _syscallN , 從 _syscall0 到 _syscall5 . 因為這是呼叫 int 0x80 的限制,各位大概發現了一件事,這個只是協助各位去呼叫 int 0x80 這個系統中斷函式,不過 linux 幫我們包的很好
(4) 編譯程式
#gcc -O2 use_syscall.c use_syscall
#./use_syscall
Return Value: 100
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-950450/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [保姆級教程] 如何在 Linux Kernel (V5.17.7) 中新增一個系統呼叫(System call)Linux
- iptables新增模組(for kernel 2.6)(轉)
- golang system callGolang
- linux kernel 2.6.11.12(轉)Linux
- Windows X86 System Call TableWindows
- Linux Kernel V2.6.15.5(轉)Linux
- Linux Kernel 4.1將是下一個長期支援版Linux
- Windows X86-64 System Call TableWindows
- Linux Kernel ACL訪問控制漏洞(轉)Linux
- 在Linux中新增新的系統呼叫(轉)Linux
- 在同一個頁面中新增多個CollectionViewView
- js動態在一個元素中新增另一個元素JS
- 在Linux中,如何新增一個使用者到特定的組?Linux
- 在LINUX下使用內建ISDN卡(轉)Linux
- Linux kernel 'getting buggier'[英文](轉)Linux
- MIPS Linux 下新增系統呼叫,以Linux kernel 2.6.18為例.Linux
- 一個例子看懂call,applyAPP
- 在 Linux Mint 安裝 Linux Kernel 4.12(穩定版)Linux
- Linux kernel mapLinux
- Linux Kernel(核)Linux
- javascript在陣列開頭新增一個元素JavaScript陣列
- Linux Kernel 2.6 核心執行緒嚐鮮(轉)Linux執行緒
- 著名美國電信公司招聘linux kernel engineer(轉)Linux
- 在Red Hat Linux 下新增大量使用者(轉)Linux
- call.apply.bind 走一個!APP
- linux shell與awk在檔案每條記錄後新增一個特定字元Linux字元
- [轉]Hugemem Kernel ExplainedAI
- Hugemem Kernel Explained [轉]AI
- Linux kernel 2.6.32.30Linux
- 在Linux行內直接進行大小寫轉換Linux
- 嵌入式Linux,openssh連線報錯:ssh_sandbox_violation: unexpected system callLinux
- 在webpack-dev-server內新增mock serverWebdevServerMock
- 在 Linux 上如何得到一個段錯誤的核心轉儲Linux
- 如何實現一個 System Services?
- Novell總裁稱Linux將在一年內成PC市場主流(轉)Linux
- JavaScript在陣列開頭新增一個新的元素JavaScript陣列
- Linux Kernel File IO Syscall Kernel-Source-Code Analysis(undone)Linux
- 在Linux系統中批次新增使用者的操作流程(轉)Linux