使用者接口
作業系統向使用者提供了兩類接口:使用者接口和程式接口。
使用者接口是為了友善使用者使用計算機資源所建立的使用者和計算機之間的聯系。也就是說使用者并沒有直接使用計算機資源的權限,而作業系統有這個權限,作業系統可以向使用者提供指令、系統調用、圖形等形式的接口,完成使用者送出的各類任務。
程式接口由一組系統調用指令組成,這是作業系統提供給程式設計人員的接口。使用者通過在程式中使用系統調用指令來請求作業系統提供服務。每一個系統調用都是一個能完成特定功能的子程式。
Shell指令語言
在linux或Unix系統中,一般把簡單指令分為兩類:
- 系統提供的标準指令,包括調用各種語言處理程式、實用程式等,系統管理者可以增添新的系統标準指令。
- 使用者自定義的指令。
根據指令是否包含在shell内部,即是否常駐記憶體,而分為内部指令和外部指令兩類:
- 内部指令:少數标準指令,例如改變工作目錄指令cd等,是包含在shell内部,作為内部指令常駐記憶體。
- 外部指令:大多數指令,如拷貝指令cp,移動指令rm等,均儲存于外存上,即每個指令是存于檔案系統中某個目錄下的單獨程式。此舉好處在于,可以很大程度節省記憶體空間。
簡單指令根據功能不同,分為五類:
- 進入與退出系統:使用者進入與退出過程是系統直接調用Login及Logout程式完成的。
- 檔案操作指令:顯示檔案内容cat,複制檔案副本cp,已有檔案改名mv,撤銷檔案rm,确定檔案類型file。
- 目錄操作指令:建立目錄mkdir,撤銷目錄rmdir,改變工作目錄cd。
- 系統通路指令:通路目前日期和時間date,詢問系統目前使用者who,顯示目前目錄路徑名pwd。
重定向與管道指令:
重定向符号“<”和“>”分别表示輸入轉向與輸出轉向。
例:cat file1 > file2 表示把檔案file1的内容列印輸出到檔案file2上。
wc < file3 表示把檔案file3中讀出的行中的字和字元進行技術。
管道指令符“|”用來連接配接兩條指令,使其前一條指令的輸出作為後一條指令的輸入。
例: cat file | wc 将使指令cat把檔案file中的資料作為wc指令的計數輸入。
通信指令:
- 信箱通信指令mail -(r/q/p)
- 對話通信指令write user[ttyname]
- 允許或拒絕接收消息指令mesg [-n][-y],選項n表示拒絕對方的寫許可,即拒絕接受消息;選項y訓示恢複對方的寫許可。
系統調用的概念和類型
系統态和使用者态
在實際運作過程中,處理機會在系統态和使用者态間切換。相應地,現代多數OS将CPU的指令集分為特權指令和非特權指令兩類。
(1)特權指令。特權指令是指在系統态運作的指令,它對内部空間的通路範圍基本不受限制,不僅能通路使用者空間,也能通路系統空間。
(2)非特權指令。非特權指令是運作在使用者态的指令。應用程式所使用的都是非特權指令,它隻能完成一般性的操作和任務,不能對系統中的硬體和軟體直接進行通路,對記憶體的通路範圍也局限于使用者空間。
系統調用
系統調用本質上是應用程式請求OS核心完成某功能時的一種過程調用,它與一般的過程調用的幾個差别:
- 運作在不同的系統狀态。一般的過程調用其調用程式和被調用程式運作在相同的狀态——系統态或使用者态,而系統調用最大的差别是:調用程式是運作在使用者态,而被調用程式是運作在系統态。
- 狀态的轉換。由于系統調用的調用和被調用過程是工作在不同的系統狀态,因而不允許由調用過程直接轉向被調用過程,需要通過軟中斷機制,先由使用者态轉換為系統态,經核心分析後,才能轉向相應的系統調用處理程式。
- 傳回問題。在采用了搶占式(剝奪)排程方式的系統中,在被調用過程執行完成後,要對系統中所有要求運作的程序做優先權分析。當調用程序仍具有最高優先級時,才傳回到調用進行繼續執行;否則,将引起重新調用,以便優先權最高的程序優先執行。
- 嵌套調用。像一般過程一樣,系統調用也可以嵌套進行,即在一個被調用過程的執行期間,還可以利用系統調用指令去調用另一個系統調用。
中斷機制: 系統調用是通過中斷機制實作的,并且一個作業系統的所有系統調用,都通過同一個中斷入口來實作。
系統調用的類型
對于一般通用的OS而言,系統調用分為三大類:
-
程序控制類系統調用
主要用于對程序控制的系統調用有:
(1)建立和終止程序的系統調用。
(2)獲得和設定程序屬性的系統調用。程序的屬性包括有程序辨別符,程序優先級,最大允許執行時間等。
(3)等待某事件出現的系統調用。
-
檔案操縱類系統調用
(1)建立和删除檔案
(2)打開和關閉檔案的系統調用
(3)讀和寫檔案的系統調用
-
程序通信類系統調用
在單機處理系統中,OS經常采用消息傳遞方式和共享存儲區方式。
當采用消息傳遞方式時,通信前需先打開一個連接配接。為此,應由源程序發出一條打開連接配接的系統調用,而目标程序則應利用接受連接配接的系統調用表示同意進行通信;然後,在源和目标程序之間便開始通信。可以利用發送消息的系統調用或者用接收消息的系統調用來交換資訊。通信結束後,還須再利用關閉連接配接的系統調用結束通信。
使用者在利用共享存儲區進行通信之前,須先利用建立共享存儲區的系統調用來建立一個共享存儲區,再利用建立連接配接的系統調用将該共享存儲區連接配接到程序自身的虛位址空間上,然後便可以利用讀和寫共享存儲區的系統調用實作互相通信。
UNIX系統調用
程序控制:
- 建立程序 fork 是 UNIX 中産生程序的唯一途徑。 fork 生成調用程序的一個副本,新生成的程序稱為子程序,建立它的程序稱為父程序, fork 調用完成後,子程序立即執行,在最初階段将和父程序共享 CPU 。子程序還得到父程序的部分程序資訊的副本,包括環境,打開的檔案,真實和有效使用者辨別,掩碼,目前工作目錄和信号。
- 終止程序exit。一個程序可以利用exit實作自我終止。通常在父程序建立紫禁城是,在子程序的末尾安排一條exit系統調用,如此操作可以使子程序在完成規定的任務後,便可進行自我終止。
- 執行一個檔案exec。exec可使調用者程序的程序映像(包括使用者程式和資料等)被一個可執行的檔案覆寫,即改變調用者程序的程序映像。
- 等待子程序結束wait。wait用于将調用者程序自身挂起,直至它的某一子程序終止為止。父程序可以利用wait使自身的執行與子程序的終止同步。
- 獲得程序ID。getp-id獲得調用程序的辨別符,getpgrp獲得調用程序組ID,getppid獲得調用程序的父程序ID。
- 獲得使用者ID。getuid用于獲得真正的使用者ID,geteuid用于獲得有效使用者的ID,getgid用于獲得真正使用者組ID等。
- 程序暫停pause。将調用程序挂起,直到它收到一個信号為止。
檔案操縱:
- 建立檔案creat。
- 打開檔案open。
- 關閉檔案close。
- 檔案的讀和寫,read和write。
- 連接配接link。
- 去連接配接unlink。
程序通信和資訊保護: Unix中提供了一個用于程序間通信的軟體包IPC,它由消息機制、共享存儲器機制和信号量機制三部分組成。
系統調用的實作
linux系統在CPU的環境保護模式下提供了四個特權級别,目前核心都隻用到了其中的兩個特權級别,分别是“特權級0”(核心态)與“特權級3”(使用者态)。使用者對系統調用不能任意攔截和修改,以保證核心的安全性。
系統調用是linux核心為使用者态程式提供的主要功能接口。通過系統調用,使用者态程序能夠臨時切換到核心态,使用核心态才能通路的硬體和資源完成特定功能。系統調用由linux核心和核心子產品實作,核心在處理系統調用時還會檢查系統調用請求和參數是否正确,保證對特權資源和硬體通路的正确性。通過這種方式,linux在提供核心和硬體資源通路接口的同時,保證了核心和硬體資源的使用正确性和安全性。
每個系統調用由兩部分組成:
- 核心函數:是實作系統調用功能的核心代碼,作為作業系統的核心駐留在記憶體中,是一種共享代碼,運作在核心态,資料也存放在核心空間,通常它不能再使用系統調用,也不能使用應用程式可用的庫函數。
- 接口函數:是提供給應用程式的API,以庫函數形式存在linux的lib.a中,該庫中存放了所有系統調用的接口函數的目标代碼,用彙編語言書寫。主要功能是:把系統調用号、入口參數位址傳送給相應的核心函數,并使使用者态下運作的應用程式陷入核心态。
系統調用控制程式的工作流程為:
- 取系統調用号,檢驗合法性。
- 執行int 80h産生中斷。
- 進行位址空間的轉換,以及堆棧的切換,進入核心态。
- 進行中斷處理,根據系統調用号定位核心函數位址。
- 根據通用寄存器内容,從使用者棧中取入口參數。
- 核心函數執行,吧結果傳回應用程式。