1. 程式人生 > >與Linux新增系統呼叫鬥爭的血淚史

與Linux新增系統呼叫鬥爭的血淚史

《作業系統原理》開課沒多久,老師猝不及防佈置了一項任務,在Linux核心裡新增系統呼叫。在當時還不知道Linux是何方神聖的我怎麼也想象不到現在我已經成功完成任務並正在記錄著我屢戰屢敗,屢敗屢戰的小白鬥爭史。

知己知彼才能百戰百勝。要完成任務,必須先要知道這任務本質的要求。查閱資料得到,系統呼叫其實就是函式呼叫,只不過呼叫的是核心態的函式,但是我們知道,使用者態是不能隨意呼叫核心態的函式的,所以採用軟中斷的方式從使用者態陷入到核心態。

1、既然要呼叫核心函式,那必須得有這個東西才能使用對吧。那麼我們的第一步就是去下載一個Linux核心,開啟官網https://www.kernel.org/點選開啟連結,下載最新版本的核心。

下載完成後,注意這是儲存在Windows系統中,但是我們是要在Linux系統裡完成函式呼叫。俗話說一山不容二虎,Linux沒辦法直接執行Windows的檔案,所以我們需要開啟一個許可權之後他們才能共享資源。

點選編輯虛擬機器設定,開啟 總是啟用,並在下方新增你核心資料夾儲存的位置。

2、更新軟體原始碼

sudo apt-get update

3、共享資料夾之後 ,使用 cd /mnt/hgfs/<你的共享名>即將其移動到Linux系統中了。

4、將linux-4.16.11.tar.xz檔案移動到/usr/src/目錄下並進行解壓

sudo cd /usr/src

sudo tar -xvf linux-4.16.11.tar.xz

5、Ubuntu安裝Vim編輯器.

sudo apt-get install vim

6、用Vim開啟/kernel/sys.c檔案,加入linkage.h的標頭檔案,在檔案末尾加入要加入的系統呼叫函式.

sudo vim linux-4.16.11/kernel/sys.c



7、加入系統呼叫函式宣告。

sudo vim linux-4.16.11/arch/x86/include/asm/syscalls.h 

加入asmlinkage long sys_myprint(void);

8、在333行加入加入系統呼叫號。

sudo vim linux-4.16.11/arch/x86/entry/syscalls/sycall_64.tbl

9、下載編譯過程中的所需的軟體依賴包.

sudo apt-get install libncurses5-dev libssl-dev  

sudo apt-get install build-essential openssl 

sudo apt-get install zlibc minizip  

sudo apt-get install libidn11-dev libidn11

到現在我們的準備工作差不多做完了,是不是超級激動的期待奇蹟見證的編譯成功的時刻?來吧讓我們來編譯編譯。。。

10、編譯核心和安裝核心.

sudo make mrproper

sudo make clean

sudo make menuconfig


驚不驚喜!意不意外?error出現了。沒事沒事,畢竟也是四級過了的人,來我們看看哪裡的錯誤。 /bin/sh:1:bison:not found

沒有找到bison,上網搜了搜:

flex:詞法分析器,用來將一個.l檔案生成一個.c程式檔案。即生成一個詞法分析器。然後讀取輸入,和正則表示式匹配,再執行相應的動作,實現了程式的功能。

bison:語法分析器,根據文法把一系列的記號轉換成一個語法分析樹。

把兩者聯合使用可以實現對sql語言的解析。

接下來我們就來安裝這個檔案

 sudo apt-get install flex

 sudo apt-get install bison

畢竟每個人的系統、配置都不一樣,如果沒有這些錯誤也沒有必要安裝了

安裝完成,重新編譯核心

激動!看到了期待已久的介面,到這時候已經成功了三分之一了,核心編譯和安裝已經完成。

11、接下來是最重要的一步,也是時間最長的一步。根據自己處理器的最大執行緒來編譯

sudo make -j4


第一次嘗試,失敗。原因是缺少Libelf-dev,libelf-devel

使用命令sudo apt-get install libelf-dev 安裝,然後重新編譯


功夫不負有心人。編譯成功,親身體會到了老母親的激動與驕傲!!

12、 sudo make install 將程式安裝至系統中

13、重新啟動虛擬機器


點選第二個選項進入


點選第一個選項啟動虛擬機器

14、在HOME中新建一個test.c文件,通過vim編輯

gcc -o test test.c 測試程式碼

./test

在這個過程中我的心情就像是查高考成績時一樣緊張又期待著搓手手,已經做好了如果結果錯誤那就從頭再來一次的準備。好在輸出了正確的結果,這突如其來的幸福讓我長舒了一口氣。

這份Linux入手任務終於在各種卡殼和千奇百怪的bug中坎坷完成了。通過這次的實踐任務,我受益匪淺,通過自己的查閱以及和同學的請教與討論弄懂了很多之前一竅不通的問題,將bug一個一個成功修復;在心智上我也明白了一個道理:很多時候並不是不會,而是潛意識認為自己做不到,只要逼著自己去做,將一個看似不可能完成的艱鉅任務分割成一個個小問題,就能發掘出自己的潛力。俗話說萬事開頭難,但是我覺得這次任務是開頭難、過程難、結尾難,但是有挑戰才有進步,有進步才會成長,希望以後有更多的實踐任務能讓我們慢慢靠近程式設計師的目標。