專利名稱:Linux操作系統(tǒng)下IDE設(shè)備熱插/拔系統(tǒng)及實(shí)現(xiàn)方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種IDE設(shè)備熱插/拔系統(tǒng)及實(shí)現(xiàn)方法,特別是涉及一種在Linux操作系統(tǒng)下實(shí)現(xiàn)IDE設(shè)備熱插/拔的系統(tǒng)及方法。
背景技術(shù):
IDE(Integrated Device Electronics)是一種磁盤驅(qū)動(dòng)器的接口類型,也稱為ATA(AT Attachment)接口。IDE接口模式經(jīng)歷了三個(gè)不同時(shí)期的技術(shù)變化,由最早的PIO(Programmed I/O)傳輸方式升級(jí)到先進(jìn)的DMA(DirectMemory Access)傳輸方式,直至現(xiàn)在最新的Ultra DMA(Ultra Direct MemoryAccess)傳輸方式。
IDE設(shè)備指的是采用IDE接口的計(jì)算機(jī)設(shè)備。目前,我們的計(jì)算機(jī)中標(biāo)配的IDE設(shè)備無外乎兩類——硬盤和光驅(qū),硬盤的存在形式比較簡(jiǎn)單,而光驅(qū)則包括CD-ROM驅(qū)動(dòng)器、DVD-ROM驅(qū)動(dòng)器和CD-R/RW光盤刻錄機(jī)三種常見的類型。此外,我們不常見的IDE設(shè)備還有ZIP軟盤驅(qū)動(dòng)器、ORB活動(dòng)硬盤驅(qū)動(dòng)器等。總的來說,IDE與存儲(chǔ)設(shè)備幾乎可以說是如影隨形。
無論具體IDE設(shè)備的工作原理及結(jié)構(gòu)設(shè)計(jì)如何,由于采用了同樣的接口、在同樣的總線上被同一個(gè)控制器指揮著,使用同樣的指令體系來完成與系統(tǒng)數(shù)據(jù)的雙向傳輸,因此,它們之間有很多共同之處。從具體的地方來看,這些相同之處表現(xiàn)在設(shè)備的數(shù)據(jù)連接/傳輸電纜、接口形狀、設(shè)置方式都大致相同。
直接與IDE設(shè)備打交道是IDE控制器,最早8086、286和386時(shí)代(甚至486時(shí)代的早期),IDE設(shè)備都需要一個(gè)單獨(dú)的控制卡來連接IDE設(shè)備,并通過這個(gè)卡上的IDE控制器來完成對(duì)IDE設(shè)備的各種訪問操作。但自從486時(shí)代開始,IDE控制器被集成到了系統(tǒng)的芯片組的南橋芯片中,直到今天。這些芯片組都提供了完全相同的配置集成兩個(gè)獨(dú)立IDE控制器,每個(gè)控制器可接駁兩個(gè)IDE設(shè)備(分別為主設(shè)備和從設(shè)備)。
在IDE設(shè)備上也有一個(gè)IDE控制器來完成設(shè)備與主機(jī)之間IDE控制命令以及數(shù)據(jù)監(jiān)控/傳輸?shù)裙δ?。只不過,這些控制器的存在形式由于IDE設(shè)備的不同,與主機(jī)端(芯片組內(nèi)集成)完全不一樣。簡(jiǎn)單來說,整個(gè)IDE就是由IDE設(shè)備、主機(jī)/設(shè)備的IDE控制器、IDE數(shù)據(jù)連接/傳輸電纜和接口共同構(gòu)成的一個(gè)子系統(tǒng)。
所謂熱插拔,指的就是帶電插/拔計(jì)算機(jī)的硬件。熱插拔可以節(jié)省計(jì)算機(jī)關(guān)機(jī)重新激活的時(shí)間,還能降低開關(guān)機(jī)時(shí)計(jì)算機(jī)激活電流過大對(duì)硬件造成的沖擊,所以在高級(jí)計(jì)算機(jī)用戶中備受青睞。
現(xiàn)有的IDE設(shè)備熱插拔的實(shí)現(xiàn),大致有如下兩種方法一種采用專用的硬設(shè)備,在硬件磁盤數(shù)組的基礎(chǔ)上,不需要軟件(操作系統(tǒng))的干預(yù),實(shí)現(xiàn)IDE設(shè)備的熱插/拔。這種方法硬設(shè)備造價(jià)昂貴,只適用于高檔的服務(wù)器。
另一種方法需要安裝IDE控制器的專用驅(qū)動(dòng)程序,由該專用的驅(qū)動(dòng)程序?qū)崿F(xiàn)IDE設(shè)備熱插/拔。這個(gè)驅(qū)動(dòng)程序依賴于特定的IDE控制器,通用性不強(qiáng)。同時(shí),在Linux操作系統(tǒng)中,支持熱插/拔的專用驅(qū)動(dòng)程序并不容易獲得。
因此,如何在不需要專用的硬設(shè)備和專用的驅(qū)動(dòng)程序的前提下,提供一種低成本且通用性較好的IDE設(shè)備熱插/拔的方法已經(jīng)成為急待解決的問題。
發(fā)明內(nèi)容
本發(fā)明為解決上述問題而提供一種Linux操作系統(tǒng)下IDE設(shè)備熱插/拔的實(shí)現(xiàn)方法,不需要昂貴的硬設(shè)備和專用的驅(qū)動(dòng)程序,即可在系統(tǒng)帶電運(yùn)行的過程中,實(shí)現(xiàn)IDE設(shè)備的插入和拔除。
本發(fā)明提供一種Linux操作系統(tǒng)下IDE設(shè)備熱插/拔系統(tǒng),用于在Linux操作系統(tǒng)帶電運(yùn)行的過程中,實(shí)現(xiàn)IDE設(shè)備的插入和拔除,該系統(tǒng)包括一中斷處理模塊,用于自動(dòng)檢測(cè)并分析IDE設(shè)備熱插拔操作所引起的硬件中斷;一用戶空間處理模塊,用于在接到該中斷處理模塊發(fā)出的通知后根據(jù)插/拔類型而將該IDE設(shè)備與應(yīng)用程序在用戶空間相分離;以及一IDE注冊(cè)信息處理模塊,用于根據(jù)用戶空間的處理情況以及插/拔類型而對(duì)IDE設(shè)備的注冊(cè)信息進(jìn)行修改。
本發(fā)明進(jìn)而提供一種Linux操作系統(tǒng)下IDE設(shè)備熱插/拔的實(shí)現(xiàn)方法,在Linux操作系統(tǒng)帶電運(yùn)行的過程中,實(shí)現(xiàn)IDE設(shè)備的插入和拔除,該方法首先捕獲IDE設(shè)備熱插/拔事件,接著定位發(fā)生該熱插/拔事件的具體IDE設(shè)備并分析插/拔類型,然后根據(jù)該IDE設(shè)備的使用情況將其與應(yīng)用程序在用戶空間分離,最后根據(jù)插/拔類型修改IDE控制器中的注冊(cè)信息。
本發(fā)明通過動(dòng)態(tài)修改Linux內(nèi)核中IDE設(shè)備的數(shù)據(jù)結(jié)構(gòu)信息,在Linux操作系統(tǒng)層次上實(shí)現(xiàn)IDE設(shè)備插/拔操作,不需要專用的硬設(shè)備和專用的驅(qū)動(dòng)程序,主要利用軟件進(jìn)行處理,成本很低且通用性較好。
圖1為本發(fā)明的Linux操作系統(tǒng)下IDE設(shè)備熱插/拔的實(shí)現(xiàn)方法流程圖;圖2為本發(fā)明的Linux操作系統(tǒng)下IDE設(shè)備熱插/拔系統(tǒng)模塊結(jié)構(gòu)圖;圖3為本發(fā)明所提供的中斷處理模塊的處理流程圖;圖4為本發(fā)明所提供的用戶空間處理模塊的處理流程圖;及圖5為本發(fā)明所提供的IDE注冊(cè)信息處理模塊的處理流程圖。
其中,附圖標(biāo)記說明如下步驟101 捕獲IDE設(shè)備熱插/拔事件步驟102 定位發(fā)生該熱插/拔事件的具體IDE設(shè)備并分析插/拔類型步驟103 根據(jù)該IDE設(shè)備的使用情況將其與應(yīng)用程序在用戶空間分離步驟104 根據(jù)插/拔類型修改IDE控制器中的注冊(cè)信息步驟301 注冊(cè)中斷處理程序步驟302 等待中斷發(fā)生步驟303 判斷中斷具體內(nèi)容步驟304 喚醒用戶空間處理模塊步驟401 等待中斷處理模塊喚醒通知步驟402 是否被中斷喚醒步驟403 取得發(fā)生中斷的具體設(shè)備步驟404 是否為拔除操作步驟405 控制器是否被使用步驟406 控制器是否有冗余步驟407 強(qiáng)制終止使用控制器的程序步驟408 調(diào)用IDE注冊(cè)信息處理模塊步驟409 從冗余中移除控制器步驟501 得到控制器的數(shù)據(jù)結(jié)構(gòu)步驟502 是否為插入操作步驟503 初始化控制器的硬件參數(shù)步驟504 探測(cè)控制器,填充注冊(cè)信息到控制器的數(shù)據(jù)結(jié)構(gòu)中步驟505 設(shè)置控制器的DMA方式步驟506 啟用DMA方式步驟507 清除控制器的注冊(cè)信息具體實(shí)施方式
如圖1所示,本發(fā)明提供一種Linux操作系統(tǒng)下IDE設(shè)備熱插/拔的實(shí)現(xiàn)方法,在Linux操作系統(tǒng)帶電運(yùn)行的過程中,實(shí)現(xiàn)IDE設(shè)備的插入和拔除,該方法首先捕獲IDE設(shè)備熱插/拔事件(步驟101);接著定位發(fā)生該熱插/拔事件的具體IDE設(shè)備并分析插/拔類型(步驟102);然后根據(jù)該IDE設(shè)備的使用情況將其與應(yīng)用程序在用戶空間分離(步驟103);最后根據(jù)插/拔類型修改IDE控制器中的注冊(cè)信息(步驟104)。
為進(jìn)一步清楚的描述本發(fā)明的實(shí)現(xiàn),請(qǐng)參閱圖2,其為本發(fā)明的模塊結(jié)構(gòu)圖,功能模塊按照Linux的特點(diǎn)被劃分成內(nèi)核空間的“IDE注冊(cè)信息處理模塊”、“中斷處理模塊”和用戶空間的“用戶空間處理模塊”三個(gè)模塊。
IDE控制器在發(fā)生熱插/拔事件時(shí),會(huì)產(chǎn)生硬件中斷。“中斷處理模塊”注冊(cè)一個(gè)中斷處理程序,用來捕獲熱插/拔事件。在捕獲到熱插/拔事件后,中斷處理模塊分析中斷原因具體的IDE控制器和插入/拔除類型。然后會(huì)通知“用戶空間處理程序”進(jìn)行處理。
“用戶空間處理模塊”設(shè)計(jì)成一個(gè)守護(hù)進(jìn)程,在Linux系統(tǒng)啟動(dòng)后自動(dòng)執(zhí)行并處于等待。在接到“中斷處理模塊”的通知后,“用戶空間處理程序”完成用戶空間需要進(jìn)行的處理如拔除設(shè)備前,終止各個(gè)應(yīng)用程序?qū)υ撛O(shè)備的使用,使該設(shè)備處于安全的可拔除狀態(tài)。在完成處理后,調(diào)用“IDE注冊(cè)信息處理模塊”。
“IDE注冊(cè)信息處理模塊”負(fù)責(zé)處理Linux核心(kernel)中關(guān)于IDE設(shè)備的注冊(cè)信息。Linux kernel中關(guān)于IDE設(shè)備的注冊(cè)信息保存在一個(gè)數(shù)組中,數(shù)組的每一個(gè)單元對(duì)應(yīng)一個(gè)IDE設(shè)備。通過修改該數(shù)組可以在Linux kernel中實(shí)現(xiàn)對(duì)IDE設(shè)備的注冊(cè)或注銷操作,從而實(shí)現(xiàn)IDE設(shè)備插入和拔除。
下面從各個(gè)模塊的處理流程出發(fā)來說明本發(fā)明的實(shí)現(xiàn)方法,圖3為中斷處理模塊的流程圖,“中斷處理模塊”可以設(shè)計(jì)成Linux Kernel可加載模塊,模塊初始化后,注冊(cè)一個(gè)中斷處理函數(shù)(步驟301),該中斷處理函數(shù)處于等待狀態(tài),等待中斷發(fā)生(步驟302)。當(dāng)發(fā)生IDE熱插拔事件后,產(chǎn)生硬件中斷,該中斷觸發(fā)中斷處理函數(shù)。
中斷處理函數(shù)判斷中斷的具體原因,判斷是哪一個(gè)IDE控制器發(fā)生熱插/拔,是插入還是拔除(步驟303)。喚醒“用戶空間處理程序”進(jìn)行處理(步驟304)。然后中斷處理模塊繼續(xù)進(jìn)入等待,等候下一次中斷發(fā)生。其中,所謂插/拔類型,是根據(jù)硬件中斷類型,判斷當(dāng)前IDE設(shè)備的操作是插入還是拔除。
圖4為用戶空間處理模塊的流程圖,“用戶空間處理程序”啟動(dòng)后進(jìn)入睡眠狀態(tài),等待“中斷處理模塊”喚醒(步驟401,402)。在被喚醒之后,首先取得發(fā)生中斷的具體設(shè)備(步驟403),然后判斷設(shè)備是插入還是拔除(步驟404)。如果是插入操作,不做進(jìn)一步處理,直接調(diào)用“IDE注冊(cè)信息處理模塊”(步驟408),由“IDE注冊(cè)信息處理模塊”作進(jìn)一步的處理。
如果中斷類型為拔除控制器的操作,判斷控制器是否被應(yīng)用程序使用(步驟405)。如果沒有應(yīng)用程序使用此控制器,表明控制器可以安全的拔除,可直接調(diào)用“IDE注冊(cè)信息處理模塊”進(jìn)行處理。
如果控制器已經(jīng)被使用,判斷控制器是否是磁盤數(shù)組的一部分,是否有冗余(步驟406)。如果控制器有冗余,表明拔除此控制器不會(huì)影響到應(yīng)用程序的使用,可從冗余中移除此控制器(步驟409)。然后調(diào)用“IDE注冊(cè)信息處理模塊”進(jìn)行處理。
如果控制器沒有冗余,就需要強(qiáng)制終止使用此控制器的用戶程序(步驟407),清除對(duì)控制器的使用,然后交給“IDE注冊(cè)信息處理模塊”作進(jìn)一步的處理。
圖5為IDE注冊(cè)信息處理模塊流程圖?!癐DE注冊(cè)信息處理模塊”運(yùn)行在Linux核心空間,由“用戶空間處理程序”調(diào)用,處理IDE設(shè)備的數(shù)據(jù)結(jié)構(gòu)。首先通過ide_hwif數(shù)組獲取指定控制器的數(shù)據(jù)結(jié)構(gòu)(步驟501)。判斷熱插/拔類型(步驟502),如果為插入操作,調(diào)用核心函數(shù)ide_init_hwif_ports,初始化控制器的硬件參數(shù)(步驟503)。然后通過核心函數(shù)ide_probe_module、create_proc_ide_interfaces、ide_driver_module檢測(cè)控制器,填充注冊(cè)信息到控制器的數(shù)據(jù)結(jié)構(gòu)中(步驟504)。然后通過核心函數(shù)ide_setup_dma設(shè)置控制器的DMA方式(505),再調(diào)用核心函數(shù)ide_dma_check和set_using_dma,啟用DMA(直接內(nèi)存訪問,Direct Memory Access)方式(步驟506)。此時(shí)控制器信息已經(jīng)被正確的加入到核心的數(shù)據(jù)結(jié)構(gòu)中,用戶程序也可以訪問該IDE控制器??刂破鞯牟迦氩僮鞯酱私Y(jié)束。
如果進(jìn)行拔除操作,調(diào)用核心函數(shù)ide_unregister,清除控制器的注冊(cè)信息(步驟507)。這樣控制器就拔除了。
下面為了具體說明本發(fā)明的技術(shù),特舉一具體實(shí)施例。在一個(gè)存儲(chǔ)服務(wù)器中,有一個(gè)IDE控制器插槽為空閑狀態(tài),將一個(gè)控制器插入到該插槽的處理過程如下首先中斷處理模塊檢測(cè)到中斷發(fā)生,判斷出一個(gè)IDE控制器插入到系統(tǒng)中,調(diào)用用戶空間處理程序。用戶空間處理程序判斷是IDE插入操作,不做處理,直接調(diào)用IDE注冊(cè)信息處理模塊。IDE注冊(cè)信息處理模塊取得該控制器的數(shù)據(jù)結(jié)構(gòu),初始化硬件參數(shù)。檢測(cè)控制器,填充注冊(cè)信息到控制器的數(shù)據(jù)結(jié)構(gòu)中。初始化控制器的DMA參數(shù),啟動(dòng)DMA方式。
以上所述,僅為本發(fā)明其中的較佳實(shí)施例,并非用來限定本發(fā)明的實(shí)施范圍;凡依據(jù)本發(fā)明申請(qǐng)專利范圍在不脫離本發(fā)明的精神和范圍內(nèi)所作的均等變化與修飾,均應(yīng)屬于本發(fā)明專利權(quán)利要求書所要求保護(hù)的范圍內(nèi)。
權(quán)利要求
1.一種Linux操作系統(tǒng)下IDE設(shè)備熱插/拔系統(tǒng),用于在Linux操作系統(tǒng)帶電運(yùn)行的過程中,實(shí)現(xiàn)IDE設(shè)備的插入和拔除,其中該系統(tǒng)包括一中斷處理模塊,用于自動(dòng)檢測(cè)并分析IDE設(shè)備熱插/拔操作所引起的硬件中斷;一用戶空間處理模塊,用于在接到該中斷處理模塊發(fā)出的通知后根據(jù)插/拔類型而將該IDE設(shè)備與應(yīng)用程序在用戶空間相分離;及一IDE注冊(cè)信息處理模塊,用于根據(jù)用戶空間的處理情況以及插/拔類型而對(duì)IDE設(shè)備的注冊(cè)信息進(jìn)行修改。
2.如權(quán)利要求1所述的Linux操作系統(tǒng)下IDE設(shè)備熱插/拔系統(tǒng),其中該中斷處理模塊為Linux核心可加載模塊。
3.如權(quán)利要求1所述的Linux操作系統(tǒng)下IDE設(shè)備熱插/拔系統(tǒng),其中該用戶空間處理模塊在Linux操作系統(tǒng)啟動(dòng)后自動(dòng)處于等待狀態(tài),直至接到該中斷處理模塊的通知后執(zhí)行處理過程。
4.如權(quán)利要求1所述的Linux操作系統(tǒng)下IDE設(shè)備熱插/拔系統(tǒng),其中該IDE注冊(cè)信息處理模塊運(yùn)行在Linux核心空間。
5.一種Linux操作系統(tǒng)下IDE設(shè)備熱插/拔的實(shí)現(xiàn)方法,在Linux操作系統(tǒng)帶電運(yùn)行的過程中,實(shí)現(xiàn)IDE設(shè)備的插入和拔除,其中該方法包括以下步驟捕獲IDE設(shè)備熱插/拔事件;定位發(fā)生該熱插/拔事件的具體IDE設(shè)備并分析插/拔類型;根據(jù)該IDE設(shè)備的使用情況將其與應(yīng)用程序在用戶空間分離;及根據(jù)插/拔類型修改IDE控制器中的注冊(cè)信息。
6.如權(quán)利要求5所述的Linux操作系統(tǒng)下IDE設(shè)備熱插/拔的實(shí)現(xiàn)方法,其中該捕獲熱插/拔事件并分析插/拔類型的步驟,還包括如下步驟注冊(cè)一中斷處理函數(shù)并等待中斷發(fā)生;當(dāng)發(fā)生IDE設(shè)備熱插/拔事件后觸發(fā)該中斷處理函數(shù);及由該中斷處理函數(shù)判斷是哪一個(gè)IDE控制器發(fā)生熱插拔,是插入還是拔除。
7.如權(quán)利要求5所述的Linux操作系統(tǒng)下IDE設(shè)備熱插/拔的實(shí)現(xiàn)方法,其中該插/拔類型為拔除時(shí),將IDE設(shè)備與應(yīng)用程序在用戶空間分離的步驟,還包括如下步驟取得發(fā)生中斷的具體IDE設(shè)備并確定其為拔除操作;判斷該設(shè)備是否被應(yīng)用程序使用;如果該設(shè)備被應(yīng)用程序使用,則判斷該設(shè)備是否為磁盤數(shù)組的一部分,是否有冗余;及如果該設(shè)備沒有冗余,則強(qiáng)制終止使用該設(shè)備的用戶應(yīng)用程序,清除對(duì)該設(shè)備的使用。
8.如權(quán)利要求5所述的Linux操作系統(tǒng)下IDE設(shè)備熱插/拔的實(shí)現(xiàn)方法,其中該插/拔類型為拔除時(shí),該修改IDE控制器中的注冊(cè)信息的步驟,為清除該IDE設(shè)備控制器的注冊(cè)信息。
9.如權(quán)利要求5所述的Linux操作系統(tǒng)下IDE設(shè)備熱插/拔的實(shí)現(xiàn)方法,其中該清除控制器注冊(cè)信息的步驟,是通過調(diào)用核心函數(shù)ide unregister來實(shí)現(xiàn)的。
10.如權(quán)利要求5所述的Linux操作系統(tǒng)下IDE設(shè)備熱插/拔的實(shí)現(xiàn)方法,其中該插/拔類型為插入時(shí),該修改IDE控制器中的注冊(cè)信息的步驟,還包括如下步驟獲取指定控制器的數(shù)據(jù)結(jié)構(gòu);初始化該控制器的硬件參數(shù);檢測(cè)該控制器,填充注冊(cè)信息到控制器的數(shù)據(jù)結(jié)構(gòu)中;設(shè)置該控制器的DMA方式;及啟用DMA方式。
全文摘要
一種Linux操作系統(tǒng)下IDE設(shè)備熱插/拔系統(tǒng)及方法,其中包括中斷處理模塊,用戶空間處理模塊,IDE注冊(cè)信息處理模塊,首先捕獲IDE設(shè)備熱插/拔事件,接著定位發(fā)生該熱插/拔事件的具體IDE設(shè)備并分析插/拔類型,然后根據(jù)該IDE設(shè)備的使用情況將其與應(yīng)用程序在用戶空間分離,最后根據(jù)插/拔類型修改IDE控制器中的注冊(cè)信息,本發(fā)明不需要昂貴的硬設(shè)備和專用的驅(qū)動(dòng)程序,即可在系統(tǒng)帶電運(yùn)行的過程中,實(shí)現(xiàn)IDE設(shè)備的插入和拔除。
文檔編號(hào)G06F13/10GK1632769SQ20031011311
公開日2005年6月29日 申請(qǐng)日期2003年12月22日 優(yōu)先權(quán)日2003年12月22日
發(fā)明者劉文涵, 陳玄同, 王興家 申請(qǐng)人:英業(yè)達(dá)股份有限公司