操作系統(tǒng)主要可以分為兩大部分:內(nèi)核和內(nèi)核之外的一些程序。內(nèi)核就是直接控制最底層的硬件,而我們?nèi)粘K玫降能浖?,大都是通過(guò)內(nèi)核之外一些程序與內(nèi)核之間的接口完成的,例如WINDOWS API就是為我們提供了應(yīng)用程序與內(nèi)核的接口,以實(shí)現(xiàn)硬件上的一些操作。操作系統(tǒng)(Operating System,簡(jiǎn)稱OS)是一管理電腦硬件與軟件資源的程序,同時(shí)也是計(jì)算機(jī)系統(tǒng)的內(nèi)核與基石。操作系統(tǒng)是一個(gè)龐大的管理控制程序,大致包括5個(gè)方面的管理功能:進(jìn)程與處理機(jī)管理、作業(yè)管理、存儲(chǔ)管理、設(shè)備管理、文件管理。目前微機(jī)上常見(jiàn)的操作系統(tǒng)有DOS、OS/2、UNIX、XENIX、Linux、Windows、Netware等。
應(yīng)用軟件是用戶可以使用的各種程序設(shè)計(jì)語(yǔ)言,以及用各種程序設(shè)計(jì)語(yǔ)言編制的應(yīng)用程序的集合,分為應(yīng)用軟件包和用戶程序.應(yīng)用軟件包是利用計(jì)算機(jī)解決某類問(wèn)題而設(shè)計(jì)的程序的集合,供多用戶使用。
內(nèi)核系統(tǒng)與應(yīng)用程序的關(guān)系
在linux系統(tǒng)中,內(nèi)核為用戶程序提供了兩方面的支持。其一是系統(tǒng)調(diào)用接口,即中斷調(diào)用int 0x80;另一方面是通過(guò)開(kāi)發(fā)環(huán)境庫(kù)函數(shù)或內(nèi)核庫(kù)函數(shù)與內(nèi)核進(jìn)行信息交流。不過(guò)內(nèi)核庫(kù)函數(shù)僅供內(nèi)核創(chuàng)建的任務(wù)0和任務(wù)1使用,它們最終還是去調(diào)用系統(tǒng)調(diào)用。因此內(nèi)核對(duì)所有用戶程序或進(jìn)程實(shí)際上只提供系統(tǒng)調(diào)用這一種統(tǒng)一的接口。lib/目錄下內(nèi)核庫(kù)函數(shù)代碼的實(shí)現(xiàn)方法與基本C函數(shù)庫(kù)libc中類似函數(shù)的實(shí)現(xiàn)方法基本相同,為了使用內(nèi)核資源,最終都是通過(guò)內(nèi)嵌匯編代碼調(diào)用了內(nèi)核系統(tǒng)調(diào)用功能。
系統(tǒng)調(diào)用主要提供給系統(tǒng)軟件編程或者用于庫(kù)函數(shù)的實(shí)現(xiàn)。而一般用戶開(kāi)發(fā)的程序則是通過(guò)調(diào)用像libc等庫(kù)函數(shù)來(lái)訪問(wèn)內(nèi)核資源。這些庫(kù)中的函數(shù)或資源通常被稱為應(yīng)用程序編程接口(API),其中定義了應(yīng)用程序使用的一組標(biāo)準(zhǔn)編程接口。通過(guò)調(diào)用這些庫(kù)中的程序,應(yīng)用程序代碼能夠完成各種常用工作,例如,打開(kāi)和關(guān)閉、對(duì)文件或設(shè)備的訪問(wèn)、進(jìn)行科學(xué)計(jì)算、出錯(cuò)處理以及訪問(wèn)組和用戶標(biāo)識(shí)號(hào)ID等系統(tǒng)信息。
在UNIX類操作系統(tǒng)中,最為普遍使用的是基于POSIX標(biāo)準(zhǔn)的API接口。Linux當(dāng)然也不例外。API與系統(tǒng)調(diào)用的區(qū)別在于:為了實(shí)現(xiàn)某一應(yīng)用程序接口標(biāo)準(zhǔn),例如POSIX,其中的API可以與一個(gè)系統(tǒng)調(diào)用對(duì)應(yīng),也可能由幾個(gè)系統(tǒng)調(diào)用的功能共同實(shí)現(xiàn)。當(dāng)然某些API函數(shù)可能根本就不需要使用系統(tǒng)調(diào)用,即不使用內(nèi)核功能。因此函數(shù)庫(kù)可以看做實(shí)現(xiàn)像POSIX標(biāo)準(zhǔn)的主體界面,應(yīng)用程序不用管它與系統(tǒng)調(diào)用之間到底存在什么關(guān)系。無(wú)論一個(gè)操作系統(tǒng)提供的系統(tǒng)調(diào)用有多么大的區(qū)別,但只要它遵循同一個(gè)API標(biāo)準(zhǔn),那么應(yīng)用程序就可以在這些操作系統(tǒng)之間具有可移植性。
系統(tǒng)調(diào)用是內(nèi)核與外界接口的最高層。在內(nèi)核中,每個(gè)系統(tǒng)調(diào)用都有一個(gè)序列號(hào)(在include/unistd.h頭文件中定義),并且常以宏的形式實(shí)現(xiàn)。應(yīng)用程序不應(yīng)該直接使用系統(tǒng)調(diào)用,因?yàn)檫@樣的話,程序的移植性就不好了。因此目前Linux標(biāo)準(zhǔn)庫(kù)(Linux Standard Base,LSB)和許多其他標(biāo)準(zhǔn)都不允許應(yīng)用程序直接訪問(wèn)系統(tǒng)調(diào)用宏。
庫(kù)函數(shù)一般包括C語(yǔ)言沒(méi)有提供的執(zhí)行高級(jí)功能的用戶級(jí)函數(shù),如輸入/輸出和字符串處理函數(shù)。某些庫(kù)函數(shù)只是系統(tǒng)調(diào)用的增強(qiáng)功能版。例如,標(biāo)準(zhǔn)I/O庫(kù)函數(shù)fopen和fclose提供了與系統(tǒng)調(diào)用open和close類似的功能,不過(guò)是在更高的層次上。在這種情況下,系統(tǒng)調(diào)用通常能提供比庫(kù)函數(shù)略微好一些的性能,但是庫(kù)函數(shù)卻能提供更多的功能,而且更具檢錯(cuò)能力。
實(shí)際上軟件程序還可以細(xì)分成兩種:系統(tǒng)程序軟件和應(yīng)用程序軟件。系統(tǒng)程序軟件實(shí)際上就是我們所說(shuō)的驅(qū)動(dòng)程序,它們的目的只有一個(gè),就是為了驅(qū)動(dòng)硬件,使之能正常地完成某種硬件功能,比如網(wǎng)卡的發(fā)送數(shù)據(jù)功能,聲卡的播放聲音功能。應(yīng)用程序軟件則用來(lái)接收用戶的輸入請(qǐng)求,進(jìn)行很多業(yè)務(wù)運(yùn)算后,再通過(guò)驅(qū)動(dòng)程序驅(qū)動(dòng)硬件去完成用戶所要求的任務(wù),有時(shí)候應(yīng)用程序軟件也負(fù)責(zé)把運(yùn)算的最終結(jié)果反饋給用戶。畫(huà)成圖就是圖一那樣,注意,在整個(gè)軟件系統(tǒng)中,也只有驅(qū)動(dòng)程序最清楚硬件的功能及工作方式,如果上面應(yīng)用程序想要硬件完成什么樣的任務(wù),必須使用相應(yīng)的驅(qū)動(dòng)程序所提供的那些接口才行。驅(qū)動(dòng)程序直接驅(qū)動(dòng)硬件進(jìn)行工作,而應(yīng)用程序則只需要知道這些接口,通過(guò)它們間接去驅(qū)動(dòng)硬件來(lái)完成任務(wù)。這種策略看似簡(jiǎn)單好用,但也會(huì)受到兩方面因素的制約。
圖一
首先,一個(gè)計(jì)算機(jī)系統(tǒng)里面的硬件設(shè)備通常不會(huì)只有一個(gè)。比方我的魅族MP3里除了音頻解碼器外,自然也有用來(lái)存儲(chǔ)歌曲的設(shè)備。這些設(shè)備各具不同的功能,完成這些功能的操作也就各不相同,就決定了寫(xiě)出來(lái)的驅(qū)動(dòng)程序也是各式各樣的,最后導(dǎo)致他們提供給應(yīng)用程序使用的接口也是千變?nèi)f化的,如圖二那樣,用不同顏色的箭頭表示不同的接口使用。這大大增加了應(yīng)用程序開(kāi)發(fā)的難度,因?yàn)閼?yīng)用程序開(kāi)發(fā)者不僅要考慮上層業(yè)務(wù)邏輯的處理,還要非常熟悉各種驅(qū)動(dòng)所提供出來(lái)的不同接口。
圖二: 一個(gè)應(yīng)用使用多個(gè)硬件設(shè)備
其次,一個(gè)計(jì)算機(jī)系統(tǒng)里面同時(shí)運(yùn)行著的應(yīng)用程序通常也不會(huì)只有一個(gè),這些應(yīng)用程序會(huì)競(jìng)爭(zhēng)使用總量特定的硬件設(shè)備資源。比方你和朋友在用qq聊天的同時(shí),也聽(tīng)著千千靜聽(tīng)放出來(lái)的音樂(lè),他們都要使用屏幕設(shè)備show出界面,也都要使用物理內(nèi)存(2)來(lái)運(yùn)行程序代碼。但是屏幕只有一個(gè),內(nèi)存也只有那么多,所以在整個(gè)計(jì)算機(jī)系統(tǒng)范圍內(nèi),必須有某種機(jī)制來(lái)管理分配這些特定硬件資源的使用。如圖三,設(shè)計(jì)的時(shí)候,這種機(jī)制要么放在應(yīng)用程序中實(shí)現(xiàn),要么放在驅(qū)動(dòng)程序中實(shí)現(xiàn),但無(wú)論放在哪一方,都是會(huì)給這一方的程序開(kāi)發(fā)者帶來(lái)額外的負(fù)擔(dān)。
圖二 一個(gè)應(yīng)用使用多個(gè)硬件設(shè)備
圖三: 多個(gè)應(yīng)用使用多個(gè)硬件設(shè)備
引入操作系統(tǒng)之后
上面之所以說(shuō)額外,那是因?yàn)閷?duì)于應(yīng)用程序開(kāi)發(fā)者來(lái)講,其重點(diǎn)要考慮的是業(yè)務(wù)邏輯如何實(shí)現(xiàn),而不是去考慮硬件資源的管理分配,也最好用不著去區(qū)分那么多驅(qū)動(dòng)程序的不同接口。類似的,對(duì)于驅(qū)動(dòng)程序開(kāi)發(fā)者來(lái)說(shuō),其要考慮的重點(diǎn)是如何正確的驅(qū)動(dòng)特定的硬件,而不是去考慮硬件資源的管理分配上。那這部分“額外”的工作由誰(shuí)去做呢,這正是后來(lái)出現(xiàn)的操作系統(tǒng)(3)的職責(zé)所在。
圖五: 引入操作系統(tǒng)后的情況
如圖五,操作系統(tǒng)幫我們考慮對(duì)各種硬件資源的分配管理,并完成對(duì)各種驅(qū)動(dòng)程序所提供接口的抽象,形成一套簡(jiǎn)單一致的接口給上層的應(yīng)用程序去使用。如此,應(yīng)用程序開(kāi)發(fā)人員只需要知道操作系統(tǒng)所提供的這套編程接口(API),就可以實(shí)現(xiàn)不同的業(yè)務(wù)應(yīng)用。前面我們講系統(tǒng)程序軟件實(shí)際上就是驅(qū)動(dòng)程序,但這里我們講系統(tǒng)程序軟件是操作系統(tǒng)。概念上,我們認(rèn)為操作系統(tǒng)依賴于驅(qū)動(dòng)程序這一層,但實(shí)際上,驅(qū)動(dòng)程序是嵌入到操作系統(tǒng)中去的,所以我們認(rèn)為驅(qū)動(dòng)程序是操作系統(tǒng)的一部分。這種鑲嵌大大增加了以往驅(qū)動(dòng)程序開(kāi)發(fā)者的工作難度,因?yàn)樗麄儾粌H要熟悉手頭的硬件工作原理,更重要的是要確保他們寫(xiě)的驅(qū)動(dòng)能正確的鑲嵌到操作系統(tǒng)里面去,這就要求他們同時(shí)也必須熟練掌握操作系統(tǒng)提供出來(lái)的,用來(lái)完成鑲嵌工作的各種接口。
聯(lián)系客服