亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

一種繞過Bio層訪問磁盤驅動的存儲接口的方法

文檔序號:6341246閱讀:307來源:國知局
專利名稱:一種繞過Bio層訪問磁盤驅動的存儲接口的方法
技術領域
本發(fā)明涉及計算機數(shù)據(jù)存儲技術,特別涉及一種繞過Bio層訪問磁盤驅動的存儲 接口的方法。
背景技術
目前常用的磁盤設備的輸入輸出(IO)接口包括小型計算機系統(tǒng)接口(SCSI, Small Computer System Interface),串行連接 SCSI 接口(SAS,SerialAttached SCSI)和 光纖通道(FC,F(xiàn)iber Channel)。各種基于Linux操作系統(tǒng)的磁盤接口驅動程序都須要在 Linux塊設備層進行注冊,通過特定的IO接口來構造和提交IO請求。Linux 2. 6內(nèi)核正式引入了 Bio結構,它是大多數(shù)塊設備向底層提交IO請求的一 種通用描述。通過Bio層來訪問磁盤設備的處理流程如圖1所示,包括如下步驟步驟101 將應用程序提交的IO請求的信息提取出來,構造成Bio結構,Bio結構 中記錄了 IO請求的訪問地址和讀寫數(shù)據(jù)的長度。一般情況下,在Bio結構中,數(shù)據(jù)會以分 片的形式鏈接起來,其鏈首地址記錄在Bio結構中。步驟102 將構造好的Bio結構提交到Linux通用塊設備層,根據(jù)Bio結構中的請 求信息,構造通用的塊設備IO請求,將這些塊設備IO請求放到所訪問磁盤的請求隊列上。步驟103 =Linux塊設備層通過一系列隊列處理函數(shù),將塊設備IO請求通過固定的 IO接口提交給底層驅動程序。由于基于Linux操作系統(tǒng)的底層驅動都會向Linux通用塊設 備層注冊自己的接口,底層驅動的IO處理函數(shù)和塊設備層固定的IO接口相銜接,從而順利 接管IO請求的處理。步驟104 底層驅動程序將IO請求的信息重新封裝成與接口協(xié)議相關的協(xié)議數(shù)據(jù) 單元,并向主機適配器(HBA)提交,最終到達磁盤。在上面所述的流程中,Bio層會使用多種調(diào)度算法對IO進行合并和排序。Linux 操作系統(tǒng)以頁為單位來管理內(nèi)存,bio結構也是在此基礎之上,以頁為單位來組織數(shù)據(jù),IO 請求所需要的讀取或者寫入的數(shù)據(jù),通常是以頁為單位分片鏈接起來,Bio結構通常只記錄 鏈首地址。Bio結構的引入,能夠統(tǒng)一不同塊設備的IO接口,正因為要兼顧多種塊設備的兼 容性要求,通過Bio層的IO請求有著比較復雜的處理流程,給特定情況下的應用帶來局限 性,同時也在一定程度上帶來了性能的損失。

發(fā)明內(nèi)容
本發(fā)明提供了一種繞過Bio層訪問磁盤驅動的存儲接口的方法,避免了 Bio層的 復雜處理流程,提高IO訪問效率。本發(fā)明實施例提出的繞過Bio層訪問磁盤驅動的存儲接口的方法包括如下步驟建立設備模型,每個磁盤設備對應一個磁盤設備對象,并將應用程序發(fā)起的IO請 求封裝成IO請求對象;
為每個磁盤設備對象建立兩級隊列等待隊列和處理隊列;等待隊列用于依次接 收IO請求對象,在處理隊列有空位的情況下,將IO請求對象從等待隊列中轉移到處理隊 列;創(chuàng)建掃描線程,用于掃描所有磁盤設備對象的等待隊列,若等待隊列上有IO請求 對象,從處理隊列中取出IO請求對象向底層提交,IO處理完畢后將該IO請求對象從處理 隊列中移除。較佳地,所述將應用程序發(fā)起的IO請求封裝成IO請求對象包括使用專用數(shù)據(jù)包記錄IO請求的關鍵信息;利用所述專用數(shù)據(jù)包的信息,構造并填 充scsi_cmd結構;所述從處理隊列中取出IO請求對象向底層提交包括使用所述SCSi_Cmd結構作 為傳入?yún)?shù),通過下層指定接口注冊函數(shù)提交IO請求。較佳地,所述關鍵信息包括SCSI命令描述塊,IO請求的數(shù)據(jù)傳輸方向,讀寫請求 的數(shù)據(jù)傳輸?shù)腄MA地址,數(shù)據(jù)傳輸長度和數(shù)據(jù)請求完成狀態(tài)。較佳地,該方法進一步包括在底層驅動中增加一條分支路徑接口注冊函數(shù);所述SCSi_Cmd結構記錄動態(tài)內(nèi)存存取DMA地址,頁地址設為空;所述使用所述SCSi_Cmd結構作為傳入?yún)?shù),通過下層指定接口注冊函數(shù)提交IO 請求包括判斷所述SCSi_Cmd結構的頁地址是否為空,若是,通過所述分支路徑接口注冊 函數(shù)提交IO請求。較佳地,所述從處理隊列中取出IO請求對象向底層提交,IO處理完畢后將該IO請 求對象從處理隊列中移除包括將中斷完成函數(shù)指針記錄到SCSi_Cmd結構中;比較返回命令的命令序列號,來判斷該返回命令是否屬于超時的無效返回,若是, 則結束處理;否則,記錄SCSI命令完成狀態(tài)信息,通過所述專用數(shù)據(jù)數(shù)據(jù)包向上層模塊返 回,并且釋放scsi_cmd命令資源;scsi_cmd的result字段記錄了 IO完成的狀態(tài),根據(jù)IO完成的狀態(tài),調(diào)用相應的 函數(shù)來向上層返回請求處理結果;如果所述處理結果為命令正確完成,清除處理隊列上的相應IO請求對象,從等待 隊列中繼續(xù)取新的IO請求對象轉移到處理隊列上;如果命令未能正確完成,將根據(jù)記錄的 SCSI命令完成狀態(tài)信息判斷出錯原因,進行命令重試。從以上技術方案可以看出,將應用程序發(fā)出的IO請求直接通過底層驅動的注冊 接口向設備提交,避免了 Bio結構的使用也繞開了頁分配和頁地址的轉換過程,從而繞開 了 Bio層的復雜處理流程,極大的提高了 IO效率。本發(fā)明提供的這種繞開Bio層訪問磁盤 驅動的存儲接口方法,使用精簡的IO路徑和資源分配方式,一方面縮短了 IO請求的處理時 間,另一方面,擺脫了 Linux操作系統(tǒng)的限制,通過更加靈活簡潔的方式,設計并實現(xiàn)了通 用性和移植性更強的新型IO接口。


圖1為本發(fā)明實施例提出的建立通用設備模型和請求隊列的流程示意圖;圖2為等待隊列和處理隊列的關系示意 圖3為本發(fā)明實施例提出的繞開Bio層進行IO處理的流程示意圖。
具體實施例方式
在現(xiàn)有技術中,通過Linux系統(tǒng)Bio層的IO訪問都須要將請求掛到塊設備請求隊 列上,在Linux系統(tǒng)中這些請求隊列是所有塊設備通用的,有著一系列既定的處理方法的 集合。但是在很多應用中,需要自行設計請求隊列并以不同的方式對其進行隊列管理,繞開 Bio層,針對不同的隊列管理方式,自行構造請求隊列,有利于解除這種局限性。為使本發(fā)明方案的技術特征及所達到的技術效果更加清楚,以下參照附圖詳細敘 述本發(fā)明的具體實施方式
。為了實現(xiàn)本發(fā)明的方法,需要先建立設備模型和請求隊列,由于繞開Bio進行請 求,隊列的管理流程更為簡潔,避開了 Linux塊設備層復雜的隊列處理方式。圖1為本發(fā)明實施例提出的建立通用設備模型和請求隊列的流程示意圖。該流程 中,定義兩種新的數(shù)據(jù)結構分別稱為磁盤設備對象(kdev,kaos_device)和IO請求對象 Gibuf,kaoS_buf),磁盤設備對象是每個磁盤設備的抽象,記錄了該設備必要的信息;IO請 求對象則是對IO請求的抽象,記錄了每個IO請求的必要信息。該流程包括如下步驟步驟101 建立設備模型,每個磁盤設備對應一個磁盤設備對象,并將應用程序發(fā) 起的IO請求封裝成IO請求對象;步驟102 為每個磁盤設備對象建立兩級隊列等待隊列和處理隊列;等待隊列用 于依次接收IO請求對象,在處理隊列有空位的情況下,將IO請求對象從等待隊列中轉移到 處理隊列。處理隊列相當于是緩存池,用來從等待隊列中取出IO請求對象緩存起來并向下 層接口提交。步驟103 創(chuàng)建掃描線程,用于掃描所有磁盤設備對象的等待隊列,只要等待隊列 上有IO請求對象,就從處理隊列中取出IO請求對象向底層提交,IO處理完畢后將該IO請 求對象從處理隊列中移除。圖2為等待隊列和處理隊列的關系示意圖。如圖2所示,由于等待隊列最多可以 接收8個IO請求對象,這樣一來起到了流量限制的作用,當對處理隊列中的IO請求對象完 成IO處理,并刪除該IO請求對象后,才可以繼續(xù)緩存等待隊列的新的IO請求對象。圖3是本發(fā)明實施例提出的繞開Bio層進行IO處理的流程示意圖,包括如下步 驟步驟301 分配 sisi_cmd 結構。SCSi_Cmd結構是底層驅動和Linux塊設備層銜接進行IO傳輸?shù)男畔⑤d體,記錄了 IO請求的相關信息。所述相關信息包括但不限于SCSI命令描述塊(CDB),IO請求的數(shù)據(jù) 傳輸方向,讀寫請求的數(shù)據(jù)傳輸?shù)腄MA地址,數(shù)據(jù)傳輸長度,數(shù)據(jù)請求完成狀態(tài)等。步驟302 根據(jù)IO請求對象中的IO信息,填充SCSi_Cmd結構。scsi_cmd結構中用來進行數(shù)據(jù)傳輸?shù)慕Y構稱為聚散鏈表(sg list),由于繞開了 Bio層并且避免了頁分配,在sg list的鏈表項中只需要記錄動態(tài)內(nèi)存存取(DMA)地址,頁 地址設為空。步驟303 將準備好的SCSi_Cmd結構作為傳入?yún)?shù),提交到隊列命令 (queuecommand)注冊接口處。這里的queuecommand是一個函數(shù)指針,底層驅動會向這個指針注冊各自的IO處理函數(shù)。步驟304 底層驅動的IO處理函數(shù)接管IO處理。步驟305 :10處理完畢后,調(diào)用自行設計的中斷完成函數(shù)SCSi_d0ne來向上層模塊 傳遞IO完成信息,并釋放相關資源。步驟306 判斷IO是否正確完成,若是,執(zhí)行步驟307,否則執(zhí)行步驟308。步驟307從處理隊列中移除kbuf,處理下一個kbuf,返回步驟301 ;步驟308 返回錯誤信息給上層模塊,由上層模塊決定是進行IO重試還是放棄。自此,繞開Bio層的IO處理方式通過上下層明確的接口,順利實現(xiàn)了精簡路徑的 IO處理。本發(fā)明提出的技術方案由于在關鍵的IO路徑上繞開了 Linux既有的處理方式,在 數(shù)據(jù)請求封裝,提交,管理等方面都使用了自行設計的處理模式,可以不受Linux操作系統(tǒng) 的限制,方便移植到各自操作系統(tǒng)中。本發(fā)明提供的方法,使得IO處理流程大大簡化,應用 程序提交的IO經(jīng)過一次封裝,就可以直接提交到底層驅動的接口處,IO性能有很大提升。具體地,本發(fā)明的技術特點如下1、在Linux操作系統(tǒng)下,基于Bio層的IO處理有著比較復雜的流程,本發(fā)明的目 的在于繞開Bio層的復雜流程,利用自行設計的IO存儲接口,精簡處理過程,實現(xiàn)IO效率 提升;2、自行設計設備模型和隊列管理方式,避免使用了 Linux塊設備層隊列處理的復 雜調(diào)度算法;3、重新封裝IO信息,避免內(nèi)存頁的使用,直接通過DMA方式傳輸,避免了頁地址向 DMA地址的轉換。4、少量修改底層驅動,建立分支路徑,一方面保證操作系統(tǒng)自身的基于Bio層的 IO操作能正常進行,一方面也能保證通過本發(fā)明中繞開Bio的存儲接口的IO請求能正確提 交。極大提高了該存儲接口的通用性。5、自行設計IO完成函數(shù),順利將改存儲接口和上層模塊連接,可以方便的一直到 各種應用中。以上所述僅為本發(fā)明的較佳實施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精 神和原則之內(nèi),所做的任何修改、等同替換、改進等,均應包含在本發(fā)明保護的范圍之內(nèi)。
權利要求
1.一種繞過BiO層訪問磁盤驅動的存儲接口的方法,其特征在于,包括如下步驟建立設備模型,每個磁盤設備對應一個磁盤設備對象,并將應用程序發(fā)起的IO請求封 裝成IO請求對象;為每個磁盤設備對象建立兩級隊列等待隊列和處理隊列;等待隊列用于依次接收IO 請求對象,在處理隊列有空位的情況下,將IO請求對象從等待隊列中轉移到處理隊列;創(chuàng)建掃描線程,用于掃描所有磁盤設備對象的等待隊列,若等待隊列上有IO請求對 象,從處理隊列中取出IO請求對象向底層提交,IO處理完畢后將該IO請求對象從處理隊 列中移除。
2.根據(jù)權利要求1所述的方法,其特征在于,所述將應用程序發(fā)起的IO請求封裝成IO 請求對象包括使用專用數(shù)據(jù)包記錄IO請求的關鍵信息;利用所述專用數(shù)據(jù)包的信息,構造并填充 scsi_cmd 結構;所述從處理隊列中取出IO請求對象向底層提交包括使用所述scsi_cmd結構作為傳 入?yún)?shù),通過下層指定接口注冊函數(shù)提交IO請求。
3.根據(jù)權利要求2所述的方法,其特征在于,所述關鍵信息包括SCSI命令描述塊,IO 請求的數(shù)據(jù)傳輸方向,讀寫請求的數(shù)據(jù)傳輸?shù)腄MA地址,數(shù)據(jù)傳輸長度和數(shù)據(jù)請求完成狀 態(tài)。
4.根據(jù)權利要求2所述的方法,其特征在于,該方法進一步包括在底層驅動中增加一 條分支路徑接口注冊函數(shù);所述scsi_cmd結構記錄動態(tài)內(nèi)存存取DMA地址,頁地址設為空;所述使用所述SCSi_Cmd結構作為傳入?yún)?shù),通過下層指定接口注冊函數(shù)提交IO請求 包括判斷所述scsi_cmd結構的頁地址是否為空,若是,通過所述分支路徑接口注冊函數(shù) 提交IO請求。
5.根據(jù)權利要求2、3或4所述的方法,其特征在于,所述從處理隊列中取出IO請求對 象向底層提交,IO處理完畢后將該IO請求對象從處理隊列中移除包括將中斷完成函數(shù)指針記錄到scsi_cmd結構中;比較返回命令的命令序列號,來判斷該返回命令是否屬于超時的無效返回,若是,則結 束處理;否則,記錄SCSI命令完成狀態(tài)信息,通過所述專用數(shù)據(jù)數(shù)據(jù)包向上層模塊返回,并 且釋放scsi_cmd命令資源;scsi_cmd的result字段記錄了 IO完成的狀態(tài),根據(jù)IO完成的狀態(tài),調(diào)用相應的函數(shù) 來向上層返回請求處理結果;如果所述處理結果為命令正確完成,清除處理隊列上的相應IO請求對象,從等待隊列 中繼續(xù)取新的IO請求對象轉移到處理隊列上;如果命令未能正確完成,將根據(jù)記錄的SCSI 命令完成狀態(tài)信息判斷出錯原因,進行命令重試。
全文摘要
本發(fā)明提供了一種繞過Bio層訪問磁盤驅動的存儲接口的方法,包括如下步驟建立設備模型,每個磁盤設備對應一個磁盤設備對象,并將應用程序發(fā)起的IO請求封裝成IO請求對象;為每個磁盤設備對象建立兩級隊列等待隊列和處理隊列;等待隊列用于依次接收IO請求對象,在處理隊列有空位的情況下,將IO請求對象從等待隊列中轉移到處理隊列;創(chuàng)建掃描線程,用于掃描所有磁盤設備對象的等待隊列,若等待隊列上有IO請求對象,從處理隊列中取出IO請求對象向底層提交,IO處理完畢后將該IO請求對象從處理隊列中移除。
文檔編號G06F13/16GK102073605SQ20101062182
公開日2011年5月25日 申請日期2010年12月27日 優(yōu)先權日2010年12月27日
發(fā)明者饒國林 申請人:云海創(chuàng)想信息技術(北京)有限公司, 深圳市創(chuàng)新科信息技術有限公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1