日韩欧美自拍在线观看-欧美精品在线看片一区二区-高清性视频一区二区播放-欧美日韩女优制服另类-国产精品久久久久久av蜜臀-成人在线黄色av网站-肥臀熟妇一区二区三区-亚洲视频在线播放老色-在线成人激情自拍视频

Linux 2.6內(nèi)核的研究

出處:互聯(lián)網(wǎng)    發(fā)布于:2011-09-04 11:16:27

 Linux 的 initrd 技術(shù)是一個(gè)非常普遍使用的機(jī)制,linux2.6 內(nèi)核的 initrd 的文件格式由原來(lái)的文件系統(tǒng)鏡像文件轉(zhuǎn)變成了 cpio 格式,變化不僅反映在文件格式上, linux 內(nèi)核對(duì)這兩種格式的 initrd 的處理有著截然的不同。本文首先介紹了什么是 initrd 技術(shù),然后分別介紹了 Linux2.4 內(nèi)核和 2.6 內(nèi)核的 initrd 的處理流程。通過(guò)對(duì) Linux2.6 內(nèi)核的 initrd 處理部分代碼的分析,使讀者可以對(duì) initrd 技術(shù)有一個(gè)全面的認(rèn)識(shí)。為了更好的閱讀本文,要求讀者對(duì) Linux 的 VFS 以及 initrd 有一個(gè)初步的了解。

  Linux 操作系統(tǒng)是UNIX 操作系統(tǒng)的一種克隆系統(tǒng)。它誕生于1991 年的10 月5 日(這是次正式向外公布的時(shí)間)。以后借助于Internet 網(wǎng)絡(luò),并經(jīng)過(guò)全世界各地計(jì)算機(jī)愛(ài)好者的共同努力下,現(xiàn)已成為今天世界上使用多的一種UNIX 類操作系統(tǒng),并且使用人數(shù)還在迅猛增長(zhǎng)。   Linux 操作系統(tǒng)的誕生、發(fā)展和成長(zhǎng)過(guò)程始終依賴著以下五個(gè)重要支柱:UNIX 操作系統(tǒng)、MINIX 操作系統(tǒng)、GNU 計(jì)劃、POSIX 標(biāo)準(zhǔn)和Internet 網(wǎng)絡(luò)。   下面主要根據(jù)這五個(gè)基本線索來(lái)追尋一下Linux 的開(kāi)發(fā)歷程,它的醞釀過(guò)程,初的發(fā)展經(jīng)歷。首先分別介紹其中的四個(gè)基本要素(UNIX、MINIX、GNU 和POSIX,Internet 的重要性顯而易見(jiàn),所以不用對(duì)其羅嗦),然后根據(jù)Linux 的創(chuàng)始人Linus Toravlds 從對(duì)計(jì)算機(jī)感興趣而自學(xué)計(jì)算機(jī)知識(shí),到心里開(kāi)始醞釀編制一個(gè)自己的操作系統(tǒng),到初Linux 內(nèi)核0.01 版公布,以及從此如何艱難地一步一個(gè)腳印地在全世界hacker 的幫助下推出比較完善的1.0 版本這段時(shí)間的發(fā)展經(jīng)過(guò),也即對(duì)Linux 的早期發(fā)展歷史進(jìn)行詳細(xì)介紹。

  Linux內(nèi)核2.6版的開(kāi)發(fā)已經(jīng)接近尾聲,2.6測(cè)試版發(fā)布已經(jīng)二個(gè)月了,正式版預(yù)計(jì)明年年初發(fā)布。作為一個(gè)主要發(fā)布版本,2.6相對(duì)于2.4有很大的改動(dòng);它引入了許多新的特性,同樣也去除很多過(guò)時(shí)的特性。它在哪些方面有大的改動(dòng)?它對(duì)Linux的開(kāi)發(fā)人員以及其他層面的Linux用戶可能有什么樣的影響?閱讀本文,您將得到答案。

  Linux 2.6內(nèi)核的特性

  使用了心的調(diào)度算法,稱為哦0/I算法在高負(fù)載的情況的執(zhí)行非常出色,并且在有很多處理器時(shí)可以很好夫人擴(kuò)展,而2.4內(nèi)核用的是時(shí)間片重算法,嚴(yán)重影響效率。

  采用搶占式內(nèi)核,使互式操作,多媒體應(yīng)用程序的響應(yīng)速度大大提高。

  改進(jìn)的虛擬內(nèi)存

  修改了I/O 子系統(tǒng)部分,保證在各種工作負(fù)荷下I/O 都有很好的響應(yīng)速度。

  大量改進(jìn)文件系統(tǒng),比如支持Windows的邏輯卷管理器,重寫(xiě)對(duì)NTFS文件系統(tǒng)的支持,改進(jìn)HPFS等。、

  改進(jìn)和部分重寫(xiě)了Moduies功能,使之更穩(wěn)定。

  盡管我們次啟動(dòng)Linux 2.4似乎只是昨天的事,時(shí)間已經(jīng)流走,內(nèi)核開(kāi)發(fā)團(tuán)隊(duì)的2.6版內(nèi)核開(kāi)發(fā)工作已經(jīng)接近完成了。本文將試圖描述2.6內(nèi)核中的許多新特性(側(cè)重i386平臺(tái)的Linux)。和封閉源碼的軟件的預(yù)發(fā)布不一樣的是,這里所描述的所有特性當(dāng)前都是2.5版內(nèi)核開(kāi)發(fā)樹(shù)中可用的(其中一些的bug少一些,另一些bug多一些)。(按照Linux的傳統(tǒng),偶數(shù)版本的內(nèi)核是穩(wěn)定的,奇數(shù)版本的只是開(kāi)發(fā)用的)。然而內(nèi)核當(dāng)前處于特性凍結(jié)(feature-freeze)時(shí)期,終的發(fā)行版本應(yīng)該不大可能過(guò)于偏離這里的描述。同時(shí)也應(yīng)該清楚這里描述的一些"新"特性在次出現(xiàn)在2.6系列內(nèi)核后,可能被向后移植到了的或者發(fā)行版供應(yīng)商的2.4版內(nèi)核之中。

  多種平臺(tái)支持

  也能夠支持相當(dāng)廣泛的硬件和平臺(tái),是采用Linux作為內(nèi)核的操作系統(tǒng)(比如 GNU操作系統(tǒng), 系統(tǒng)和環(huán)境常常是和Linux一塊分發(fā)。Linux一般不被認(rèn)為是獨(dú)立的操作系統(tǒng),只是操作系統(tǒng)的內(nèi)核。)的優(yōu)勢(shì)之一。Linux自1.2版就開(kāi)始包含對(duì)新的處理器類型和特性的支持,的Linux 2.6內(nèi)核發(fā)布版本也不例外。這種趨勢(shì)不會(huì)直接影響到Linux在Intel平臺(tái)下的使用,同時(shí)使得Linux能在盡可能大的范圍內(nèi)被使用,這一點(diǎn)非常重要。

  Linux 2.6 擴(kuò)展多平臺(tái)支持的一個(gè)主要途徑就是把uClinux的大部并入了主流內(nèi)核。uCLinux(可以發(fā)音為"you-see-Linux",但更正確的拼寫(xiě),首字母應(yīng)該式希臘字母"mu")是將Linux應(yīng)用在微控制器平臺(tái)的項(xiàng)目。很多年來(lái),這個(gè)Linux分支為許多嵌入式芯片提供了支持,把它更多的集成到主流內(nèi)核中是一件非常有意義的事。

  在對(duì)嵌入式處理器支持上,Linux 2.6有四個(gè)主要的新進(jìn)步。首先是對(duì)Motorola的新型嵌入式m68k系列處理器移植。這些被命名為Dragonball或是ColdFire的處理器可以在Motorola,Lineo,Arcturus或是其他廠商生產(chǎn)的系統(tǒng)或是評(píng)估板上找到。大多數(shù)Linux用戶應(yīng)該對(duì)這些處理器相當(dāng)熟悉,因?yàn)閺腜alm 1000到的Palm III,他們一直是Palm Pilots的心臟。不幸的是,對(duì)早期沒(méi)有MMU的m68k處理器(比如早期蘋(píng)果機(jī)上使用的68000系列)還沒(méi)有支持。支持的嵌入式平臺(tái)還包括日立(Hitachi)的H8/300系列(不包含H8S,但可能會(huì)盡快地集成進(jìn)來(lái))以及NEC v850處理器。

  無(wú)論怎么強(qiáng)調(diào)Linux 2.6旨在支持無(wú)MMU系統(tǒng)的主要體系結(jié)構(gòu)變化,都不為過(guò)分。所有Linux的前期版本,不論直接或是間接,都起源于Linus初在Intel 80386上的工作,局限性是固有的。沿著這個(gè)方向?qū)?lái)也許會(huì)有更多的其他早期的硬件被支持(事實(shí)上,已經(jīng)有關(guān)于此目的的項(xiàng)目啟動(dòng))。但是,不像為現(xiàn)代的以及仍在生產(chǎn)中的嵌入式處理器的提供支持,對(duì)早期的硬件的支持被更多地認(rèn)為是基于某種愛(ài)好,并且對(duì)于終用戶而言很可能是無(wú)用的。

  的Linux版本包含了對(duì)Axis通信公司的ETAX CRIS("Code Reduced Instruction Set")處理器的支持(更確切地說(shuō),支持ETRAX 100LX及更新的產(chǎn)品),它從技術(shù)的角度而言不是uCLinux合并的一部分。實(shí)際上對(duì)這款處理器的支持在2.4開(kāi)發(fā)周期就已經(jīng)有了,但它在2.4.0以后才被引入,所以現(xiàn)在應(yīng)該提到它。它是主要用于網(wǎng)絡(luò)設(shè)備的嵌入式處理器。與此相關(guān)的ETRAX 100,是得到uClinux支持的無(wú)MMU處理器,但是在主流的Linux內(nèi)核中相關(guān)支持卻沒(méi)有集成進(jìn)來(lái)。

  Opteron支持 - 消費(fèi)級(jí)的64位Linux 另一個(gè)在2.4.x開(kāi)發(fā)環(huán)節(jié)就已經(jīng)并入但這里仍然值得提及的是對(duì)AMD Opteron芯片(基于AMD64體系結(jié)構(gòu))的支持。Opteron向后與Intel-clone的處理器兼容,并且,甚至可能得到微軟的支持。是它還是Intel的Itanium家族的某一成員成為64位消費(fèi)級(jí)產(chǎn)品的事實(shí)標(biāo)準(zhǔn)現(xiàn)在還很難下定論。

  盡管2.4系列內(nèi)核的后期版本已經(jīng)可以在該芯片上運(yùn)行,但作為產(chǎn)品應(yīng)用仍受到了很大限制。對(duì)高端用戶來(lái)說(shuō),嚴(yán)重的問(wèn)題是,每個(gè)應(yīng)用程序的RAM的使用都被限制在512MB以內(nèi)。另一方面,新內(nèi)核對(duì)在該平臺(tái)上運(yùn)行x86(32位)的程序的支持得到了改進(jìn)。

  系統(tǒng)子體系結(jié)構(gòu)(Subarchitecture)支持 Linux 2.6除了對(duì)許多新的處理器體系結(jié)構(gòu)外,還包含了一個(gè)稱為子體系結(jié)構(gòu)(Subarchitecture)的新概念。以前,Linux通常假設(shè)處理器和其他硬件是配套的。也就是說(shuō),i386系列處理器只會(huì)在PC/AT服務(wù)器上使用。這條針對(duì)i386的假設(shè)在Linux 2.4中就被打破,因?yàn)閕386的額外支持使其可以在SGI的視頻工作站(Visual Workstation)中使用。(事實(shí)上,在其他非i386體系結(jié)構(gòu)上,這個(gè)假設(shè)早被打破了。比如,m68k很早就支持Amiga,Michintosh等平臺(tái)。)Linux 2.6對(duì)于此的變化就是,讓這個(gè)特性以及概念成為標(biāo)準(zhǔn),以便所有的體系結(jié)構(gòu)都可以用相似而健全的方法來(lái)處理,以便更清晰地劃分模塊。

  標(biāo)準(zhǔn)的確立使得i386可以運(yùn)用于兩個(gè)新的平臺(tái)。個(gè)是NCR的Voyager體系。這是一個(gè)對(duì)稱多處理器(SMP)系統(tǒng)(在Intel的MP規(guī)范標(biāo)準(zhǔn)確定之前就已經(jīng)開(kāi)發(fā)出來(lái)了),它支持多達(dá)32個(gè)486-686的處理器配置。實(shí)際采取這種體系結(jié)構(gòu)的產(chǎn)品處理器的配置數(shù)目要相對(duì)少一些,而且目前并不是所有的型號(hào)都得到了Linux的支持(早的就不支持)。第二種得到支持的體系結(jié)構(gòu)是更為廣泛使用的由NEC開(kāi)發(fā)的PC-9800平臺(tái),它曾是日本市場(chǎng)占統(tǒng)治地位的PC平臺(tái),一直到近幾年。初的PC-9800裝載的是8086處理器,終發(fā)展到奔騰級(jí)處理器和SMP支持。(當(dāng)然,Linux對(duì)它的支持局限在386以上。)盡管在美國(guó)它完全不為人所知,微軟的Windows 95之前的版本曾移植到這個(gè)平臺(tái)上。該平臺(tái)由于生產(chǎn)商對(duì)標(biāo)準(zhǔn)PC的偏愛(ài),生產(chǎn)已經(jīng)中止。

  Linux對(duì)差異細(xì)微的硬件類型支持的形式化,使得操作系統(tǒng)能更容易的移植到其他平臺(tái)上,比如移植到專為存儲(chǔ)設(shè)計(jì)的硬件或者是使用在工業(yè)領(lǐng)域的主流處理器。需要澄清的是,子體系結(jié)構(gòu)也不是任何時(shí)候都管用的,它能夠發(fā)揮作用是因?yàn)檫@些可移植的系統(tǒng)非常底層構(gòu)件有或多或少的不同。比起在X-box上運(yùn)行Linux的差別來(lái)說(shuō),驅(qū)動(dòng)程序等相對(duì)小的差別還不足以把它們從傳統(tǒng)的i386系統(tǒng)中分開(kāi)。Linux對(duì)X-box的支持,就不是子體系結(jié)構(gòu)的問(wèn)題。

  大規(guī)模 - 非一致存儲(chǔ)訪問(wèn)體系結(jié)構(gòu)(NUMA)和大型機(jī)除了以上所提及的新硬件類型的支持之外,新的Linux內(nèi)核發(fā)行版也包含了對(duì)大型服務(wù)器(一些運(yùn)行i386處理器,也有些運(yùn)行其他處理器)更多的支持。對(duì)Linux來(lái)說(shuō),這樣的特性是新近加入的,還有許多優(yōu)化工作需要完成。這是一個(gè)Linux發(fā)展相當(dāng)迅速的領(lǐng)域,我們能夠預(yù)計(jì)在不久的將來(lái),Linux將成為此領(lǐng)域的有力競(jìng)爭(zhēng)者。

  在此方面的改變就是Linux對(duì)NUMA服務(wù)器的支持。NUMA(非一致存儲(chǔ)訪問(wèn))在多進(jìn)程世界里是超越SMP以及提升多處理器系統(tǒng)效率的一個(gè)進(jìn)步。SMP系統(tǒng)的設(shè)計(jì)上有著許多和對(duì)應(yīng)單處理器系統(tǒng)類似的局限性。其中的設(shè)計(jì)局限之一就是系統(tǒng)中只有的一塊內(nèi)存區(qū),所有的處理器對(duì)它都平等地對(duì)它進(jìn)行訪問(wèn)。在多處理器系統(tǒng)里,這樣會(huì)在同一條內(nèi)存總線上的多處理器之間引起相當(dāng)高的競(jìng)爭(zhēng),導(dǎo)致性能瓶頸。NUMA服務(wù)器,通過(guò)引入了以下的理念解決了這個(gè)問(wèn)題:對(duì)于某個(gè)特定的處理器,一些內(nèi)存比其他一些的更為接近(close)。可以這樣簡(jiǎn)單地設(shè)想(同時(shí)技術(shù)上也不會(huì)有嚴(yán)重錯(cuò)誤),你的系統(tǒng)有許多包含了處理器、內(nèi)存以及其他元件(比如I/O擴(kuò)展卡)。系統(tǒng)中有很多這樣的卡,它們可以相互通訊;顯而易見(jiàn),相對(duì)其他卡上的內(nèi)存,每塊卡上的處理器能更快的訪問(wèn)本地內(nèi)存(自己的卡上內(nèi)存)。從許多角度上看,NUMA體系結(jié)構(gòu)就是一個(gè)緊密耦合的集群特例。

  為了給NUMA主機(jī)提供良好的支持,Linux十分必要在許多方面進(jìn)行調(diào)整,以使新模型更具效率。首先,建立了一個(gè)內(nèi)部拓?fù)銩PI,以使內(nèi)核知道處理器和內(nèi)存以及其他IO設(shè)備間的相互關(guān)系。有了內(nèi)部拓?fù)銩PI的支持,Linux的進(jìn)程調(diào)度器可以理解這些關(guān)系,并且會(huì)嘗試優(yōu)化任務(wù)以達(dá)到的本地資源使用。此外,許多NUMA主機(jī)在各個(gè)節(jié)點(diǎn)(nodes)的線性內(nèi)存區(qū)域之間存在空洞(holes)。新內(nèi)核已經(jīng)能夠合理的處理這種不連續(xù)情況。內(nèi)核還有許多其他使得Linux可以支持高端(high-end)主機(jī)的變化,這也是內(nèi)核發(fā)展的一個(gè)明確方向。再過(guò)一年,我們可以期待Linux在高端機(jī)型上效率以及其他方面的進(jìn)步。

  本文以64位PCI總線接口芯片PCI9656的設(shè)備驅(qū)動(dòng)程序?yàn)榛A(chǔ),比較了Linux2.6內(nèi)核與2.4內(nèi)核的區(qū)別,設(shè)計(jì)與開(kāi)發(fā)了在Linux 2.6內(nèi)核下PCI9656設(shè)備驅(qū)動(dòng)程序,進(jìn)而研究了2.6內(nèi)核的內(nèi)存和中斷管理機(jī)制。

  關(guān)鍵字:Linux2.6;設(shè)備驅(qū)動(dòng)程序;PCI9656 1 引言 Linux操作系統(tǒng)因?yàn)槠涓咝А踩⒖蓜?dòng)態(tài)加載及源代碼開(kāi)放等特點(diǎn),深受設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)人員的喜愛(ài)。系統(tǒng)內(nèi)核大部分獨(dú)立于底層硬件運(yùn)行,用戶無(wú)需關(guān)心硬件問(wèn)題,而用戶操作是通過(guò)一組標(biāo)準(zhǔn)化的調(diào)用來(lái)完成。設(shè)備驅(qū)動(dòng)程序的任務(wù)是將這些調(diào)用映射到作用于實(shí)際硬件設(shè)備的特定操作上,該編程接口能夠使得驅(qū)動(dòng)程序獨(dú)立于內(nèi)核的其他部分來(lái)搭建,在需要時(shí)才動(dòng)態(tài)加載到內(nèi)核。這種模塊化的特點(diǎn),使得Linux設(shè)備驅(qū)動(dòng)程序的編寫(xiě)過(guò)程變得清晰簡(jiǎn)單。 目前,為滿足日益龐大的數(shù)據(jù)處理需要,基于64位PCI總線接口設(shè)備的研究開(kāi)發(fā)顯得尤為重要。因而本文將基于PLX公司推出的PCI總線接口芯片PCI9656,設(shè)計(jì)開(kāi)發(fā)在Linux2.6內(nèi)核下的設(shè)備驅(qū)動(dòng)程序,進(jìn)而對(duì)2.6內(nèi)核的內(nèi)存和中斷管理機(jī)制進(jìn)行分析研究。 2 Linux2.6與2.4內(nèi)核的比較 2.1  系統(tǒng)穩(wěn)定性 為了徹底防止對(duì)正在被使用的內(nèi)核模塊進(jìn)行錯(cuò)誤操作,2.6內(nèi)核在加載和導(dǎo)出內(nèi)核模塊方面都較2.4內(nèi)核進(jìn)行了改進(jìn),避免了用戶執(zhí)行將導(dǎo)致系統(tǒng)崩潰的操作,例如強(qiáng)制刪除模塊等。同時(shí),當(dāng)驅(qū)動(dòng)程序需要在多個(gè)文件中包含<linux/module.h>頭文件時(shí),不必定義宏__NO_VERSION__來(lái)檢查內(nèi)核的版本。 2.2  統(tǒng)一設(shè)備模型 統(tǒng)一設(shè)備模型的創(chuàng)建是2.6內(nèi)核重要的變化之一。它促進(jìn)了模塊接口的標(biāo)準(zhǔn)化,其目的是更好地控制和管理設(shè)備,主要包括:更準(zhǔn)確地確定系統(tǒng)設(shè)備,更高效的進(jìn)行電源管理以及改進(jìn)的系統(tǒng)總線結(jié)構(gòu)管理。 2.3  內(nèi)核基礎(chǔ)設(shè)施 2.6內(nèi)核為了區(qū)別以。o為擴(kuò)展名的常規(guī)對(duì)象文件,將內(nèi)核模塊的擴(kuò)展名改為。ko。相對(duì)于2.4內(nèi)核下系統(tǒng)所支持的RAM為4GB而言,2.6內(nèi)核下系統(tǒng)支持更大數(shù)量的RAM,在分頁(yè)模式下可達(dá)64GB。同時(shí),2.6內(nèi)核優(yōu)化了I/O調(diào)度器,確保不會(huì)有進(jìn)程駐留在隊(duì)列中過(guò)長(zhǎng)時(shí)間等待輸入/輸出操作,使得I/O操作的響應(yīng)更為迅速。 2.4  外部設(shè)備 在2.4內(nèi)核中有約束大型系統(tǒng)的限制,比如支持的每一類設(shè)備的數(shù)量為256。而2.6內(nèi)核則徹底地打破了這些限制,可以支持4095種主要的設(shè)備類型,每一個(gè)單獨(dú)的類型又可以支持超過(guò)一百萬(wàn)個(gè)的子設(shè)備。 3 Linux2.6內(nèi)核下PCI設(shè)備驅(qū)動(dòng)程序的設(shè)計(jì) 3.1  PCI設(shè)備驅(qū)動(dòng)程序中數(shù)據(jù)結(jié)構(gòu) 在2.6內(nèi)核下使用file_operations數(shù)據(jù)結(jié)構(gòu),來(lái)建立設(shè)備驅(qū)動(dòng)程序中的函數(shù)與主設(shè)備號(hào)(major number)之間的對(duì)應(yīng)關(guān)系。該數(shù)據(jù)結(jié)構(gòu)中包含了指向驅(qū)動(dòng)程序內(nèi)部大多數(shù)函數(shù)的指針,描述了虛擬文件系統(tǒng)如何操作一個(gè)打開(kāi)的外圍設(shè)備。因而file _operations結(jié)構(gòu)是驅(qū)動(dòng)程序向內(nèi)核其他部分提供的一個(gè)統(tǒng)一的標(biāo)準(zhǔn)設(shè)備接口。 file結(jié)構(gòu)是設(shè)備驅(qū)動(dòng)程序使用的另一個(gè)重要的數(shù)據(jù)結(jié)構(gòu),指示當(dāng)前系統(tǒng)中已打開(kāi)的文件。它在C語(yǔ)言庫(kù)中定義,在調(diào)用內(nèi)核open函數(shù)時(shí)創(chuàng)建,并傳遞給在該設(shè)備上進(jìn)行操作的所有函數(shù),直到的close函數(shù)。file結(jié)構(gòu)中還包含了指向它所擁有的file_operations結(jié)構(gòu)的指針。 inode結(jié)構(gòu)由內(nèi)核自動(dòng)生成,代表已打開(kāi)文件的描述符,與每個(gè)打開(kāi)的文件一一對(duì)應(yīng)。它包含了兩個(gè)重要的結(jié)構(gòu)成員:dev_t擴(kuò)展到32位,其中12位主設(shè)備號(hào),20位從設(shè)備號(hào),而cdev用于存儲(chǔ)一個(gè)指向字符設(shè)備文件的指針。 3.2  驅(qū)動(dòng)程序與內(nèi)核和外部設(shè)備間的關(guān)系 (1) 通過(guò)Linux提供的系統(tǒng)調(diào)用函數(shù)(例如init_module等)進(jìn)入內(nèi)核,這些函數(shù)在2.6內(nèi)核版本下總共有兩百多個(gè),提供了幾乎所有應(yīng)用程序進(jìn)入內(nèi)核所需要執(zhí)行的操作。 (2) 系統(tǒng)的內(nèi)核函數(shù)都有“sys_”前綴(例如函數(shù)sys_init_module),應(yīng)用程序通過(guò)訪問(wèn)設(shè)備文件系統(tǒng)來(lái)調(diào)用這些函數(shù)。這一層主要是“devfs”(device filesystem)文件管理機(jī)制,它是從普通文件和設(shè)備文件抽象出來(lái)的一個(gè)文件系統(tǒng)層,完成進(jìn)入具體的設(shè)備文件操作之前的準(zhǔn)備工作。 (3) 由設(shè)備驅(qū)動(dòng)程序提供具體的函數(shù),來(lái)完成對(duì)硬件設(shè)備的各種操作。特別的對(duì)于PCI9656來(lái)說(shuō),就是通過(guò)PCI接口對(duì)設(shè)備的寄存器和存儲(chǔ)器進(jìn)行訪問(wèn)操作,例如調(diào)用register_chrdev等函數(shù)來(lái)初始化芯片內(nèi)部的狀態(tài)寄存器和配置寄存器。 3.3  PCI9656芯片的操作流程

  PCI總線是目前常用的外設(shè)總線之一,Linux的PCI內(nèi)核代碼為PCI設(shè)備驅(qū)動(dòng)程序的開(kāi)發(fā)提供了強(qiáng)大的支持。PCI9656的驅(qū)動(dòng)程序主要包括以下幾個(gè)方面:設(shè)備初始化,為PCI芯片分配內(nèi)存資源,實(shí)現(xiàn)數(shù)據(jù)的讀寫(xiě)功能,中斷處理,系統(tǒng)收回內(nèi)存資源,關(guān)閉設(shè)備等。 4.Linux2.6內(nèi)核下內(nèi)存和中斷管理的研究 2.6內(nèi)核應(yīng)用了許多新技術(shù)來(lái)實(shí)現(xiàn)對(duì)各類外部設(shè)備驅(qū)動(dòng)程序的更好支持。下面結(jié)合PCI9656驅(qū)動(dòng)程序中的內(nèi)存和中斷管理,進(jìn)一步分析和研究2.6內(nèi)核對(duì)內(nèi)存和中斷進(jìn)行的改進(jìn)和優(yōu)化。 4.1  內(nèi)存管理 在Linux內(nèi)存管理器中,頁(yè)表保持對(duì)進(jìn)程使用的內(nèi)存物理頁(yè)的追蹤,它將虛擬頁(yè)映射到物理頁(yè)上。系統(tǒng)必須找到映射到該頁(yè)的每一個(gè)進(jìn)程,將使用較少的頁(yè)置換出去,這樣進(jìn)程中相應(yīng)頁(yè)的頁(yè)表?xiàng)l目才能被更新。隨著在系統(tǒng)中運(yùn)行的進(jìn)程數(shù)量的增加,將這些頁(yè)置換出去的工作量也會(huì)急劇增加。

  為解決此問(wèn)題,2.6內(nèi)核引入了反向映射機(jī)制(reverse mapping),內(nèi)存管理器為每一個(gè)物理頁(yè)建立一個(gè)鏈表,包含指向當(dāng)前映射頁(yè)的每個(gè)進(jìn)程的頁(yè)表?xiàng)l目(page-table entry)的指針。該鏈表叫PTE鏈,它極大地提高了找到那些映射某個(gè)頁(yè)的進(jìn)程的速度,如圖2所示。驅(qū)動(dòng)程序調(diào)用下列內(nèi)核函數(shù)來(lái)為PCI9656分配內(nèi)存空間。   get_free_page(GFP_NOIO,PGD_ORDER); alloc_pages(gfp_mask,size); //查找并為PCI9656分配空閑內(nèi)存物理頁(yè) mempool_alloc(pool,gfp_mask); request_mem_region(pdx->Pci9656); remap_page_range(*mem_area,PCI9656,kernel_address,mem_size,prot); //請(qǐng)求分配內(nèi)存空間,實(shí)現(xiàn)PCI9656物理地址到內(nèi)存地址的映射 mempool_free(*element,pool);//釋放內(nèi)存 2.6內(nèi)核中將頭文件malloc.h改為slab.h,分配標(biāo)志GFP_BUFFER改為GFP_NOIO和GFP_NOFS,并新增了文件mempool.h。這些變化一起促生了2.6內(nèi)核中的內(nèi)存管理器,其設(shè)計(jì)目標(biāo)是更高的性能、效率和穩(wěn)定性。

  另一方面,使用反向映射獲得性能的提高也要付出代價(jià),即系統(tǒng)不得不占用一些低端內(nèi)存來(lái)保持對(duì)所有反向映射的追蹤,這勢(shì)必在32位硬件上成為內(nèi)存空間的瓶頸。因此2.6內(nèi)核引入了高端內(nèi)存頁(yè)表(Highmem PTE)機(jī)制,讓頁(yè)表?xiàng)l目存放在高端內(nèi)存中,釋放出更多的低端內(nèi)存區(qū)給必須放在這里的內(nèi)核數(shù)據(jù)結(jié)構(gòu)。同時(shí),較以前版本的內(nèi)核而言,2.6內(nèi)核重新構(gòu)建了一個(gè)更為簡(jiǎn)單的內(nèi)存管理器,提高了整個(gè)系統(tǒng)的穩(wěn)定性。 4.2  中斷處理 Linux處理中斷的方式很大程度上與它在用戶空間處理信號(hào)的方式一樣,驅(qū)動(dòng)程序只需為設(shè)備所對(duì)應(yīng)的中斷注冊(cè)一個(gè)處理程序,并在中斷到達(dá)時(shí)進(jìn)行正確的處理。 在2.4內(nèi)核之前,Linux系統(tǒng)一直采用cli和sti函數(shù)來(lái)禁用和啟用中斷,然而對(duì)于任意某個(gè)例程,想要知道在它被調(diào)用時(shí)中斷是否被啟用,已變得越來(lái)越困難。因而2.6內(nèi)核定義了函數(shù)local_irq_enable和local_irq_disable,用來(lái)使能和無(wú)效處理器控制的所有中斷,定義函數(shù)local_irq_save來(lái)將當(dāng)前中斷的狀態(tài)存入flags變量,避免了查詢中斷的狀態(tài)信息。 中斷處理程序的作用就是將有關(guān)中斷接收的信息反饋給設(shè)備,并根據(jù)正在服務(wù)的中斷的不同含義對(duì)數(shù)據(jù)進(jìn)行相應(yīng)的讀或?qū)憽S捎赑C機(jī)只有0-15的中斷號(hào),設(shè)備都是以共享的形式申請(qǐng)中斷號(hào),2.6內(nèi)核改進(jìn)了PCI設(shè)備中斷請(qǐng)求隊(duì)列的組織方式,通過(guò)設(shè)置flags變量中的SA_SHIRQ標(biāo)志位,并保證內(nèi)核中所有中斷號(hào)(dev_id)的性,來(lái)實(shí)現(xiàn)中斷的共享。 if(!(inb(card->iobase+CODEC_CMD_INT_STATUS)&0x80000000)) return;//識(shí)別中斷類型 request_irq(irq,*handler,flags,PCI9656,*dev_id);//向系統(tǒng)注冊(cè)PCI9656的中斷 如果中斷注冊(cè)成功,則返回值IRQ_RETVAL為0,這時(shí)在/proc/interrupts文件中可以看申請(qǐng)成功的中斷。在2.6內(nèi)核下,request_irq和free_irq從sched.h改到了interrupt.h中定義。 synchronize_irq(irq);//中斷同步 if(wait_event_interruptible(waitqueue,condition)>0) return;//判斷中斷等待使能 outb(intstat&card->iobase+CODEC_CMD_INT_HLDCLR+2);//使能并行端口的中斷 //系統(tǒng)響應(yīng)PCI9656的中斷,執(zhí)行數(shù)據(jù)讀寫(xiě)、寄存器訪問(wèn)等操作 free_irq(irq,*dev_id);//釋放設(shè)備中斷、I/O資源和緩沖區(qū)

  實(shí)驗(yàn)與測(cè)試 我們?cè)O(shè)計(jì)了Makefile文件和一個(gè)簡(jiǎn)單的應(yīng)用程序,在動(dòng)態(tài)加載驅(qū)動(dòng)程序后,對(duì)PCI9656開(kāi)發(fā)板進(jìn)行了大批量數(shù)據(jù)的讀寫(xiě)實(shí)驗(yàn)。基于64位PCI總線和100MHz的時(shí)鐘頻率,我們對(duì)芯片的數(shù)據(jù)讀寫(xiě)速率進(jìn)行了采集,實(shí)驗(yàn)結(jié)果統(tǒng)計(jì)如圖3所示。 從上圖可以看到,在2.6內(nèi)核下應(yīng)用PCI9656作為總線接口芯片,數(shù)據(jù)的讀寫(xiě)傳輸速率隨著數(shù)據(jù)包的大小有大幅度的提高,這在工程應(yīng)用中有很大的現(xiàn)實(shí)意義。 6 結(jié)束語(yǔ) 本文通過(guò)Linux2.6內(nèi)核所提供的一系列標(biāo)準(zhǔn)函數(shù)調(diào)用接口,用C++語(yǔ)言開(kāi)發(fā)了PCI9656的設(shè)備驅(qū)動(dòng)程序,并在Fedora Core2平臺(tái)下調(diào)試通過(guò),能正確發(fā)送和接收各種大小的數(shù)據(jù)包。當(dāng)通信的數(shù)據(jù)包大小為64KB時(shí),DMA通道的讀寫(xiě)速度可達(dá)1.8Gbps,能夠很好的滿足日益龐大的數(shù)據(jù)處理需要。同時(shí),Linux操作系統(tǒng)源代碼的開(kāi)放性還能較好的保證數(shù)據(jù)存儲(chǔ)運(yùn)算和通信的安全性。



  

版權(quán)與免責(zé)聲明

凡本網(wǎng)注明“出處:維庫(kù)電子市場(chǎng)網(wǎng)”的所有作品,版權(quán)均屬于維庫(kù)電子市場(chǎng)網(wǎng),轉(zhuǎn)載請(qǐng)必須注明維庫(kù)電子市場(chǎng)網(wǎng),http://hbjingang.com,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。

本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個(gè)人從本網(wǎng)轉(zhuǎn)載時(shí),必須保留本網(wǎng)注明的作品出處,并自負(fù)版權(quán)等法律責(zé)任。

如涉及作品內(nèi)容、版權(quán)等問(wèn)題,請(qǐng)?jiān)谧髌钒l(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。

廣告
OEM清單文件: OEM清單文件
*公司名:
*聯(lián)系人:
*手機(jī)號(hào)碼:
QQ:
有效期:

掃碼下載APP,
一鍵連接廣大的電子世界。

在線人工客服

買(mǎi)家服務(wù):
賣家服務(wù):
技術(shù)客服:

0571-85317607

網(wǎng)站技術(shù)支持

13606545031

客服在線時(shí)間周一至周五
9:00-17:30

關(guān)注官方微信號(hào),
第一時(shí)間獲取資訊。

建議反饋

聯(lián)系人:

聯(lián)系方式:

按住滑塊,拖拽到最右邊
>>
感謝您向阿庫(kù)提出的寶貴意見(jiàn),您的參與是維庫(kù)提升服務(wù)的動(dòng)力!意見(jiàn)一經(jīng)采納,將有感恩紅包奉上哦!