Linux核心編譯以及新增系統呼叫函式
實驗內容
(作者:Baron_w,禁止轉載)
⚫ 編譯 Linux 核心
⚫ Linux 啟動過程
⚫ Linux 系統呼叫實現分析
⚫ 增加一個系統呼叫**
相關知識
- 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 產生的資訊等。 ) - Linux cp 的使用
Linux cp 命令主要用於複製檔案或目錄。
-a:此選項通常在複製目錄時使用,它保留連結、檔案屬性,並複製目錄下的所有內容。
其作用等於 dpR 引數組合。
-d:複製時保留連結。這裡所說的連結相當於 Windows 系統中的快捷方式。
-f:覆蓋已經存在的目標檔案而不給出提示。
-i:與-f 選項相反,在覆蓋目標檔案之前給出提示,要求使用者確認是否覆蓋,回答"y"時目
標檔案將被覆蓋。
-p:除複製檔案的內容外,還把修改時間和訪問許可權也複製到新檔案中。
-r:若給出的原始檔是一個目錄檔案,此時將複製該目錄下所有的子目錄和檔案。
-l:不復制檔案,只是生成連結檔案。 - make mrproper
該命令確保原始碼目錄下沒有不正確的.o 檔案以及檔案的互相依賴。
Linux 核心編譯
**
-
首先在虛擬機器的終端內鍵入命令 apt-cache search linux-source 來查適用於自己
系統的核心版本,如下圖:
-
其次檢視自己的核心版本,防止下載相同版本的核心進行試驗,如下圖:
-
在確定版本後開啟 Linux 的核心官網進行核心的下載 www.kernel.org,進入後
選擇 HTTP 協議下的連結,之後依次選擇進入/linux/kernel/v4.x/內,然後查詢
相應的核心版本。在這裡我選擇的是 Linux-4.10.14 版本,複製器連結,然後在
Ubuntu16.04 終端內進入到 Downloads 目錄下(cd Downloads), 輸入命令 wget
本核心。
-
待核心下載完之後, 繼續在該目錄下進行操作,鍵入命令 cp linux-4.10.14.tar.gz
/usr/src/,將該核心壓縮包複製到 usr/src 目錄下。 -
使用命令 tar -zxvf linux-4.10.14.tar.gz 將壓縮包解壓。
-
之後進入 linux-4.10.14 資料夾(cd linux-4.10.14) 。在開始編譯之前,先將一
些必要的環境安裝好,防止出現錯誤而導致中途退出。 -
經蒐集總結之後,所需要的依賴包或庫有以下幾項:
⚫ 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
-
在配置完環境之後,鍵入命令 make menuconfig。 在 menuconfig 中出現選擇
的圖形化介面後,直接按右方向鍵選擇到 exit 退出,退出提示中選擇儲存,實
現核心的預設配置。
-
在開始編譯之前可以執行命令檢視自己電腦支援最大執行緒數目,命令為 lscpu。
-
接下來可以開始編譯了, 在/usr/src/linux-4.10.14 目錄下進行編譯,否則會報錯。
鍵入命令 make -j8 之後等待一段時間。
-
編譯完之後輸入以下兩個命令依次安裝核心模組和核心:
⚫ sudo make modules_install
⚫ sudo make install
-
完成之後利用 reboot 命令來重啟電腦。在開機時一直按住 shift 鍵進入高階啟
動模式。
-
進入系統後開啟終端輸入 uname -r 檢視核心版本是否為之前所編譯安裝的內
核。確認之後核心編譯到此結束。
新增系統呼叫
- 首先開啟檔案 syscall_64.tbl 新增自己的系統呼叫函式以及對應的系統呼叫編號。 輸
入命令 vim arch/x86/entry/syscalls/syscall_64.tbl 開啟該檔案可以看出 332 編號系統暫未
使用,因此在 331 下一行輸入自己的函式編號以及函式名字等資訊。
- 進入 syscall.h 宣告自己的函式。使用命令 vim include/linux/syscalls.h
開啟檔案,在檔案的末尾加入自己的函式宣告。
- 使用命令 gedit kernel/sys.c 開啟 sys.c 加入標頭檔案#include <linux/linkage.h>並在
末尾加入自己的函式。
- 接下來編譯並安裝核心,方法與之前的一樣。
⚫ sudo make menuconfig
⚫ make -j8
⚫ make modules_install
⚫ make install - 使用命令 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;
} - 編寫完之後進行編譯 gcc hello.c -o hello。 編譯完之後執行 hello 檔案./hello。
隨即再輸入 dmesg 來檢視 printk 所列印的東西。
到此新增的系統呼叫功能實現。