1. 程式人生 > >Linux核心編譯以及新增系統呼叫函式

Linux核心編譯以及新增系統呼叫函式

實驗內容

(作者:Baron_w,禁止轉載)
⚫ 編譯 Linux 核心
⚫ Linux 啟動過程
⚫ Linux 系統呼叫實現分析
⚫ 增加一個系統呼叫**

相關知識

  1. dmesg 的用法
    ⚫ 列出載入到核心中的所有驅動
    我們可以使用如‘more’。 ‘tail’ , ‘less ’或者‘grep’文書處理工具來處理‘dmesg’
    命令的輸出。由於 dmesg 日誌的輸出不適合在一頁中完全顯示,因此我們使用管道(pipe)
    將其輸出送到 more 或者 less 命令單頁顯示。
    dmesg | more
    dmesg | less
    ⚫ 列出所有被檢測到的硬體
    要顯示所有被核心檢測到的硬碟裝置,你可以使用‘grep’命令搜尋‘sda’關鍵詞,如
    下:
    dmesg | grep sda
    ⚫ 只輸出 dmesg 命令的日誌
    在‘dmesg’命令後跟隨‘head’命令來顯示開始幾行,‘dmesg | head -20′命令將顯示
    開始的前 20 行。
    dmesg(在 dmesg 裡我們可以檢視到開機資訊, printk 產生的資訊等。 )
  2. Linux cp 的使用
    Linux cp 命令主要用於複製檔案或目錄。
    -a:此選項通常在複製目錄時使用,它保留連結、檔案屬性,並複製目錄下的所有內容。
    其作用等於 dpR 引數組合。
    -d:複製時保留連結。這裡所說的連結相當於 Windows 系統中的快捷方式。
    -f:覆蓋已經存在的目標檔案而不給出提示。
    -i:與-f 選項相反,在覆蓋目標檔案之前給出提示,要求使用者確認是否覆蓋,回答"y"時目
    標檔案將被覆蓋。
    -p:除複製檔案的內容外,還把修改時間和訪問許可權也複製到新檔案中。
    -r:若給出的原始檔是一個目錄檔案,此時將複製該目錄下所有的子目錄和檔案。
    -l:不復制檔案,只是生成連結檔案。
  3. make mrproper
    該命令確保原始碼目錄下沒有不正確的.o 檔案以及檔案的互相依賴。

Linux 核心編譯

**

  1. 首先在虛擬機器的終端內鍵入命令 apt-cache search linux-source 來查適用於自己
    系統的核心版本,如下圖:
    在這裡插入圖片描述

  2. 其次檢視自己的核心版本,防止下載相同版本的核心進行試驗,如下圖:
    在這裡插入圖片描述

  3. 在確定版本後開啟 Linux 的核心官網進行核心的下載 www.kernel.org,進入後
    選擇 HTTP 協議下的連結,之後依次選擇進入/linux/kernel/v4.x/內,然後查詢
    相應的核心版本。在這裡我選擇的是 Linux-4.10.14 版本,複製器連結,然後在
    Ubuntu16.04 終端內進入到 Downloads 目錄下(cd Downloads), 輸入命令 wget

    https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/linux-4.10.14.tar.gz 4.10.14 版
    本核心。
    在這裡插入圖片描述

  4. 待核心下載完之後, 繼續在該目錄下進行操作,鍵入命令 cp linux-4.10.14.tar.gz
    /usr/src/,將該核心壓縮包複製到 usr/src 目錄下。

  5. 使用命令 tar -zxvf linux-4.10.14.tar.gz 將壓縮包解壓。

  6. 之後進入 linux-4.10.14 資料夾(cd linux-4.10.14) 。在開始編譯之前,先將一
    些必要的環境安裝好,防止出現錯誤而導致中途退出。

  7. 經蒐集總結之後,所需要的依賴包或庫有以下幾項:
    ⚫ libncurses5-dev :主要是在 make menuconfig 時能夠出現圖形化的選擇選單
    所依賴的的庫
    ⚫ libssl-dev : openssl 的依賴包
    ⚫ build-essential:建立 debian 軟體包的工具
    ⚫ openssl :涉及到系統安全的編譯過程中的相關程式的依賴庫
    ⚫ zlibc :允許執行中的檔案能夠實現解壓縮資料檔案的一個工具
    ⚫ minizip :是一個輕量級的支援庫,能夠支援壓縮、提取、檢視和操作 ZIP
    檔案。該軟體包包括 minizip 和 miniunzip 工具
    ⚫ libidn11-dev : 涉及到系統幫助等文件以及軟體庫等資訊的一個軟體包
    ⚫ libidn11 : ubuntu 自帶
    安裝時,只需要在終端鍵入以下四條命令:
    a) sudo apt-get install libncurses5-dev libssl-dev
    b) sudo apt-get install build-essential openssl
    c) sudo apt-get install zlibc minizip
    d) sudo apt-get install libidn11-dev libidn11
    在這裡插入圖片描述

  8. 在配置完環境之後,鍵入命令 make menuconfig。 在 menuconfig 中出現選擇
    的圖形化介面後,直接按右方向鍵選擇到 exit 退出,退出提示中選擇儲存,實
    現核心的預設配置。
    在這裡插入圖片描述
    在這裡插入圖片描述

  9. 在開始編譯之前可以執行命令檢視自己電腦支援最大執行緒數目,命令為 lscpu。
    在這裡插入圖片描述

  10. 接下來可以開始編譯了, 在/usr/src/linux-4.10.14 目錄下進行編譯,否則會報錯。
    鍵入命令 make -j8 之後等待一段時間。
    在這裡插入圖片描述

  11. 編譯完之後輸入以下兩個命令依次安裝核心模組和核心:
    ⚫ sudo make modules_install
    ⚫ sudo make install
    在這裡插入圖片描述

  12. 完成之後利用 reboot 命令來重啟電腦。在開機時一直按住 shift 鍵進入高階啟
    動模式。
    在這裡插入圖片描述
    在這裡插入圖片描述

  13. 進入系統後開啟終端輸入 uname -r 檢視核心版本是否為之前所編譯安裝的內
    核。確認之後核心編譯到此結束。
    在這裡插入圖片描述

新增系統呼叫

  1. 首先開啟檔案 syscall_64.tbl 新增自己的系統呼叫函式以及對應的系統呼叫編號。 輸
    入命令 vim arch/x86/entry/syscalls/syscall_64.tbl 開啟該檔案可以看出 332 編號系統暫未
    使用,因此在 331 下一行輸入自己的函式編號以及函式名字等資訊。
    在這裡插入圖片描述
  2. 進入 syscall.h 宣告自己的函式。使用命令 vim include/linux/syscalls.h
    開啟檔案,在檔案的末尾加入自己的函式宣告。
    在這裡插入圖片描述
  3. 使用命令 gedit kernel/sys.c 開啟 sys.c 加入標頭檔案#include <linux/linkage.h>並在
    末尾加入自己的函式。
    在這裡插入圖片描述
  4. 接下來編譯並安裝核心,方法與之前的一樣。
    ⚫ sudo make menuconfig
    ⚫ make -j8
    ⚫ make modules_install
    ⚫ make install
  5. 使用命令 reboot 重啟系統,進入編譯的核心。使用命令 uname -r 檢視核心版本。
    編寫 C 語言程式 hello.c 呼叫系統函式進行測試核心
    #include<stdio.h>
    int main()
    {
    for(int i=0;i<5;i++)
    {
    printf(“ret=%d”,syscall(332,i));
    }
    return 0;
    }
  6. 編寫完之後進行編譯 gcc hello.c -o hello。 編譯完之後執行 hello 檔案./hello。
    隨即再輸入 dmesg 來檢視 printk 所列印的東西。
    在這裡插入圖片描述
    到此新增的系統呼叫功能實現。