1. 程式人生 > >作業系統作業:給linux系統增加一個系統呼叫

作業系統作業:給linux系統增加一個系統呼叫

前不久開了一門《作業系統》,老師上課留下了一個作業——Linux系統新增一個系統呼叫。剛開始只能用一臉懵逼來形容,只能硬著頭皮做下去。由於剛的新電腦,所以就沒敢裝雙系統。所以我選擇了虛擬機器,虛擬機器剛開始配置的過程不算特別複雜,網上也有很多教程,於是我看著虛擬機器也是一臉懵逼,不知道從何下手,百度得知快捷鍵Ctr+Alt+T或者右鍵+終端可以開啟終端,於是我試了一下,哇好眼熟,這不就是Windows系統裡面那個黑框框嗎(命令列);好像也是可以下手的,於是就這樣一邊百度一邊做著,錯了一次改下,改不動了推倒重新來過。終於最終解決了這個問題!    下面部分主要分三個部分:一、系統呼叫的概念;二、實現系統呼叫的過程;三、實現過程遇到的問題;四、感受(
ps:本人第一次寫部落格,可能前後內容不太連貫)
------------------------------------------------------------------------------------------------------------------------------------------------------

一、系統呼叫的概念

        Linux核心中設定了一組用於實現各種系統功能的子程式,稱為系統呼叫。使用者可以通過系統呼叫命令在自己的應用程式中呼叫它們。從某種角度來看,系統呼叫和普通的函式呼叫非常相似。區別僅僅在令在自己的應用程式中呼叫它們。從某種角度來看,系統呼叫和普通的函式呼叫非常相似。區別僅僅在於,系統呼叫由作業系統核心提供,運行於核心態;而普通的函式呼叫由函式庫或使用者自己提供,運行於使用者態。二者在使用方式上也有相似之處。
Linux系統的核心部分即是Linux核心,是一系列裝置的驅動程式。系統呼叫是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 workstation32位的,但我同學用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 (我的電腦是44執行緒),執行緒越多編譯越快!

編譯過程真的超級超級漫長。。。

注意: 這個時候,終端的視窗最好最大化,否則可能會報錯。

第十步:安裝核心

編譯後安裝核心到系統中.

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(有時候看見一個問題有人解決了但是沒看懂,沒辦法聯絡博主就很難受!)