作業系統是使用者與計算機之間的介面,使用者通過作業系統的幫助,可以快速、有效和安全可靠地使用計算機系統中的各種資源來解決自己的問題。為了使使用者方便的使用作業系統,os向使用者提供了「使用者與作業系統的介面」。這種介面支援使用者與作業系統之間進行互動,這些介面可以被分為命令和程式介面兩種。前者直接提供給使用者在鍵盤終端上使用;後者則是提供給使用者(主要是程式設計師)程式設計時使用。而要學習系統呼叫,首先要從程式介面入手。
1、 程式介面
程式介面是作業系統專門為使用者程式設定的,
也是使用者程式取得os服務的唯一途徑。
程式介面通常由系統呼叫組成。在每個作業系統中,通常都有幾十上百條系統呼叫,它們的作用各有不同,有的用於程序控制、有的用於儲存管理、有的用於檔案管理等等。在ms windows下面進行過win32程式設計的人員應該對windows提供的api函式有一定的印象,這些api函式就是windows作業系統提供給程式設計師的系統呼叫介面。而
linux作為乙個作業系統,當然有它自己的系統呼叫。
2、 系統呼叫
通常,在os的核心中都設定了一組用於實現各種系統功能的子程式,並將它們提供給程式設計師呼叫。程式設計師在需要os提供某種服務的時候,便可以呼叫一條系統呼叫命令,去實現希望的功能,這就是系統呼叫。各個不同的作業系統有各自的系統呼叫,正如前文所講的windows api,便是windows的系統呼叫,linux的系統呼叫與之不同的是linux由於核心**完全公開,所以可以細緻的分析出其系統呼叫的機制。
3、 系統呼叫和普通過程的區別
n 執行於不同的系統狀態
如前所述,使用者程式可以通過系統呼叫進入系統空間,而普通過程則只能在使用者空間當中執行。
n 通過軟中斷切換
由於使用者程式使用系統呼叫後要進入系統空間,所以需要呼叫乙個軟中斷;而普通過程在被呼叫時沒有這個過程。
4、 系統呼叫的型別
系統呼叫的作用與它所在的作業系統有密切關係,根據作業系統的性質不同,它們所提供的系統呼叫會有一定的差異,不過對於普通作業系統而言,應該具有下面幾類系統呼叫。
⑴程序控制型別。
⑵檔案操縱型別。
⑶程序通訊型別。
⑷資料管理型別。
5、 系統呼叫的實現機制。
由於作業系統的不同,其系統呼叫的實現方式可能不同,然而實現機制應該是大致相同的,一般包含下面幾個步驟:
n 設定系統呼叫號
在系統當中,往往設定多條系統呼叫命令,並賦予每條系統呼叫命令乙個唯一的系統呼叫號。
n 處理系統呼叫
作業系統當中有個一張系統呼叫入口表。表中的每個表目都對應一條系統呼叫命令,它包含有該系統呼叫自帶引數的數目、系統呼叫命令處理程式的入口位址等等。作業系統核心便是根據所輸入的系統呼叫號在該表中查詢到到相應的系統呼叫,進而轉入它的入口位址去執行它。
6、 增加自己的系統呼叫
tar jxvf
linux-2.6.18.i686.tar.bz2
cd linux-2.6.18.i686
1) 新增源**
第乙個任務是編寫加到核心中的源程式,也就是將要加到乙個核心檔案中去的乙個函式,該函式的名稱應該是新的系統呼叫名稱前面加上sys_標誌。假設新加的系統呼叫為foo(),在
linux-2.6.18.i686
/kernel/sys.c
檔案中新增源**,如下所示:
asmlinkage int sys_foo(int x)
//foo修改為自己要加的
2) 連線新的系統呼叫
新增新的系統呼叫之後,下乙個任務是讓linux核心的其餘部分知道該程式的存在。為了從已有的核心程式中增加到新函式的鏈結,需要進行下面的操作。
進入目錄
linux-2.6.18.i686
/include/asm-i386/,開啟檔案unistd.h。這個檔案包含了系統呼叫清單,用來給每個系統呼叫分配乙個唯一的號碼。系統呼叫號的定義格式如下:
#define __nr_name nnn
其中,name用系統呼叫名稱代替,而nnn是該系統呼叫對應的號碼。應該將新的系統呼叫名稱加到清單的最後,
並給它分配已經用到的系統呼叫號後面的乙個號碼
。比如:
#define __nr_foo 222
此處的系統呼叫號便是222。linux核心自身用到的系統呼叫號已經用到221了。而如果讀者還要自行增加系統呼叫,就必須從223開始。
在ifdef __kernel__前加上 define __kernel__
另外乙個需要進行的操作是進入目錄
linux-2.6.18.i686
/arch/i386/kernel/,開啟檔案
syscall_table.s
。該檔案中有類似下面的清單:
那麼就在該錶的最後加上:
.long
sys_foo
3) 重新編譯核心
為了使新的系統呼叫生效,需要重建linux的核心。必須以root身份登入。進入目錄
linux-2.6.18.i686
/,重建核心:
配置核心:
拷貝當前系統配置:
cp /boot/config-2.6.*** .config
新增配置:
make menuconfig
如果虛擬機器硬碟用的是scsi的,則選上如下選項:
device drivers->
scsi device support->
scsi low-level drivers->
buslogic scsi support
[*] omit flashpoint support
5. 編譯
make (編譯核心和模組)
6. make modules_install (安裝模組)
7. make install (安裝核心檔案)
在此之前看boot
/grub/grub.conf
區別,重啟選擇啟動核心。
8. 重新啟動,選擇「.....prep」核心來啟動
4) 編寫測試程式
參考mycall.c
來完成自己系統呼叫的測試。注意標頭檔案的包含路徑
執行的時候注意要切換到字元介面下
shift+ctrl+alt+f1 : 切換到字元介面
atl+f7
: 切換到圖形介面
編譯執行結果如下:
0給主人留下些什麼吧!~~
Linux GPIO系統內呼叫(適用於初學者)
本方法是linux系統中操作gpio的通用方法,初學者或硬體工程師可以通過該方法對晶元的gpio口進行簡單的控制。在linux核心中進入路徑 sys class gpio 在該路徑下有export和unexport 2個節點,其分別的作用為 export 建立gpio控制節點。unexport 刪除...
CSS關於初學者的問題
原文 前幾天有個人退群了。起因很簡單,他問了乙個問題,沒人回答,於是說要退群,後來我看到了,給了個鏈結,說這個問題已經說過好多遍了,於是他就退了。開啟qq的群列表,我所在的技術群有5個,不包括原來參加過又退了的。另外,還去幾個論壇裡看。看得多了,忽然覺得有幾句話想說給初學者。97年,我開始接觸網路,...
linux初學者 系統日誌(一)
系統日誌可以記錄系統的執行狀態,如果執行故障,會說明錯誤的位置。所以對系統日誌的了解和學習是非常有必要的。1 系統日誌的預設分類 系統日誌會預設記錄在以下位址中,不同的日誌在不同的檔案中。var log messages 系統服務及日誌,包括服務的資訊,報錯等等 var log secure 系統認...