一種io地址到io對象快速映射方法及系統(tǒng)的制作方法【
技術(shù)領(lǐng)域:
】[0001]本發(fā)明涉及數(shù)字仿真計算機
技術(shù)領(lǐng)域:
,尤其涉及一種基于gsMap的IO地址到IO對象快速映射方法及系統(tǒng)?!?br>背景技術(shù):
】[0002]數(shù)字仿真計算機中,虛擬CPU通過讀寫IO地址完成與外部設(shè)備通訊。通常,數(shù)字仿真計算機外部IO以若干連續(xù)IO地址空間塊(以下簡稱IO塊)分布。參考圖1,IO塊模型示意圖。圖1示意出了IO塊(I0_BL0CK)基本屬性,包括基地址base、大小size;而位于該IO塊中的IO地址可以使用基地址與偏移地址offset描述。眾多的IO塊常常呈線性分散分布在IO地址空間中,只有被映射的IO地址才屬于訪問范圍。參考圖2,10地址空間與IO塊示意圖。對應(yīng)每一個IO地址,構(gòu)造IO對象,兩者存在一一映射關(guān)系。當(dāng)仿真CPU訪問某IO時,首先給出IO地址,然后查詢IO對象,接著進(jìn)行讀寫等操作。[0003]-種IO地址到IO對象的映射查詢實現(xiàn)方法是:在仿真計算機的內(nèi)存中申請一塊足夠容納所有IO塊的連續(xù)緩存,包含IO塊之間的空隙,緩存中填寫IO對象的入口地址;這樣,獲得IO地址后,僅僅進(jìn)行偏移地址的簡單換算,便可以獲得IO對象。但由于IO地址空間塊分布比較分散,地址跨度大,有限的計算機內(nèi)存空間使得該方案無法實現(xiàn)。另一種IO地址到IO對象的映射查詢實現(xiàn)方法是:使用std::map類似的容器;該方案內(nèi)存使用相對有效,通常的訪問也具有一定程度上的時間運行效率,尤其適用Google::sparsehash可獲得更高時間運行效率。但是隨著IO對象的增多,查找過程就會呈〇(nlog(n))增加,而在仿真系統(tǒng)中,由于IO訪問十分頻繁、又需要優(yōu)先保證速率的應(yīng)用情景下,此時還是會因速度太慢而變得不合適。[0004]因此,需要提供一種快速IO地址到IO對象的映射查詢方法,提高數(shù)字仿真計算機的仿真效率。【
發(fā)明內(nèi)容】[0005]本發(fā)明的目的在于,針對現(xiàn)有技術(shù)數(shù)字衛(wèi)星建模過程中IO地址到IO對象的映射查詢存在的的技術(shù)問題,提供一種IO地址到IO對象快速映射方法及系統(tǒng),在數(shù)字衛(wèi)星建模過程中,實現(xiàn)IO地址到IO對象的快速查找,從而提高仿真速度。[0006]為實現(xiàn)上述目的,本發(fā)明提供了一種IO地址到IO對象快速映射方法,包括如下步驟:(1)采集所有IO塊的基地址basep大小size#及間隔gapi,并按地址順序排列,其中下標(biāo)i表示第i個IO塊;(2)選取最小間隔值min[gaPi],從而獲取空隙值space,其中space<min[gapj;(3)以IO地址空間的起始地址為起始位置start,采用空隙值space重新分割I(lǐng)O地址空間;(4)構(gòu)造間隙和數(shù)組gapSum_table,以記錄從起始位置start開始每一空隙值space空間內(nèi)IO地址所對應(yīng)的間隙和,所述間隙和數(shù)組的大小為:Ngapsum_tabie彡(basen+sizen)/space,其中,basen+sizen為最后一塊IO塊的結(jié)束地址;(5)構(gòu)造IO對象數(shù)組,每一IO地址address映射一在所述IO對象數(shù)組中位于相應(yīng)數(shù)組索引index處的IO對象,所述IO對象數(shù)組的大小為所有IO塊大小之和;(6)根據(jù)構(gòu)造的間隙和數(shù)組以及IO對象數(shù)組,采用如下計算公式完成IO地址address到相應(yīng)數(shù)組索引index的計算,從而完成IO地址address到IO對象的快速映射:index=address_gapSum_table((address-start)/space)0[0007]為實現(xiàn)上述目的,本發(fā)明還提供了一種IO地址到IO對象快速映射系統(tǒng),包括采集單元、空隙值獲取單元、分割單元、間隙和數(shù)組構(gòu)造單元、IO對象數(shù)組構(gòu)造單元以及映射單元;所述采集單元,用于采集所有IO塊的基地址basep大小size#及間隔gapi,并按地址順序排列,其中下標(biāo)i表示第i個IO塊;所述空隙值獲取單元,用于選取最小間隔值minUgaPi],從而獲取空隙值space,其中space彡minligaPi];所述分割單元,用于以IO地址空間的起始地址為起始位置start,采用空隙值space重新分割I(lǐng)O地址空間;所述間隙和數(shù)組構(gòu)造單元,用于構(gòu)造間隙和數(shù)組gapSum_table,以記錄從起始位置start開始每一空隙值space空間內(nèi)IO地址所對應(yīng)的間隙和,所述間隙和數(shù)組的大小為=Ngapsmi^1(;彡〇:^8611+8丨2611)/8口306,其中438611+8丨2611為最后一塊10塊的結(jié)束地址;所述10對象數(shù)組構(gòu)造單元,用于構(gòu)造IO對象數(shù)組,每一IO地址address映射一在所述IO對象數(shù)組中位于相應(yīng)數(shù)組索引index處的IO對象,所述IO對象數(shù)組的大小為所有IO塊大小之和;所述映射單元,用于根據(jù)構(gòu)造的間隙和數(shù)組以及IO對象數(shù)組,采用如下計算公式完成IO地址address到相應(yīng)數(shù)組索引index的計算,從而完成IO地址address到IO對象的快速映射:[0008]index=address_gapSum_table((address-start)/space)〇[0009]本發(fā)明的優(yōu)點在于:通過重新劃分IO地址空間,將搜索轉(zhuǎn)化為查表,用額外增加的間隙和數(shù)組實現(xiàn)較高的時間執(zhí)行效率,實現(xiàn)了由IO地址到IO對象的快速映射?!靖綀D說明】[0010]圖1,IO塊模型示意圖;[0011]圖2,IO地址空間與IO塊示意圖;[0012]圖3,IO地址空間與IO對象數(shù)組的映射關(guān)系示意圖;[0013]圖4,本發(fā)明所述的IO地址到IO對象快速映射方法的流程示意圖;[0014]圖5,本發(fā)明一實施例所示空隙值space的選取與間隔和填充示意圖;[0015]圖6,本發(fā)明另一實施例所示空隙值space的選取與間隔和填充示意圖;[0016]圖7,本發(fā)明一實施例所示重劃分IO地址空間示意圖;[0017]圖8,本發(fā)明一實施例所示IO地址到IO對象映射過程示意圖;[0018]圖9,本發(fā)明所述的IO地址到IO對象快速映射系統(tǒng)架構(gòu)示意圖?!揪唧w實施方式】[0019]下面結(jié)合附圖對本發(fā)明提供的IO地址到IO對象快速映射方法及系統(tǒng)做詳細(xì)說明。[0020]本發(fā)明是在gsMap算法基礎(chǔ)上提出了一種重新分割I(lǐng)O地址空間的方式,實現(xiàn)了由IO地址到IO對象的快速映射。為了清楚描述本發(fā)明,首先給出gsMap算法的簡單描述。gsMap算法構(gòu)造了一種0(1)時間復(fù)雜度的算法,用于快速由IO地址索引IO對象。gsMap算法僅僅通過簡單的算術(shù)運算與數(shù)組查表,完成0(1)時間復(fù)雜度IO地址到IO對象的查詢,其算法核心思想描述如下。[0021]-、實現(xiàn)IO地址到IO對象的0(1)查找[0022]構(gòu)造一個IO對象(10對象指針、引用等)數(shù)組,該IO對象數(shù)組大小為所有IO塊大小之和。同時采集所有IO塊的基本信息,基地址(baSei)、大小(siZei)、間隔(gaPi),其中下標(biāo)i表示第i個IO塊;其中間隔gaPi為當(dāng)前IO塊」地址(及其首位置)距離上一10塊_(卜1)結(jié)束地址(及其尾位置)中間的IO地址空間大小;記,第一塊IO塊下標(biāo)為0;第一塊IO塊_〇的間隔83仏取其相對0地址的距離,即其base。值。當(dāng)前第1頁1 2