作業系統作業:給linux系統增加一個系統呼叫
一、系統呼叫的概念
Linux核心中設定了一組用於實現各種系統功能的子程式,稱為系統呼叫。使用者可以通過系統呼叫命令在自己的應用程式中呼叫它們。從某種角度來看,系統呼叫和普通的函式呼叫非常相似。區別僅僅在令在自己的應用程式中呼叫它們。從某種角度來看,系統呼叫和普通的函式呼叫非常相似。區別僅僅在於,系統呼叫由作業系統核心提供,運行於核心態;而普通的函式呼叫由函式庫或使用者自己提供,運行於使用者態。二者在使用方式上也有相似之處。二、實現系統呼叫的過程
第一步:獲取root許可權(即管理員許可權)
在終端輸入下列指令:
sudo su
注意:獲取root許可權需要使用者輸入密碼(登陸密碼),密碼是看不見的,使用者只需正確的輸入密碼即可,回車鍵結束
示意圖如下:
第二步:準備工作
1、安裝相關編譯程式
sudo apt-getinstallbuild-essentialkernel-package libncurses5-dev
2、獲取核心
(1)從外面將linux-4.16.10.tar拖入到了虛擬機器桌面(我用的核心是linux-4.16.10)
核心的話新版本也是可以的,官網下載或者從別人哪兒拷,指令的話只需要對應的把版本號改一下
(2)下一步就是將該壓縮檔案移入到/usr/src/資料夾中
sudo mv /peter/home/桌面/linux-4.16.10.tar/usr/src/
注:由於我之前都將這些東西配置好了,所以是這個顯示,一個細節,可以通過方向鍵的上下快速切換歷史命令
第三步、進入/usr/src解壓檔案
cd /usr/src
sudo tar -xvf /usr/src/linux-4.16.10.tar.bz2
解壓過程如下圖所示,如果要確定自己的核心版本,可以在終端輸入命令uname -r。解壓過程稍長,注意:解壓語句可能因為檔案地址稍有不同,建議去計算機裡面去拷貝路徑!
第四步:進入解壓出的檔案目錄
cd /usr/src/linux-4.16.10/kernel
第五步:安裝vim
sudo apt-get install vim
第六步:開啟sys.c加入函式
vim sys.c
注意:在vim中, i進入編輯, esc退出編輯狀態. G跳到末尾, gg進入開頭。 :wq儲存退出, :q不儲存退出)在末尾加入函式
asmlinkage long sys_helloworld(void){
printk( "helloworld!");
return 1;
}
第七步、新增宣告
cd /usr/src/linux-4.16.10/arch/x86/include/asm/
vim syscalls.h
(插入asmlinkage long sys_helloworld(void);)
第八步:加一個系統呼叫的id
cd/usr/src/linux-4.16.10/arch/x86/entry/syscalls
vim syscall_64.tbl
a、進入/usr/src/linux-4.16.10/arch/x86/syscalls目錄
b、開啟檔案syscall_64.tbl(該檔案有一個系統呼叫列表,最前面的屬性是id)
c、在裡面新增自己的系統呼叫號(333 64 helloworld sys_helloworld)
d、使用esc +:wq命令儲存退出
注意:我在工作管理員發現我的VMware workstation是32位的,但我同學用64位成功了!所以我用的是vim syscall_64.tbl,之前試了vim syscall_32.tbl沒能成功。所以要以虛擬機器為主!!!
第九步:配置核心
cd /usr/src/linux-4.16.10
編譯核心和安裝核心.
依次輸入這四條語句
sudo makemrproper
sudo make clean
sudo makemenuconfig (並且在make
nfig時,將那個General setup內的localversion修改成新的名稱,比如我這裡的myKernel)
根據自己處理器的最大執行緒數目來編譯.
sudo make -j4 (我的電腦是4核4執行緒),執行緒越多編譯越快!
編譯過程真的超級超級漫長。。。
注意: 這個時候,終端的視窗最好最大化,否則可能會報錯。
第十步:安裝核心
編譯後安裝核心到系統中.
sudo makemodules_install
sudomake install // 安裝核心
這個地方也需要一定的時間,反正編譯三個多小時,不差這一會哈哈哈
第十一步:重啟虛擬機器
將之前的工作儲存後直接重啟,重啟後點擊滑鼠進入ubuntu並且迅速按住shift,長按!我的虛擬機器直接登陸上了,我同學的好像都有一個選擇核心過程,有選擇的話,只需要選擇新核就OK了!
第十二步:驗證系統呼叫是否成功
a、登陸虛擬機器
b、開啟終端
c、輸入下列指令:
(1)gcc hello.c
輸入下列程式碼:
(2)./a.out
輸出,見證成果的時候到了!!!
返回值為1!!!!!
系統呼叫成功了!!!!
終於弄完了,明天籃球場走起哈哈
三、感受
作為一個linux小白實現上述過程是很痛苦的,但是真的很想去把這件事做好,一步一步,從什麼都不知道到好像懂了一點點,再到可以看懂每行程式碼的含義,到最後做出成果,剛開始做的時候比較浮躁,到了後面就冷靜了。看了20多篇部落格,解決各種問題;之前做的時候犯的錯誤多的數不勝數,後面弄的時候一點點規避和解決,功夫不負有心人,雖然為了這個作業花了我整整一週的精力(本人理解能力較差,周圍有的大佬花了幾天就弄完了),這次的成功相信可以給我後面進一步學好作業系統的信心,也培養了自己的耐心和攻堅精神。相信自己會繼續加油的!
給讀者:排版方面,第一次用CSDN親自寫部落格(之前都是看各路大牛的部落格),格式沒有弄得特別人性化,比如程式碼沒能用特定的程式碼行來進行排版,但感覺應該不影響閱讀,下次會繼續改進的,希望下次還可以有東西可以寫哈哈哈。如果有關於此篇部落格的疑問,歡迎來撩!聯絡方式:QQ 2729707823 備註CSDN(有時候看見一個問題有人解決了但是沒看懂,沒辦法聯絡博主就很難受!)