手把手教你給linux系統增加一個系統呼叫

一、系統呼叫的概念

  • Linux核心中設定了一組用於實現各種系統功能的子程式,稱為系統呼叫。使用者可以通過系統呼叫命令在自己的應用程式中呼叫它們。從某種角度來看,系統呼叫和普通的函式呼叫非常相似。區別僅僅在令在自己的應用程式中呼叫它們。從某種角度來看,系統呼叫和普通的函式呼叫非常相似。區別僅僅在於,系統呼叫由作業系統核心提供,執行於核心態;而普通的函式呼叫由函式庫或使用者自己提供,執行於使用者態。二者在使用方式上也有相似之處。Linux系統的核心部分即是Linux核心,是一系列裝置的驅動程式。系統呼叫是Linux核心提供的功能十分強大的一系列的函式。這些函式是在核心中實現的,它們是應用程式和核心互動的介面,系統呼叫在Linux系統中發揮著巨大的作用,如果沒有系統呼叫,那麼應用程式就失去了核心的支援。

二、系統呼叫的實現

第一步:獲取root許可權(即管理員許可權)

在終端輸入下列指令: sudo su 注意:獲取root許可權需要使用者輸入密碼(登陸密碼),密碼是看不見的,使用者只需正確的輸入密碼即可,回車鍵結束

  • 示意圖如下:

第二步:準備工作

1、安裝相關編譯程式

sudo apt-getinstallbuild-essentialkernel-package libncurses5-dev

2、獲取核心

(1)從外面將linux-4.16.10.tar拖入到了虛擬機器桌面(我用的核心是linux-4.16.10)

核心的話新版本也是可以的,官網下載或者從別人哪兒拷,指令的話只需要對應的把版本號改一下

(2)下一步就是將該壓縮檔案移入到/usr/src/資料夾中

注意:在.tar後面有一個空格,檔名建議複製不建議手敲。可以直接把我的語句複製過去然後方向鍵移到需要修改的地方進行修改

sudo mv /peter/home/桌面/linux-4.16.10.tar/usr/src/

  • 注:由於我之前都將這些東西配置好了,所以是這個顯示,一個細節,可以通過方向鍵的上下快速切換歷史命令

更多linux核心視訊教程文件資料免費領取後臺私信【核心】自行獲取.

Linux核心原始碼/記憶體調優/檔案系統/程序管理/裝置驅動/網路協議棧-學習視訊教程-騰訊課堂

第三步、進入/usr/src解壓檔案

cd /usr/src sudo tar -xvf
       /usr/src/linux-4.16.10.tar.bz2 解壓過程如下圖所示,如果要確定自己的核心版本,可以在終端輸入命令uname -r。解壓過程稍長,注意:解壓語句可能因為檔案地址稍有不同,建議去計算機裡面去拷貝路徑!

第四步:進入解壓出的檔案目錄

cd /usr/src/linux-4.16.10/kernel

第五步:安裝vim

sudo apt-get install vim

第六步:開啟sys.c加入函式

vim sys.c 注意:在vim中, i進入編輯, esc退出編輯狀態. G跳到末尾, gg進入開頭。 :wq儲存退出, :q不儲存退出)

  • 在末尾加入函式

asmlinkage long sys_helloworld(void){     printk( "helloworld!");      return 1; }

第七步、新增宣告

cd
       /usr/src/linux-4.16.10/arch/x86/include/asm/ vim syscalls.h (插入asmlinkage long sys_helloworld(void);)

第八步:加一個系統呼叫的id

cd/usr/src/linux-4.16.10/arch/x86/entry/syscalls vim syscall_64.tbl a、進入
       /usr/src/linux-4.16.10/arch/x86/syscalls目錄 b、開啟檔案syscall_64.tbl(該檔案有一個系統呼叫列表,最前面的屬性是id) c、在裡面新增自己的系統呼叫號(333 64 helloworld sys_helloworld) d、使用esc :wq命令儲存退出

  • 注意:我在工作管理員發現我的VMware workstation是32位的,但我同學用64位成功了!所以我用的是vim syscall_64.tbl,之前試了vim syscall_32.tbl沒能成功。所以要以虛擬機器為主!!!

第九步:配置核心

cd /usr/src/linux-4.16.10 編譯核心和安裝核心. 依次輸入這四條語句 sudo make mrproper sudo make clean sudo make menuconfig (並且在make nfig時,將那個General setup內的localversion修改成新的名稱,比如我這裡的myKernel) sudo make menuconfig出現的問題:

scripts/Makefile.lib:194: recipe for target 'scripts/kconfig/lexer.lex.c' failed make[1]:   *** [scripts/kconfig/lexer.lex.c] Error 127 Makefile:552: recipe for target 'menuconfig' failed make:    *** [menuconfig] Error 2

解決辦法:

sudo apt-get install bison

sudo apt-get install flex

  • 安裝這兩個包完成後再sudo make menuconfig

根據自己處理器的最大執行緒數目來編譯. sudo make -j4 (我的電腦是4核4執行緒),執行緒越多編譯越快!

此處可能報錯:

make[1]: *** [scripts/sign-file] Error 1  Makefile:1065: recipe for target 'scripts' failed make:  *** [scripts] Error 2

解決辦法:

第一反應耐心看報錯資訊,缺什麼包補什麼包sudo apt-get install XXXX 下面這個語句可以解決較多的問題。

sudo apt-get install libssl-dev

  • 編譯過程真的超級超級漫長。。。
  • 注意: 這個時候,終端的視窗最好最大化,否則可能會報錯。

第十步:安裝核心

編譯後安裝核心到系統中. sudo makemodules_install sudomake install // 安裝核心

這個地方也需要一定的時間,反正編譯三個多小時,不差這一會哈哈哈

第十一步:重啟虛擬機器

  • 將之前的工作儲存後直接重啟,重啟後點選滑鼠進入ubuntu並且迅速按住shift,長按!我的虛擬機器直接登陸上了,我同學的好像都有一個選擇核心過程,有選擇的話,只需要選擇新核就OK了!

第十二步:驗證系統呼叫是否成功

a、登陸虛擬機器 b、開啟終端 c、輸入下列指令: (1)gcc hello.c

  • 輸入下列程式碼:

(2)./a.out

  • 輸出,見證成果的時候到了!!!

返回值為1!!!!!

系統呼叫成功了!!!!