歡迎轉(zhuǎn)載本文,轉(zhuǎn)載地址:
http://www./articles/basic-concept/app-os-driver-hw.html
軟件和硬件
我們通常所說的計(jì)算機(jī)系統(tǒng)(1)實(shí)際上可以被分成兩個(gè)部分:硬件和軟件。硬件就是構(gòu)成計(jì)算機(jī)的所有設(shè)備,比如顯示器,鍵盤,鼠標(biāo),主機(jī)里面的各種器件等等。作為計(jì)算機(jī)存在的物理基礎(chǔ),這部分通常是看得見,摸得著的;軟件通常也叫程序,一般用來告訴這些硬件做什么以及如何做,比如你電腦里運(yùn)行著的qq,我的魅族MP3播放器里面的操作控制程序等等都是軟件。這些軟件都要依賴特定的硬件才能完成正確的任務(wù),比如你要用qq把一段話發(fā)給遠(yuǎn)端的朋友,那qq在收到你的話之后,就需要使用網(wǎng)卡發(fā)出去,MP3播放器控制軟件也是一樣。這里我們畫出最簡(jiǎn)單的計(jì)算機(jī)組成圖就是圖一那樣,我們把軟件置上,硬件置下,并用一個(gè)箭頭連接他們,用來表示它們之間的依賴。
將軟件細(xì)分為兩種
實(shí)際上軟件程序還可以細(xì)分成兩種:系統(tǒng)程序軟件和應(yīng)用程序軟件。系統(tǒng)程序軟件實(shí)際上就是我們所說的驅(qū)動(dòng)程序,它們的目的只有一個(gè),就是為了驅(qū)動(dòng)硬件,使之能正常地完成某種硬件功能,比如網(wǎng)卡的發(fā)送數(shù)據(jù)功能,聲卡的播放聲音功能。應(yīng)用程序軟件則用來接收用戶的輸入請(qǐng)求,進(jìn)行很多業(yè)務(wù)運(yùn)算后,再通過驅(qū)動(dòng)程序驅(qū)動(dòng)硬件去完成用戶所要求的任務(wù),有時(shí)候應(yīng)用程序軟件也負(fù)責(zé)把運(yùn)算的最終結(jié)果反饋給用戶。畫成圖就是圖二那樣,注意,在整個(gè)軟件系統(tǒng)中,也只有驅(qū)動(dòng)程序最清楚硬件的功能及工作方式,如果上面應(yīng)用程序想要硬件完成什么樣的任務(wù),必須使用相應(yīng)的驅(qū)動(dòng)程序所提供的那些接口才行。驅(qū)動(dòng)程序直接驅(qū)動(dòng)硬件進(jìn)行工作,而應(yīng)用程序則只需要知道這些接口,通過它們間接去驅(qū)動(dòng)硬件來完成任務(wù)。這種策略看似簡(jiǎn)單好用,但也會(huì)受到兩方面因素的制約。
首先,一個(gè)計(jì)算機(jī)系統(tǒng)里面的硬件設(shè)備通常不會(huì)只有一個(gè)。比方我的魅族MP3里除了音頻解碼器外,自然也有用來存儲(chǔ)歌曲的設(shè)備。這些設(shè)備各具不同的功能,完成這些功能的操作也就各不相同,就決定了寫出來的驅(qū)動(dòng)程序也是各式各樣的,最后導(dǎo)致他們提供給應(yīng)用程序使用的接口也是千變?nèi)f化的,如圖三那樣,用不同顏色的箭頭表示不同的接口使用。這大大增加了應(yīng)用程序開發(fā)的難度,因?yàn)閼?yīng)用程序開發(fā)者不僅要考慮上層業(yè)務(wù)邏輯的處理,還要非常熟悉各種驅(qū)動(dòng)所提供出來的不同接口。
圖三: 一個(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í),也聽著千千靜聽放出來的音樂,他們都要使用屏幕設(shè)備show出界面,也都要使用物理內(nèi)存(2)來運(yùn)行程序代碼。但是屏幕只有一個(gè),內(nèi)存也只有那么多,所以在整個(gè)計(jì)算機(jī)系統(tǒng)范圍內(nèi),必須有某種機(jī)制來管理分配這些特定硬件資源的使用。如圖四,設(shè)計(jì)的時(shí)候,這種機(jī)制要么放在應(yīng)用程序中實(shí)現(xiàn),要么放在驅(qū)動(dòng)程序中實(shí)現(xiàn),但無論放在哪一方,都是會(huì)給這一方的程序開發(fā)者帶來額外的負(fù)擔(dān)。
圖四: 多個(gè)應(yīng)用使用多個(gè)硬件設(shè)備
引入操作系統(tǒng)之后
上面之所以說額外,那是因?yàn)閷?duì)于應(yīng)用程序開發(fā)者來講,其重點(diǎn)要考慮的是業(yè)務(wù)邏輯如何實(shí)現(xiàn),而不是去考慮硬件資源的管理分配,也最好用不著去區(qū)分那么多驅(qū)動(dòng)程序的不同接口。類似的,對(duì)于驅(qū)動(dòng)程序開發(fā)者來說,其要考慮的重點(diǎn)是如何正確的驅(qū)動(dòng)特定的硬件,而不是去考慮硬件資源的管理分配上。那這部分“額外”的工作由誰去做呢,這正是后來出現(xiàn)的操作系統(tǒng)(3)的職責(zé)所在。
如圖五,操作系統(tǒng)幫我們考慮對(duì)各種硬件資源的分配管理,并完成對(duì)各種驅(qū)動(dòng)程序所提供接口的抽象,形成一套簡(jiǎn)單一致的接口給上層的應(yīng)用程序去使用。如此,應(yīng)用程序開發(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)程序開發(fā)者的工作難度,因?yàn)樗麄儾粌H要熟悉手頭的硬件工作原理,更重要的是要確保他們寫的驅(qū)動(dòng)能正確的鑲嵌到操作系統(tǒng)里面去,這就要求他們同時(shí)也必須熟練掌握操作系統(tǒng)提供出來的,用來完成鑲嵌工作的各種接口。
注意:
1這里所講的計(jì)算機(jī)系統(tǒng)是個(gè)廣義的概念,包括你現(xiàn)在在使用的PC機(jī),以及我經(jīng)常聽的魅族X3型MP3播放器。前者是通用計(jì)算機(jī)系統(tǒng),后者是嵌入式計(jì)算機(jī)系統(tǒng)。
2很多人曾經(jīng)為自己買過金士頓內(nèi)存條就是物理內(nèi)存,通常都不算大,介于256M和1G之間。注意和虛擬內(nèi)存的區(qū)別,在32位系統(tǒng)中,操作系統(tǒng)為每一個(gè)運(yùn)行著的應(yīng)用程序都分配一個(gè)獨(dú)立的,4G大小的虛擬內(nèi)存。
3這里所說的操作系統(tǒng)說的是像Linux,Windows那樣的操作系統(tǒng),并不包括uCOSII那樣的操作系統(tǒng),因?yàn)閡COSII作為一個(gè)簡(jiǎn)單的實(shí)時(shí)操作系統(tǒng)只支持多任務(wù)(同一時(shí)刻運(yùn)行多個(gè)應(yīng)用程序),并沒有像Linux和Windows那樣提供設(shè)備驅(qū)動(dòng)框架。在uCOSII里面,需要把驅(qū)動(dòng)程序設(shè)計(jì)成一個(gè)個(gè)特殊的應(yīng)用程序。