前言:這是作業系統學習Linux要求的必做實驗之一,希望通過這種課程報告可以讓大家了解Linux系統編譯新核心、增加系統調用的方法,另外,現在大多數人可能會選擇用ubuntu,是以對于一些用deepin版本的人編譯新核心可能會有一些坑,在我下面的課程報告中也有涉及到,希望有所幫助啦~
一、實驗目的
通過實驗,熟悉Linux作業系統的使用,掌握建構與啟動Linux核心的方法;掌握使用者程式如何利用系統調用與作業系統核心實作通信的方法,加深對系統調用機制的了解;進一步掌握如何向作業系統核心增加新的系統調用的方法,以擴充作業系統的功能。
二、實驗内容
1.Linux環境下的C或者C++編譯和調試工具的使用
2.向Linux核心增加新的系統調用,系統調用的功能為列印出自己的學号和姓名資訊。
3.Linux新核心的編譯、安裝和配置。
4.編寫應用程式以測試新的系統調用并輸出測試結果。
三、實驗步驟
第一步:Linux核心編譯
1.在Linux官方網站中下載下傳最新的核心4.16版本,下載下傳linux-4.16.tar.xz壓縮包。
2.在deepin系統下,切換到root使用者
#sudo -o
3.将下載下傳的壓縮檔案複制到/home目錄中,分兩步解壓該檔案
#xz-d linux-4.16.tar.xz
#tar-xvf linux-4.16.tar
4.清除殘留的.config和.o檔案【當編譯出錯需要重新編譯或不是第一次編譯時】
#make mrproper
5.配置核心
#make menuconfig
此時出現了錯誤如下:
解決方法:重新安裝bison,flex
#apt-get install bison
#apt-get install flex
重新執行#make menuconfig,選擇save并退出
6.編譯核心,生成啟動映像檔案【CPU是4G,則需要+2】
#make -j6 bzIamge
第一次編譯時會出現OpenSSL錯誤,隻需安裝OpenSSL并重新執行make指令。
#apt-get install libssl_dev
7.編譯子產品
#make modules
自己用了大約兩個多小時。
8.安裝核心
#make modules_install
#make install
9.配置grub引導程式并執行reboot重新開機系統,最後檢視核心最新版本
#update-grub2
#reboot
#uname -a
第二步:修改源程式,增加系統調用
1.配置設定系統調用号,修改系統調用表
檢視系統調用表(./arch/x86/entry/syscalls/syscall_64.tbl),選擇新添加的系統調用号為334号。
2.申明系統調用服務例程原型(./include/linux/syscalls.h),在末尾添加
3.實作系統調用服務,添加一個系統調用,實作對指定程序的 nice 值的修改或讀取功能, 并傳回程序最新的 nice 值及優先級 prio。按照第一步中的内容重新編譯核心
4.編寫使用者态程式測試新系統調用,建立一個空白文檔,并重新命名為test1.c,寫入以下函數。nice 值參數表示的是與執行指令的優先權等級,等級範圍為 -20 ~ 19。數值越小,等級越高。在測試程式中先後設定了 nice 值為 -5 和 -15 的情況,觀察目前程序排程塊的 nice 值和 prio 值的變化。
5.測試 用gcc指令編譯測試檔案
# gcc -o test test.c
#./test
#dmesg
(将資訊列印在日志檔案)
四、實驗體會
在實驗開始之前,首先要安裝Linux系統,在衡量了Ubuntu和deepin這兩種版本,在系統的美觀程度上選擇了deepin,但是這也在後期帶來了麻煩。由于書本上的教程和網絡上大部分的教程與針對Linux系統出現的問題的解決方案都是基于Ubuntu系統的,當我在做實驗一時遇到的問題,通常在網絡上找不到具體詳細的解答,這也為我帶來了一定的挑戰。
1.在Linux核心編譯時,執行到配置核心的步驟時,運作指令#make menuconfig後會一直出現【問題】,書本上并沒有這種問題出現,我也将這個問題在百度谷歌上搜尋了許久,由于使用deepin版本的資源還占少數,Ubuntu版本并沒有這個問題出現,許久之後還是沒有找到這個問題的解決方法。在囫囵吞棗閱讀了許多的文檔和其他錯誤的解決方案之後,我也仍然對這個問題一頭霧水,不知道該如何解決,無從下手。後來在一籌莫展之際,我跟自己說是不是我把問題想得太簡單了呢?既然它提示找不到bison,那我就自己安裝一個好了,但是如果安裝錯了會不會把系統弄壞了呢,在一番思想掙紮之後,我還是決定就按照自己的思路走吧,即使系統崩了就重裝好了。于是我按照安裝ncurses套件的方式執行了#apt-get install bison指令,在安裝完成之後又提示了關于flex的錯誤,于是按照同樣的道理我也重新安裝了flex,最終終于可以順利打開配置對話框。
2.在實驗一的過程中我一共安裝了三次核心,是以在核心子產品化這一部分浪費了許多時間。在要執行需要時間比較長的編譯時,應該選擇适合的時間段去進行。正如我第一次編譯核心時選擇了晚上九點多開始,在10點多才開始編譯子產品化。子產品化的過程需要大概兩個半小時,而宿舍11點就熄燈了,這個時候,需要擔心電腦是否能支撐子產品化結束,我可能也要等待到淩晨1.2點鐘。另外,第三次編譯核心是因為最開始時隻注意到了标題,和直接就按照書上的流程去執行,忽略了實驗要求的具體要求。它需要對指定的程序nice值得修改或讀取功能,并傳回程序最新的nice值和優先級prio。
3.在執行測試程式時運作# gcc -o test test.c提示找不到這個檔案。查閱了這個問題之後發現是可能gcc和g++不相容的問題。于是我重新安裝了gcc。
4.在編寫測試程式中也更要注意程式的編寫。在第一次執行測試程式時報錯。在檢查過後發現自己是在函數調用參數中多打了一個逗号,這也提醒了我在以後的程式設計要更加注意,需要細心仔細。
希望對你們有幫助嘻嘻~~~~~