1. 程式人生 > >向Linux 核心增加一個系統呼叫

向Linux 核心增加一個系統呼叫

實驗原理:

核心:核心是整個作業系統的最底層,它負責了整個硬體的驅動以及提供了各種系統所需的核心功能,包括防火牆機制,是否支援LVM或Quota檔案系統,以及程序和記憶體管理和通訊功能。其實核心就是系統上面的一個檔案而已,它包含了驅動主機各項硬體的檢測程式與驅動模組。核心檔案通常被放置在/boot/vmlinuz中。(uname –r  命令:顯示核心版本資訊)

核心模組:由於現在硬體更新速度太快,如果我的核心比較舊,我換了新的硬體,核心肯定無法支援,怎麼辦?重新拿一個新的核心來處理嗎?核心編譯的過程是很麻煩的。為了這個緣故,Linux很早之前就已經開始使用所謂的模組化設定了。即將一些不常用的類似驅動程式的內容獨立出核心,編譯成為模組,然後,核心可以在正常執行的過程當中載入這個模組到核心。這樣,在不需要改動核心的前提之下,只要編譯出適當的核心模組並載入它,Linux就可以使用新的硬體。模組被放置在/lib/modules/$(uname -r)/kernel中。

核心編譯:核心其實是一個檔案,由原始碼編譯而成的,開機讀完BIOS並載入MBR內的載入程式後,就開始載入核心到記憶體當中,所以要將它編譯成系統可以認識的資料才行。

實驗目的:

通過實驗,熟悉Linux 作業系統的使用,掌握構建與啟動Linux 核心的方法;掌握使用者程式如何利用系統呼叫與作業系統核心實現通訊的方法,加深對系統呼叫機制的理解;進一步掌握如何向作業系統核心增加新的系統呼叫的方法,以擴充套件作業系統的功能。

實驗過程:

一、首先下載linux-4.10.14.tar(一開始我用的是linux-2.6.33.3.tar經歷過七八個小時的各種改錯,各種版本不匹配,最後選擇換版本,這是一個讓人崩潰的過程)

二、然後,共享檔案到虛擬機器上。

三、解壓檔案tar -xvf linux-4.10.14.tar.xz

四、然後開始對增加的系統呼叫新增相關內容

# vim kernel/sys.c   ,加入下面的函式

asmlinkage int sys_helloworld(int number)  // 該函式名中有下劃線

{

    printk("hello,world\n");  //printk()函式是系統核心的輸出函式,區別 //於printf()。

    return number;

}   

五、新增系統呼叫號

vim ./arch/x86/entry/syscalls/syscall_64.tbl(32位系統是syscall_32.tbl)

將第223行改成如圖所示

六、修改系統呼叫表,註冊系統呼叫。

#vim include/linux/syscalls.h

增加一行  asm int sys_helloworld(int number);

七、

 第一步到第四步都是在/usr/src/linux-4.10.14目錄下執行。先跳轉到該目錄下。

第一步:make mrproper 清除核心中不穩定的目標檔案,附屬檔案及核心配置檔案

第二步:make clean 清除以前生成的目標檔案和其他檔案

第三步:make menuconfig  配置核心,採用預設的核心配置即可。(選擇exit)

這裡會報錯,原因是缺少東西,執行一下命令之後重新執行即可。

sudo apt-get install libncurses5-dev

第四步:sudo make  ( 該命令等價於make bzImage編譯核心 +make modules編譯核心模組)

這是一個漫長的過程,基本上很多人都是等了兩個半小時左右,因為我分配了1g記憶體,單核。跑了三個小時。

進入linux-4.10.14系統

以上設定成功,下一步就是進入核心系統。重啟電腦,過程中不斷按住shift。

出現一下介面

選擇ubuntu高階選項回車,進入如下介面

選中如圖所示版本,回車

進入系統

寫入以下程式碼:

編譯執行執行:

# gcc test.c –o test

# ./test

# dmesg –c