MIPS Linux 下新增系統呼叫,以Linux kernel 2.6.18為例.
MIPS Linux 下新增系統呼叫,以Linux kernel 2.6.18為例
新增一個系統呼叫有以下幾個步驟:
1. 在 kernel 的系統呼叫表 sys_call_table 中新增你的系統呼叫入口
根據你用的核心位數(32/64bit) 選擇需要修改的檔案:
arch/mips/kernel/scall32-o32.S ------> 32bit kernel
arch/mips/kernel/scall64-64.S ------> 64bit kernel
64bit核心,如果支援相容32 bit ABI (o32, n32 ) 則還需修改 scall64-o32.S 或 scall64-n32.S
以32bit 核心為例,在 arch/mips/kernel/scall32-o32.S 中找到巨集定義
.macro syscalltable /* 系統呼叫號從 4000 開始 */
......
......
sys sys_faccessat 3 /* 4300 */
sys sys_pselect6 6
sys sys_ppoll 5
sys sys_unshare 1
sys sys_splice 4
sys sys_sync_file_range 7 /* 4305 */
sys sys_tee 4
sys sys_vmsplice 4
sys sys_move_pages 6
sys sys_set_robust_list 2
sys sys_get_robust_list 3 /* 4310 */
sys sys_ni_syscall 0
sys sys_ni_syscall 0
sys sys_ni_syscall 0
sys sys_ioprio_set 3
sys sys_ioprio_get 2 /* 4315 */
sys sys_wenxy_test 0 /* system call ID is 4316, wenxy add, 20091120 */
.endm
......
最後加入自定義的系統呼叫 sys_wenxy_test 於 sys_call_table 中, sys 為輔助巨集,呼叫名後的數值 0 指示該系統呼叫所需的引數個數。
只能加在 sys_call_table 的最後,否則會擾亂標準的系統呼叫。
2. 實現系統呼叫
可以在 arch/mips/kernel/syscall.c 中給出一個實現,如:
......
/* wenxy add begin, 20091119, a.m. */
#include "/opt/bcm97405/kernel/stblinux-2.6.18/arch/mips/sibyte/cfe/cfe_api.h"
asmlinkage int sys_wenxy_test(void)
{
uint64_t cfe_ept, cfe_handle;
int n;
//n = cfe_init(cfe_handle, cfe_ept);
printk(KERN_EMERG "kernel, wenxy debug: into [%s], call [%s()]/n", __FILE__, __FUNCTION__);
return 100;
}
/* wenxy add end */
3. 修改 include/asm-mips/unistd.h
根據你的核心位和支援的ABI版本修改相應的巨集定義,32bit 核心需修改:
#define __NR_Linux_syscalls 320 ---------> 321 (The number of linux syscalls)
#define __NR_O32_Linux_syscalls 320 ---------> 321 (The number of linux O32 syscalls)
相應的在其上的巨集集的最後加入:
.......
#define __NR_ppoll (__NR_Linux + 302)
#define __NR_unshare (__NR_Linux + 303)
#define __NR_splice (__NR_Linux + 304)
#define __NR_sync_file_range (__NR_Linux + 305)
#define __NR_tee (__NR_Linux + 306)
#define __NR_vmsplice (__NR_Linux + 307)
#define __NR_move_pages (__NR_Linux + 308)
#define __NR_set_robust_list (__NR_Linux + 309)
#define __NR_get_robust_list (__NR_Linux + 310)
#define __NR_ioprio_set (__NR_Linux + 314)
#define __NR_ioprio_get (__NR_Linux + 315)
/* wenxy add begin , 20091119, a.m. */
#define __NR_wenxy_test (__NR_Linux + 316)
/* wenxy add end */
......
4. 測試新的系統呼叫wenxy_test
test.c檔案, C程式:
#if 1
#include <stdio.h>
#include <linux/unistd.h>
#include <sys/syscall.h>
#include <errno.h>
#else
#include "/opt/bcm97405/kernel/stblinux-2.6.18/include/linux/unistd.h"
#include "/opt/bcm97405/kernel/stblinux-2.6.18/include/sys/syscall.h"
#endif
//#define __NR_getjiffies 320
//#define __NR_wenxy_test 319
#define __NR_wenxy_test (__NR_Linux + 316)
_syscall0(int, wenxy_test);
int main()
{
long jiffies;
int n;
// jiffies = syscall( __NR_getjiffies );
// printf( "Current jiffies is %lx/n", jiffies );
n = 0;
//n = syscall(__NR_wenxy_test);
n = wenxy_test();
printf("Wenxy: syscall return value is [%d], system call ID=[%d]/n", n, __NR_wenxy_test);
return 0;
}
編譯test.c的命令:mipsel-linux-gcc -I/opt/bcm97405/kernel/stblinux-2.6.18 test.c
或者自己寫彙編程式:
用重新編譯後的核心啟動,如下程式測試之:
.text
.globl main
.ent main
main:
li $2, 4316 /* wenxy_test 的系統的呼叫號 */
syscall
.end main
其中 MIPS 下系統呼叫的約定為:
v0: 用於置系統呼叫號
a0~a3: 置前四個引數,後面的引數用棧傳
syscall 系統呼叫觸發指令
編譯 gcc cat.S -o a.out
執行 ./a.out
正確的話應有如下輸出:
# a.out
kernel, wenxy debug: into [arch/mips/kernel/syscall.c], call [sys_wenxy_test()]
Wenxy: syscall return value is [100], system call ID=[4316]
PS.
a. 可以用dmesg檢視核心日誌,或者用strace a.out來跟蹤系統呼叫資訊。
b. 參考資料:
http://www.ibm.com/developerworks/cn/linux/l-system-calls/index.html
http://www.diybl.com/course/3_program/hb/hbjs/200798/70400.html#
相關文章
- [保姆級教程] 如何在 Linux Kernel (V5.17.7) 中新增一個系統呼叫(System call)Linux
- Linux下的使用(以ubuntu16.04為例)LinuxUbuntu
- Linux系統呼叫原理Linux
- 如何在Linux系統下安裝Android-Studio的詳細步驟(以Ubuntu為例)LinuxAndroidUbuntu
- 學習筆記 作業系統Linux-Ubuntu 之初次新增系統呼叫筆記作業系統LinuxUbuntu
- linux系統關於kernel.sem調優Linux
- Linux(以CentOS 7為例)下安裝、解除安裝、啟動OpenOfficeLinuxCentOS
- x64架構下Linux系統函式呼叫架構Linux函式
- Linux kernel mapLinux
- Linux系統呼叫機制淺析Linux
- linux系統怎麼新增每天定時任務? linux系統新增定時任務的教程Linux
- 【Linux】詳解六種配置Linux環境變數的方法(以centos為例)Linux變數CentOS
- Linux系統中head命令例項Linux
- Linux系統MBR修復及遺忘root密碼解決方法(以centos7為例)Linux密碼CentOS
- Linux作業系統分析 | 深入理解系統呼叫Linux作業系統
- linux系統呼叫第一篇Linux
- xenomai核心解析--雙核系統呼叫(三)--如何為xenomai新增一個系統呼叫AI
- Kernel Module實戰指南(四):系統呼叫劫持
- jstat命令檢視jvm的GC情況 (以Linux為例)JSJVMGCLinux
- [LINUX] Arch Linux 硬碟拷貝式裝系統+新增 home 分割槽Linux硬碟
- 在 Linux 上用 strace 來理解系統呼叫Linux
- 線上環境 Linux 系統呼叫追蹤Linux
- linux軟中段和系統呼叫深入研究Linux
- linux系統下svn常用指令Linux
- VirtualBox下安裝Linux系統Linux
- Linux系統下網路配置Linux
- Linux系統下活用History命令Linux
- VM虛擬機器 linux系統新增磁碟虛擬機Linux
- C 語言宏 + 內聯彙編實現 MIPS 系統呼叫
- taro 介面封裝和呼叫 以豆瓣api為例封裝API
- Linux系統中的basename命令使用例項Linux
- 為什麼基本型別可以呼叫方法——以字串為例型別字串
- Linux系統呼叫詳解(實現機制分析)Linux
- Linux系統程式設計(七)檔案許可權系統呼叫Linux程式設計
- Linux下檢視、新增及配置Linux
- Linux系統下的HDD Rootkit分析Linux
- 作業系統 Linux下的程式作業系統Linux
- 為何以及如何學Linux系統?Linux
- Linux命令strace跟蹤程式的系統呼叫-linux學習用什麼書Linux