1. 程式人生 > >如何在Linux 4.12核心新增系統呼叫

如何在Linux 4.12核心新增系統呼叫

轉發:http://blog.csdn.net/qq_34911465/article/details/74840024

基本情況

系統版本:CentOS Linux 7

核心版本:linux-4.12

準備操作

1.下載並且解壓開啟資料夾

這裡寫圖片描述
這裡寫圖片描述

2.進入資料夾後進入系統呼叫的入口表,這個表記錄了系統呼叫的一些基本資訊。

系統呼叫表就是這個檔案了,用如圖命令開啟
這裡寫圖片描述
這裡是新增系統呼叫的格式,新增我們自己的系統呼叫也要按照這個格式來操作,第一個是呼叫號,就是用來呼叫的標誌,abi不知有什麼作用,名字是也不知,入口是函式名,按照格式填寫即可。
這裡寫圖片描述
這裡是我新增的系統呼叫,參考上圖,我們知道這裡的abi有三種可以填(common、64、x32) ,經過測試發現x32沒有效果,所以我們的abi只能寫common或者x64,如圖中呼叫號為549和550所示。
這裡寫圖片描述

3.新增系統呼叫宣告

開啟這個檔案即可
這裡寫圖片描述
在檔案尾部進行如下新增,這裡的void很重要,如果是沒有引數的呼叫那麼就一定要寫void,否則會失敗。
這裡寫圖片描述

4.實現系統呼叫

實現系統呼叫的檔案是kernel資料夾下的sys.c檔案,也可以自己寫一個檔案,但是自己寫檔案還需修改Makefile,這裡從簡。
這裡寫圖片描述
在檔案的最後一行編寫實現程式碼,同樣的要在括號中寫void。紅框的都是涉及個人資訊,可修改
這裡寫圖片描述

5.編譯核心

參看之前的文章: Linux 編譯核心全記錄
編譯核心成功後重啟進入新的核心。
這裡寫圖片描述

6.編寫呼叫的程式

#include<unistd.h>
int main(){
    syscall(549);//對於無參的直接這樣呼叫即可,有參的要新增引數,括號中填寫的是之前定義的系統呼叫號
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5

編譯

//使用g++命令編譯,g++命令加上檔名編譯,預設生成a.out檔案,使用./a.out執行
  • 1

7.檢視系統呼叫

//直接在終端中打dmesg,出來的字元中就有我們的系統呼叫的結果了。
  • 1

這是系統呼叫號為549的程式,abi是common
這裡寫圖片描述
這是系統
呼叫號為550的程式,abi是64,出現兩個結果是受了上面這個程式的影響。
這裡寫圖片描述

成功