欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

基于動(dòng)態(tài)二進(jìn)制重寫器架構(gòu)的輕量級(jí)服務(wù)的制作方法

文檔序號(hào):6350297閱讀:140來源:國知局
專利名稱:基于動(dòng)態(tài)二進(jìn)制重寫器架構(gòu)的輕量級(jí)服務(wù)的制作方法
技術(shù)領(lǐng)域
本發(fā)明涉及信息處理系統(tǒng),尤其是涉及程序執(zhí)行的監(jiān)控以及動(dòng)態(tài)二進(jìn)制重寫器 (rewriter)0
背景技術(shù)
當(dāng)監(jiān)控在客戶進(jìn)程中執(zhí)行的計(jì)算機(jī)應(yīng)用程序時(shí),監(jiān)控程序需要分析該客戶進(jìn)程以確定較頻繁執(zhí)行的代碼(即,熱代碼)的所處區(qū)域。當(dāng)應(yīng)用程序的初始源代碼不易被修改或重新編輯時(shí),這樣的監(jiān)控程序能存在于系統(tǒng)中。當(dāng)對監(jiān)控程序來說唯一可用的信息是運(yùn)行時(shí)間信息時(shí),定位以及構(gòu)建這些區(qū)域則是有挑戰(zhàn)的。眾所周知,利用動(dòng)態(tài)二進(jìn)制優(yōu)化器(DBO :dynamic binary optimizer),動(dòng)態(tài)二進(jìn)制重寫器(DBR dynamic binary rewriter)的一種特殊類型,來監(jiān)控程序的執(zhí)行并且優(yōu)化頻繁執(zhí)行代碼(即,熱代碼)以提高性能。公知的DBOs通常分為兩種類型,基于DBOs的解釋(Interpretation)和基于 DBOs 的采樣(Sampling)。基于 DBOs 的解釋平衡(leverage) 解釋程序(interpreter)或當(dāng)時(shí)的(just-in-time)編譯器以遵照程序的動(dòng)態(tài)指令。基于 DBOs的采樣移除解釋程序并利用基于技術(shù)的低成本采樣來標(biāo)識(shí)熱代碼。公知的DBOs為轉(zhuǎn)換(transformation)選擇熱跟蹤路徑(hot trace)。該路徑是執(zhí)行單一入口、多出口的跨進(jìn)程執(zhí)行路徑。除了操作在本機(jī)二進(jìn)制上而不需要任何靜態(tài)程序信息之外,DBR與管理運(yùn)行時(shí)間環(huán)境相類似。

發(fā)明內(nèi)容
根據(jù)本發(fā)明,基于DBR架構(gòu)的采樣被說明,該DBR架構(gòu)平衡(leverage)用于程序分析的獨(dú)立的內(nèi)核。該架構(gòu)包括硬件性能監(jiān)控器,作為獨(dú)立進(jìn)程執(zhí)行的DBR服務(wù)和在客戶進(jìn)程內(nèi)部執(zhí)行的輕量級(jí)DBR代理。該DBR服務(wù)聚集(aggregate)來自硬件性能監(jiān)控器的樣本,通過推測熱采樣周圍的程序結(jié)構(gòu)來執(zhí)行區(qū)域選擇,在所選擇的區(qū)域上執(zhí)行轉(zhuǎn)換(例如, 優(yōu)化),以及生成替換代碼。然后該DBR代理補(bǔ)丁客戶進(jìn)程以使用該替換代碼。DBR在本機(jī)二進(jìn)制上操作不需要之前的靜態(tài)信息。因此,DBR能轉(zhuǎn)換傳統(tǒng)的二進(jìn)制或資料庫,對資料庫來說,源代碼是不可用的。同時(shí),通過在運(yùn)行時(shí)的操作,DBR調(diào)整在編譯時(shí)不能用的轉(zhuǎn)換時(shí)機(jī)。例如,DBR可基于當(dāng)前程序的輸入行為來執(zhí)行轉(zhuǎn)換,調(diào)整代碼到特定下層結(jié)構(gòu)以及執(zhí)行跨動(dòng)態(tài)鏈接庫的轉(zhuǎn)換。


對本領(lǐng)域技術(shù)人員來說,通過參考附圖本發(fā)明應(yīng)該被更好的理解,其多個(gè)對象、特性和優(yōu)勢應(yīng)該更加明顯。在多個(gè)附圖中使用相同的附圖標(biāo)記表示相同或類似的元件。圖1顯示了具有動(dòng)態(tài)二進(jìn)制重寫器的計(jì)算機(jī)系統(tǒng)的系統(tǒng)框圖;圖2顯示了基于動(dòng)態(tài)二進(jìn)制重寫器架構(gòu)的服務(wù)的框圖3顯示了動(dòng)態(tài)二進(jìn)制重寫器的區(qū)域選擇操作的偽代碼表示;圖4顯示了在示例的客戶程序上執(zhí)行動(dòng)態(tài)二進(jìn)制重寫器的熱代碼發(fā)現(xiàn)操作的結(jié)果的框圖;圖5顯示了在示例的客戶程序上執(zhí)行動(dòng)態(tài)二進(jìn)制重寫器的代碼分區(qū)操作的結(jié)果的框圖;圖6顯示了在示例的客戶程序上執(zhí)行動(dòng)態(tài)二進(jìn)制重寫器的熱代碼調(diào)用內(nèi)聯(lián)操作的結(jié)果的框圖;圖7顯示了在示例的客戶程序上執(zhí)行動(dòng)態(tài)二進(jìn)制重寫器的補(bǔ)丁點(diǎn)選擇操作的結(jié)果的框圖;圖8顯示了在示例的客戶程序上執(zhí)行動(dòng)態(tài)二進(jìn)制重寫器的代碼精簡操作的結(jié)果的框圖;圖9顯示了在示例的客戶程序上執(zhí)行動(dòng)態(tài)二進(jìn)制重寫器的完整區(qū)域選擇操作的結(jié)果的框圖;圖10顯示了熱代碼發(fā)現(xiàn)操作的偽代碼表示;圖11顯示了代碼分區(qū)操作的偽代碼表示;圖12顯示了補(bǔ)丁點(diǎn)選擇操作的偽代碼表示;
具體實(shí)施例方式簡要的參照圖1,顯示了計(jì)算機(jī)系統(tǒng)100的系統(tǒng)框圖。計(jì)算機(jī)系統(tǒng)100包括處理器102;輸入/輸出(I/O)設(shè)備104,諸如顯示器,鍵盤,鼠標(biāo)以及相關(guān)的控制器(其中的每一個(gè)可遠(yuǎn)程的耦合到計(jì)算機(jī)系統(tǒng)100上);存儲(chǔ)器106,其包括易失性存儲(chǔ)器,例如隨機(jī)訪問存儲(chǔ)器(RAM :random access memory),和非易失性存儲(chǔ)器,例如硬盤和驅(qū)動(dòng)器;以及其他存儲(chǔ)設(shè)備108,例如光盤和驅(qū)動(dòng)器和其他存儲(chǔ)器設(shè)備;以及其他多個(gè)子系統(tǒng)110,所有這些設(shè)備通過一條或多條總線112互聯(lián)。該計(jì)算機(jī)系統(tǒng)進(jìn)一步包括動(dòng)態(tài)二進(jìn)制重寫器130,其存儲(chǔ)在存儲(chǔ)器106中并被處理器102 (或被處理器內(nèi)部的或者耦合到處理器上但與處理器分離(圖中未示)的內(nèi)核) 執(zhí)行。該動(dòng)態(tài)二進(jìn)制重寫器130與包含在處理器102中的硬件性能監(jiān)控器(HPM hardware performance monitor) 132相互協(xié)同工作。在一個(gè)實(shí)施例中,該硬件性能監(jiān)控器132支持基礎(chǔ)指令采樣(IBS instruction based sampling)?;A(chǔ)指令采樣是一種統(tǒng)計(jì)采樣技術(shù),其精確地將架構(gòu)事件歸類到特定指令中。在一些實(shí)施例中,IBS在每一個(gè)采樣間隔的取指階段(fetch stage)標(biāo)記指令。任何發(fā)生在標(biāo)記指令執(zhí)行過程中的架構(gòu)事件被匯報(bào)在HPM生成的樣本中。其他實(shí)施例可使用其他方法來將架構(gòu)事件歸類到特定指令并匯報(bào)這些事件。參考圖2,顯示了基于動(dòng)態(tài)二進(jìn)制重寫器架構(gòu)130的服務(wù)的框圖。尤其是,該DBR 架構(gòu)130使用基礎(chǔ)采樣方法?;趧?dòng)態(tài)二進(jìn)制重寫器架構(gòu)130的服務(wù)包括硬件性能監(jiān)控器 (HPM hardware performance monitor) 132,DBR 服務(wù)進(jìn)程 212 和輕量級(jí) DBR 代理 214。DBR 服務(wù)進(jìn)程212作為一個(gè)獨(dú)立的進(jìn)程來運(yùn)行并且輕量級(jí)DBR代理運(yùn)行在客戶進(jìn)程220中。HPM 132提供低成本的配置文件(profiling)。DBR服務(wù)進(jìn)程212聚集來自HPM 132的樣本并且分析該聚集的樣本以執(zhí)行區(qū)域選擇和替換代碼的生成。然后DBR代理214補(bǔ)丁(patch) 221 用戶進(jìn)程220以執(zhí)行替換代碼。通過將DBR服務(wù)進(jìn)程211與客戶進(jìn)程執(zhí)行的分離,該方法在執(zhí)行實(shí)質(zhì)分析的同時(shí)實(shí)現(xiàn)了對客戶進(jìn)程性能影響的最小化?;趧?dòng)態(tài)二進(jìn)制重寫器架構(gòu)200的服務(wù)利用采樣來收集關(guān)于客戶進(jìn)程執(zhí)行的多種類型的信息。在一些實(shí)施例中,基礎(chǔ)采樣指令用來收集上述信息。其他實(shí)施例可使用其他采樣方法。尤其是,多種類型的信息包括指令指針地址信息,分支定向信息,同時(shí)也可包括其他額外的信息,例如包括但不限于,裝載目標(biāo)地址信息。指令指針(IP instruction pointer)地址信息包括與樣本相關(guān)指令的地址。如果樣本指令是條件分支指令的話,那么分支定向信息則包括分支條件的值。如果采樣指令是裝載指令的話,則裝載目標(biāo)地址信息包括讀取存儲(chǔ)器位置的地址。DBR代理214是一個(gè)輕量級(jí)共享資料庫(library),其在客戶進(jìn)程中執(zhí)行。在系統(tǒng)啟動(dòng)時(shí),DBR代理214自動(dòng)地被裝載入客戶進(jìn)程地址空間中并被初始化。初始化過程在客戶進(jìn)程220中生成新的線程,DBR代理214在客戶進(jìn)程220中操作。DBR代理214配置與 DBR服務(wù)進(jìn)程212的通信連接并且分配容納替換代碼232的共享的存儲(chǔ)器空間230。當(dāng)管理該連接時(shí),DBR代理214響應(yīng)于諸如請求執(zhí)行替換代碼的補(bǔ)丁操作和不補(bǔ)丁操作的消息, 其中替換代碼已經(jīng)被DBR服務(wù)進(jìn)程212有向(directly)放置在共享的存儲(chǔ)器中。DBR代理214也執(zhí)行一些其他類型的任務(wù),這些任務(wù)包括掛起(hooking)可請求注意(attention) (例如,線程的生成和頁面保護(hù)改變)的資料庫調(diào)用和執(zhí)行錯(cuò)誤處理(例如,與DBR服務(wù)進(jìn)程212之間的通信的丟失)。DBR服務(wù)進(jìn)程212操作在不同于客戶進(jìn)程220的獨(dú)立的進(jìn)程中,并且在一些實(shí)施例中,DBR服務(wù)進(jìn)程212可在獨(dú)立的處理器內(nèi)核上(在多內(nèi)核系統(tǒng)上)或獨(dú)立的處理器上 (在多處理器系統(tǒng)上)執(zhí)行。通過將DBR服務(wù)進(jìn)程212與客戶進(jìn)程相分離,該DBR服務(wù)進(jìn)程212可與客戶進(jìn)程220并行地執(zhí)行。同時(shí),該分離最小化了存儲(chǔ)器利用率并避免了與客戶進(jìn)程共享資料庫。同時(shí),該分離也使得單一的DBR服務(wù)進(jìn)程能夠支持多客戶進(jìn)程并在整個(gè)系統(tǒng)范圍內(nèi)管理資源。DBR服務(wù)進(jìn)程212包括控制線程240,其管理所有與DBR代理的通信并協(xié)調(diào)DBR服務(wù)的各個(gè)方面。當(dāng)新的客戶進(jìn)程開始時(shí),相應(yīng)的DBR代理與DBR服務(wù)連接。在初始化連接中,控制線程獲得與客戶進(jìn)程以及由DBR代理生成的共享存儲(chǔ)區(qū)域232有關(guān)的信息??刂凭€程240匹配(map)共享存儲(chǔ)器232的地址空間到DBR服務(wù)進(jìn)程212的地址空間上。控制線程240可確定客戶進(jìn)程在執(zhí)行這樣一個(gè)程序,該程序不應(yīng)被修改并能使得DBR130的后續(xù)處理變得無效??刂凭€程240周期性地短期激活HPM132來收集配置文件的快照(snapshot)??刂凭€程240從HPM132處接收樣本數(shù)據(jù)并基于客戶進(jìn)程和IP地址對這些樣本進(jìn)行合并。通過僅短期地激活HPT132,大部分時(shí)間客戶進(jìn)程用來根據(jù)樣本采集開銷無負(fù)擔(dān)地執(zhí)行。通過調(diào)整周期的長度,DBR 132可在采樣所需的開銷和生成替換代碼帶來的效益之間進(jìn)行權(quán)衡。 通過間歇性地激活HPM 132,DBR 132可響應(yīng)于在客戶進(jìn)程程序執(zhí)行中可能產(chǎn)生的狀態(tài)過渡。在某些實(shí)施例中,采樣所需的開銷可以低到能夠允許連續(xù)使用HPM132而不僅僅是周期性地使用。DBR服務(wù)進(jìn)程212與包括由控制線程240生成的工作線程池242。在制作配置文件的快照后,控制線程240根據(jù)整個(gè)系統(tǒng)的負(fù)載來確定有多少個(gè)工作線程可并行調(diào)度。控制線程240也確定哪些客戶進(jìn)程應(yīng)該被修改(如果有的話)以及應(yīng)該以何種順序來進(jìn)行修
6改。然后控制線程240啟動(dòng)工作線程并等待這些線程在進(jìn)入睡眠前完成直到下一個(gè)快照間隔??刂凭€程240也可評估替換代碼的有效性并且如果合適的話則不進(jìn)行替換代碼的補(bǔ)丁操作。例如,控制線程240監(jiān)控快照中的樣本的比例,其中樣本在替換代碼中。一旦工作線程242已被激活,該工作線程則為特定的客戶進(jìn)程執(zhí)行區(qū)域選擇以及替換代碼的生成。工作線程242利用控制線程242提供的設(shè)備來訪問聚集的樣本,來讀取客戶進(jìn)程地址空間,來將替換代碼放置到客戶進(jìn)程的共享存儲(chǔ)器中并通知DBR代理214來安裝補(bǔ)丁。如果客戶進(jìn)程的地址匹配已經(jīng)發(fā)生這樣的變化,即與初始執(zhí)行區(qū)域選擇和替換代碼生成時(shí)的狀態(tài)不相兼容的話(例如,如果被引用的代碼或數(shù)據(jù)被包括在資料庫中,而這個(gè)資料庫已經(jīng)被卸載或頁面保護(hù)已經(jīng)更新因此上述代碼或數(shù)據(jù)不再能被讀取),則替換代碼不可用。DBR服務(wù)進(jìn)程212和DBR代理214協(xié)同工作以確保如果發(fā)生上面的不匹配情況時(shí),替換代碼不會(huì)被安裝或不執(zhí)行補(bǔ)丁操作。參考圖3,顯示了動(dòng)態(tài)二進(jìn)制重寫器130的區(qū)域選擇操作的偽代碼表示的示例。尤其是,DBR 130結(jié)合區(qū)域選擇操作300在沒有程序的任何前期靜態(tài)數(shù)據(jù)的情況下來標(biāo)識(shí)熱代碼區(qū)域。DBR區(qū)域選擇操作300將中間表示(IR intermediate representation)中的選擇結(jié)果表示為超級(jí)區(qū)域(SRs super-region)。超級(jí)區(qū)域可代表任意控制流,可包括來自多個(gè)嵌套循環(huán)的代碼并能跨越多進(jìn)程邊界。在超級(jí)區(qū)域內(nèi),IR將控制流表示為單一入口、 單一出口的定向非循環(huán)圖。上述非循環(huán)圖的節(jié)點(diǎn)為基礎(chǔ)程序塊(BBs :basic blocks),圖的邊緣為控制流邊緣 (CFEs control flow edges)。每一個(gè)SR包括多個(gè)基礎(chǔ)程序塊。尤其是,每一個(gè)SR包括開始基礎(chǔ)程序塊,結(jié)尾基礎(chǔ)程序塊和零個(gè)或多個(gè)中間基礎(chǔ)程序塊。開始基礎(chǔ)程序塊是提供通用入口點(diǎn)的偽(pseudo)基礎(chǔ)程序塊。離開開始程序塊的邊緣被叫做入口邊緣,該入口邊緣是偽(pseudo)邊緣,其代表進(jìn)入來自原始客戶代碼的替換代碼。結(jié)尾基礎(chǔ)程序塊是提供通用出口點(diǎn)的偽(pseudo)基礎(chǔ)程序塊。指向結(jié)尾塊的邊緣被叫做出口邊緣,該出口邊緣是偽 (pseudo)邊緣,其代表離開替換代碼并且繼續(xù)在原始客戶代碼中執(zhí)行操作。中間(body)基礎(chǔ)程序塊表示真實(shí)的程序代碼。轉(zhuǎn)換中間基礎(chǔ)程序塊來生成替換代碼。在由區(qū)域選擇操作300產(chǎn)生的最后的超級(jí)區(qū)域內(nèi),中間基礎(chǔ)程序塊形成單一的連接組件,其中入口邊緣定義了補(bǔ)丁點(diǎn)(即,在客戶程序中需要進(jìn)行補(bǔ)丁操作以輸入替換代碼的地址)。超級(jí)區(qū)域的單一入口和出口使得超級(jí)區(qū)域能夠遵循傳統(tǒng)編譯器的分析和優(yōu)化。通過執(zhí)行熱代碼發(fā)現(xiàn)操作啟動(dòng)區(qū)域選擇操作300。接下來,區(qū)域選擇操作300執(zhí)行代碼分區(qū)操作。然后,區(qū)域選擇操作執(zhí)行僅導(dǎo)向(fall through only)計(jì)算和熱調(diào)用內(nèi)聯(lián)操作。接下來,區(qū)域選擇操作300執(zhí)行補(bǔ)丁點(diǎn)選擇操作和代碼精簡(priming)操作。參考圖4,顯示了在示例的客戶程序上執(zhí)行二進(jìn)制動(dòng)態(tài)重寫器130的熱代碼發(fā)現(xiàn)操作的結(jié)果的框圖。熱代碼發(fā)現(xiàn)操作將聚集的HPM樣本作為熱樣本基礎(chǔ)程序塊的種子地址。熱代碼發(fā)現(xiàn)操作分解向前(forward)跟蹤控制流程的客戶代碼。通過冒險(xiǎn)(venturing) 遠(yuǎn)離熱基礎(chǔ)程序塊的特定數(shù)量的條件跳轉(zhuǎn)來限制發(fā)現(xiàn)操作。該結(jié)果是單一的超級(jí)區(qū)域,該超級(jí)區(qū)域包括成組的連接的基礎(chǔ)程序塊以表示在熱指令周圍的客戶程序結(jié)構(gòu)。參考圖5,顯示了在示例客戶程序上執(zhí)行動(dòng)態(tài)二進(jìn)制重寫器130的代碼分區(qū)操作的結(jié)果的框圖。代碼分區(qū)操作將基礎(chǔ)程序塊和單一的超級(jí)區(qū)域控制流圖的每個(gè)相連組件的控制流邊緣移動(dòng)到獨(dú)立的超級(jí)區(qū)域中。代碼分區(qū)操作也增加任何必須的入口和出口邊緣以確保開始?jí)K和結(jié)尾塊后支配該獨(dú)立超級(jí)區(qū)域的所有基礎(chǔ)程序塊。當(dāng)熱代碼發(fā)現(xiàn)操作在分解指令時(shí),熱代碼發(fā)現(xiàn)操作咨詢樣本聚合器并記錄在基礎(chǔ)程序塊上的采樣計(jì)數(shù)和生成的控制流邊緣。因?yàn)閮H導(dǎo)向其后繼者的基礎(chǔ)程序塊沒有明確的分支指令,因此沒有樣本可用于在控制流邊緣上記錄。相應(yīng)地,計(jì)數(shù)的近似值通過僅導(dǎo)向計(jì)算操作來計(jì)算(參見例如圖3),該計(jì)算操作來自非僅導(dǎo)向(non fall through only)控制流邊緣的計(jì)數(shù)。參考圖6,顯示了在示例客戶程序上執(zhí)行動(dòng)態(tài)二進(jìn)制重寫器130的熱代碼內(nèi)聯(lián)操作的結(jié)果的框圖。熱調(diào)用內(nèi)聯(lián)操作確定任何熱基礎(chǔ)程序塊是否包含調(diào)用指令以及是否有包括基礎(chǔ)程序塊的超級(jí)區(qū)域,該超級(jí)區(qū)域?qū)?yīng)來自返回指令可到達(dá)的目標(biāo)地址。如果這些條件滿足,則熱調(diào)用內(nèi)聯(lián)操作內(nèi)聯(lián)這些程序(routine)。參考圖7,顯示了在示例客戶程序上執(zhí)行動(dòng)態(tài)二進(jìn)制重寫器130的補(bǔ)丁點(diǎn)選擇操作的結(jié)果的框圖。不是所有被熱代碼發(fā)現(xiàn)操作所生成的位于超級(jí)區(qū)域中的基礎(chǔ)程序塊都可以被打補(bǔ)丁。DBR 130的補(bǔ)丁點(diǎn)選擇操作使用管理器和循環(huán)分析以確定每一個(gè)超級(jí)區(qū)域的好的補(bǔ)丁點(diǎn)組。參考圖8,顯示了在示例客戶程序上執(zhí)行動(dòng)態(tài)二進(jìn)制重寫器130的代碼精簡操作的結(jié)構(gòu)的框圖。通過代碼精簡操作,無循環(huán)的、被認(rèn)為范圍太小的或者無補(bǔ)丁點(diǎn)的超級(jí)區(qū)域被刪除。任何僅僅退出超級(jí)區(qū)域的冷結(jié)尾基礎(chǔ)程序塊,與任何由于補(bǔ)丁點(diǎn)選擇操作改變了入口邊緣而導(dǎo)致的不可到達(dá)的基礎(chǔ)程序塊一起都被刪除。參考圖9,顯示了在示例客戶程序上執(zhí)行的動(dòng)態(tài)二進(jìn)制重寫器130的完整區(qū)域選擇操作300的結(jié)果的框圖。生成的最終超級(jí)區(qū)域被顯示。參考圖10,顯示了熱代碼發(fā)現(xiàn)操作的偽代碼表示的一個(gè)實(shí)施例。在DBR130中, 客戶進(jìn)程可以以二進(jìn)制方式執(zhí)行,該二進(jìn)制方式去除了該客戶進(jìn)程中所有的靜態(tài)程序信息 (例如,標(biāo)記表和調(diào)試信息)。因此,熱代碼發(fā)現(xiàn)操作動(dòng)態(tài)地發(fā)現(xiàn)沒有這種靜態(tài)程序信息的程序的結(jié)構(gòu)。如果HPM 132不提供足夠信息的話,一些例如無向(indirect)調(diào)用,無向跳轉(zhuǎn)和返回的控制流則難于跟蹤。由于DBR 130不確定它們是否能夠返回,因此即使普通的調(diào)用也可能會(huì)出現(xiàn)困難(諸如調(diào)用類似退出的程序)。編譯器可將這些調(diào)用放置在緊跟程序的數(shù)據(jù)的程序代碼的尾部(諸如跳轉(zhuǎn)表)??勺冮L度指令組架構(gòu)(ISAs instruction set architectures),(諸如可以表示在類似Χ86處理器架構(gòu)的處理器架構(gòu)中)代表了另一種挑戰(zhàn)。給定已知的指令地址,DBR130 可僅向前分解??勺冮L度編碼使得辨別先前指令的開始處變得尤其困難。如果對控制流做出了不正確的假定,那么DBR130可停止在真實(shí)指令的中間的字節(jié)分解。相應(yīng)地,熱代碼發(fā)現(xiàn)操作探測到客戶代碼控制流在聚集的HPM采樣標(biāo)識(shí)的熱指令處開始。所有其生成的基礎(chǔ)程序塊和控制流邊緣被分配在單一的超級(jí)區(qū)域,first_sr,其在區(qū)域選擇操作期間被分配。由于熱代碼發(fā)現(xiàn)操作不斷的探測,操作追蹤到每一個(gè)客戶地址相關(guān)的信息,該客戶地址是或可能成為基礎(chǔ)程序塊的開始。熱代碼發(fā)現(xiàn)操作通過匹配數(shù)據(jù)結(jié)構(gòu)來實(shí)現(xiàn)上述追蹤,該匹配數(shù)據(jù)結(jié)構(gòu)包括用于每一個(gè)這樣的地址的獨(dú)立入口。如果地址已經(jīng)被成功的分解, 那么熱代碼發(fā)現(xiàn)操作記錄通過分解生成的基礎(chǔ)程序塊以及連同基礎(chǔ)程序塊的大小和指令邊界。如果地址還沒有被分解,則它的大小被臨時(shí)作為單一的字節(jié),并且已經(jīng)生成并以該地址為目標(biāo)的控制流邊緣組被記錄。這些控制流邊緣被初始化生成為到結(jié)尾基礎(chǔ)程序塊的出口邊緣,但是,當(dāng)或者如果地址已被分解的話,那么則更新控制流邊緣以將新的基礎(chǔ)程序塊作為它們的目標(biāo)。此外,如果已經(jīng)確定該地址不能被分解的話,則記錄該事實(shí)并且所有指向該地址的控制流邊緣都保留為出口邊緣。匹配結(jié)構(gòu)確保每一個(gè)指令都只被分解一次并且支持發(fā)現(xiàn)進(jìn)程的增量特性。為了管理不斷增加的探測,熱代碼發(fā)現(xiàn)操作使用工作列表,其包括了已經(jīng)被發(fā)現(xiàn)的基礎(chǔ)程序塊,這些基礎(chǔ)程序塊要求其后續(xù)的控制流被跟隨。當(dāng)首次生成基礎(chǔ)程序塊時(shí),該基礎(chǔ)程序塊通常被放置到工作列表中。通過查詢樣本聚集器的對應(yīng)于該熱樣本的地址組, 熱代碼發(fā)現(xiàn)操作開始執(zhí)行。對每一個(gè)這樣的地址來說,熱代碼發(fā)現(xiàn)操作通過調(diào)用ENSURE-BB 函數(shù)來確保存在基礎(chǔ)程序塊。由于基礎(chǔ)程序塊可包含具有多個(gè)樣本的多指令,Starts則作為false來通過。這表明基礎(chǔ)程序塊不需要在被請求的地址處開始,但是只需要包括該被請求的地址作為指令邊界。接下來,調(diào)用PROCESS-WORK-LIST函數(shù),該函數(shù)繼續(xù)從工作列表中提取基礎(chǔ)程序塊并處理該基礎(chǔ)程序塊直到工作列表為空。處理基礎(chǔ)程序塊包括確?;A(chǔ)程序塊的每一個(gè)后續(xù)控制流邊緣具有目標(biāo)基礎(chǔ)程序塊,其可反過來增加更多的基礎(chǔ)程序塊到工作列表中。為了控制(throttle)發(fā)現(xiàn)操作在熱代碼探測上能夠走多遠(yuǎn),用從熱代碼的跳轉(zhuǎn)數(shù) (jumps-from-hot)來標(biāo)識(shí)每一個(gè)基礎(chǔ)程序塊,該從熱代碼的跳轉(zhuǎn)數(shù)表示從熱樣本基礎(chǔ)程序跳轉(zhuǎn)到該基礎(chǔ)程序塊的條件跳轉(zhuǎn)數(shù)。包括熱樣本或是從這樣的基礎(chǔ)程序塊無條件可達(dá)的任何基礎(chǔ)程序塊,其從熱代碼的跳轉(zhuǎn)數(shù)的值為0。因此,對于該樣本基礎(chǔ)程序塊,jfh被宣布為 0。如果后繼控制流邊緣在jump-from-hot的極限(limit)之下則其只被跟隨。采樣的統(tǒng)計(jì)本質(zhì)可使得實(shí)際上是熱的代碼不能得到公正數(shù)量的樣本。這個(gè)問題對那些非常小的基礎(chǔ)程序塊是很明顯的。Jumps-from-hot機(jī)制緩解了這種缺陷。Jumps-from-hot機(jī)制同樣也用于使得短的但是較低頻率執(zhí)行的離開和回到熱代碼的路徑被包含在超級(jí)區(qū)域中。當(dāng)限制包含非熱代碼的數(shù)量時(shí),這避免了退出超級(jí)區(qū)域和喪失替換代碼的優(yōu)勢。如果后繼控制流邊緣是出口邊緣的話,那么調(diào)用函數(shù)ENSURE-BB用于控制流邊緣目標(biāo)地址。在這種情況下,基礎(chǔ)程序塊需要在該地址開始,因?yàn)樵椿A(chǔ)程序塊正在向該基礎(chǔ)塊移動(dòng)。否則在目標(biāo)基礎(chǔ)程序塊上調(diào)用函數(shù)SET-JUMPS-FR0M-H0T。如果提供的從熱代碼的跳轉(zhuǎn)數(shù)(jumps-from-hot)少于基礎(chǔ)程序塊的當(dāng)前值,則更新基礎(chǔ)程序塊并將其放回到工作列表中。這將允許較低的數(shù)值被傳遞給它的后繼者,這將導(dǎo)致探測那些之前已經(jīng)超過極限(limit)的控制流邊緣。那些事實(shí)上從未被執(zhí)行的跟隨(following)控制流路徑可使得不是指令的字節(jié)被分解。這些字節(jié)甚至可與當(dāng)前指令重疊,這些指令通過緊跟的其他一些控制流路徑是可到達(dá)的。為了處理這個(gè),匹配允許覆蓋相同地址的多入口存在(唯一的規(guī)則是它們具有不相交的指令邊界)。為了確保這一點(diǎn),當(dāng)分解指令時(shí),函數(shù)DISASSEMBLE-BASIC-BLOCK需要廉價(jià)地(cheaply)確定下一個(gè)指令的地址是否與當(dāng)前入口的指令邊界相交。通過位置數(shù)據(jù)結(jié)構(gòu)廉價(jià)地獲得該確定結(jié)果,該位置數(shù)據(jù)結(jié)構(gòu)記錄匹配中關(guān)于重疊入口的信息,如果有重疊入口的話,則具有一個(gè)包括該地址被定位在何處的范圍。除此之外,位置數(shù)據(jù)記錄重疊入口中的哪一個(gè)(如果有的話)將該地址作為它的指令邊界中的一個(gè)(由于不相交指令邊界的要求這樣的重疊入口可能最多有一個(gè))。這被叫做匹配入口(被熱代碼發(fā)現(xiàn)操作中的.entry標(biāo)識(shí)來訪問)。最后,這個(gè)位置數(shù)據(jù)也記錄關(guān)于后續(xù)入口的信息。后續(xù)入口是那個(gè)比位置數(shù)據(jù)的地址大的最小地址(同樣的,基于和上述相同的原因可能至多有一個(gè))。位置數(shù)據(jù)可廉價(jià)地(cheaply)超前到一個(gè)新的地址并漸增地 (incrementally)更新所有其記錄的信息。 為了便于計(jì)算地址的重疊入口,入口記錄它的父入口,最低地址的重疊入口(如果有的話)。這限制了應(yīng)該執(zhí)行的搜尋通常為零(通過函數(shù)GET-P0SITI0N),因?yàn)橹丿B代碼的條件很少見。相反地,當(dāng)生成或更新入口時(shí)(通過函數(shù)NEW-BB,MERGE-ENTRY,等等),通常提供包括必需的重疊入口的位置數(shù)據(jù),以廉價(jià)地(cheaply)計(jì)算父入口以及確定哪些其他入口也需要更新它們的父入口。 函數(shù)ENSURE-BB利用函數(shù)FIND-ENTRY來確定是否已經(jīng)有包括含addr的入口。如果函數(shù)FIND-ENTRY被請求來返回一個(gè)在該地址處starts的入口,那么函數(shù)FIND-ENTRY檢查函數(shù)GET-P0SITI0N返回的地址來確定是否有包含基礎(chǔ)程序塊的匹配入口(表明該地址已經(jīng)被分解)。如果是的話,那么如果該地址不是基礎(chǔ)程序塊的開始,則函數(shù)FIND-ENTRY將該入口和相關(guān)的基礎(chǔ)程序塊分離(split)。如果該基礎(chǔ)程序塊在工作列表上,則它能夠被交換為與分離的尾部相一致的新的基礎(chǔ)程序塊。這是因?yàn)榛A(chǔ)程序塊在工作列表上來探測它的后繼者,并且在分離基礎(chǔ)程序塊頂部的基礎(chǔ)程序塊僅具有僅導(dǎo)向(fall-through-only) 的控制流邊緣,并且它是現(xiàn)在具有需要探測的控制流的底部。檢查由FIND-ENTRY函數(shù)返回到ENSURE-BB函數(shù)的位置數(shù)據(jù)以確定該位置數(shù)據(jù)是否具有匹配入口,該匹配入口標(biāo)識(shí)當(dāng)前的入口已經(jīng)將地址作為指令邊緣。如果匹配入口已經(jīng)被標(biāo)記為不支持,那么在該地址處則不生成基礎(chǔ)程序塊。如果代表控制流邊緣的目標(biāo)激活,那么控制流邊緣將保留出口邊緣。如果匹配入口具有基礎(chǔ)程序塊,那么該入口已經(jīng)被分解并且不需要進(jìn)一步的動(dòng)作。然而,假如jfh較低的話,則更新基礎(chǔ)程序塊的從熱代碼的跳轉(zhuǎn)數(shù)(jumps-from-hot),在這種情況下,應(yīng)將基礎(chǔ)程序塊重新放置回工作列表中,這樣該較低的跳轉(zhuǎn)數(shù)可被傳遞下去。這時(shí)候,DBR 130知道沒有在addr處開始的指令已經(jīng)事先被分解(否則的話,將應(yīng)該有入口包含它)。因此,DBR130調(diào)用DISASSEMBLE-BB函數(shù),該函數(shù)分解指令并且提前 (advance)位置數(shù)據(jù)直到任何一個(gè)條件被滿足。尤其是,DBR 130分解指令并且提前位置數(shù)據(jù)直到DBR 130到達(dá)控制傳輸指令,遇到不支持或非法指令,或試圖訪問不存在或非只讀可執(zhí)行客戶存儲(chǔ)器。此外,要求一些指令在它們自己的基礎(chǔ)程序塊中。一個(gè)可選的實(shí)施例是,DBR 130分解指令并且提前位置數(shù)據(jù)直到提前位置數(shù)據(jù)之后,該位置數(shù)據(jù)具有一個(gè)匹配入口,表示DBR 130或者到達(dá)后續(xù)入口或者已經(jīng)與重疊入口的指令邊界同步化。另一個(gè)可選的實(shí)施例是,DBR 130分解指令并且提前位置直到DBR 130遇到作為補(bǔ)丁指令一部分的任意字節(jié)(通過參考共享存儲(chǔ)器管理來確定)。補(bǔ)丁只能到達(dá)一個(gè)位置,并且對DBR130來說,不需要為同一個(gè)客戶代碼生成多個(gè)版本的替換代碼,因?yàn)槟菍⒔档痛a本地化的有效性??刂凭€程可監(jiān)控替換代碼的有效性并且選擇移走它,以允許相關(guān)客戶代碼再次變成候選代碼。DISASSEMBLE-BB函數(shù)返回地址的位置數(shù)據(jù),該地址與控制流一起緊跟在基礎(chǔ)程序塊的最后指令之后,該控制流包括基礎(chǔ)程序塊(BB)的所有控制流目標(biāo)的地址,所有目標(biāo)的樣本計(jì)數(shù),指令的全部樣本計(jì)數(shù),第一指令和采樣第一可補(bǔ)丁指令的地址,以及指令邊界。
10
通過下述多種方法中的一個(gè)來確定控制流指令的目標(biāo)地址。(1)如果最后一條指令是條件跳轉(zhuǎn),那么函數(shù)DISASSEMBLE-BB利用HPM分支定向樣本信息。(2)對存儲(chǔ)器無向控制傳輸來說,函數(shù)DISASSEMBLE-BB利用文字(literal)地址或HPM裝載目標(biāo)地址樣本信息作為適當(dāng)?shù)牡刂罚缓瘮?shù)DISASSEMBLE-BB讀取這些位置以找到合適的目標(biāo)地址。(3)如果從只讀存儲(chǔ)器中裝載,則函數(shù)DISASSEMBLE-BB信任該地址,否則的話,函數(shù)DISASSEMBLE-BB 僅信任也具有樣本的地址,因?yàn)樵撝噶钜驯粓?zhí)行所以指令的位置可以被改變。(4)對非文本只讀存儲(chǔ)器的無向(indirect)控制傳輸來說,函數(shù)DISASSEMBLE-BB也包括偽不知名目標(biāo),其表示可能有其他目標(biāo)。(5)函數(shù)DISCOVER-REGISTER-INDIRECT-CODE處理無向寄存(register indirect) 0 (6)如果HPM 132在提供有向的目標(biāo)地址是可用的,則函數(shù) DISASSEMBLE-BB反而可利用該信息。需要注意的是,DISASSEMBLE-BB函數(shù)可能不能分解任何指令。在這種情況下, ENSURE-BB函數(shù)調(diào)用SET-UNSUPPORTED函數(shù),如果有需要的話,該SET-UNSURPORTED函數(shù)在匹配中生成入口并且將該入口標(biāo)記為不可支持的。任何附加的控制流邊緣都將保留出口邊緣。如果后續(xù)位置數(shù)據(jù)表示在該地址處有匹配入口,則函數(shù)ENSURE-BB調(diào)用函數(shù) CAN-MERGE-ENTRY來檢查匹配入口是否可被擴(kuò)展以也包括剛剛被分解的指令。如果后續(xù)入口是由來自湊巧位于真實(shí)的基礎(chǔ)程序塊中間的熱樣本來生成的話,則這種條件能發(fā)生。 如果下列條件為真的話,則合并可發(fā)生。(Dcontrolflow的值表示分解指令是以僅導(dǎo)向 (fall-through-only)為結(jié)束的。(2)后續(xù)位置有匹配入口。(3)匹配入口以后續(xù)位置的地址為開始。如果DISASSEMBLE-BB函數(shù)與重疊入口相同步的話,則上述條件就不是這樣的。 在那種情況下,重疊入口必須被切分,當(dāng)ENSURE-BB函數(shù)增加導(dǎo)向(fall-through)控制流邊緣時(shí),該重疊入口的切分將自動(dòng)地發(fā)生。(4)后續(xù)入口具有沒有前驅(qū)控制流邊緣的基礎(chǔ)程序塊并且后續(xù)入口沒有必須在它自己的基礎(chǔ)程序塊中的指令。沒有基礎(chǔ)程序塊的入口或者不被支持或者被作為待定的控制流邊緣的目標(biāo)而生成,因此該入口不能被合并。通過刪除由pos. entry的值(如果有的話)指定的匹配入口,MERGE-ENTRY函數(shù)執(zhí)行合并操作,更新后續(xù)入口和其相關(guān)的基礎(chǔ)程序塊的信息以在新的地址處啟動(dòng),并且返回更新的位置。否則,調(diào)用NEW-BB函數(shù)來生成基礎(chǔ)程序塊并且將該基礎(chǔ)程序塊與由 pos. entry (如果需要的話,則生成一個(gè))指定的匹配入口相關(guān)聯(lián)。在其他情況下,通過函數(shù)ENSURE-BB調(diào)用函數(shù)SET-JUMPS-FR0M-H0T以更新基礎(chǔ)程序塊的從熱代碼的跳轉(zhuǎn)數(shù) (jumps-from-hot)并且如果需要的話增加基礎(chǔ)程序塊到工作列表中(這對新的基礎(chǔ)程序塊來說將經(jīng)常發(fā)生因?yàn)槿笔∏闆r下新生成的基礎(chǔ)程序塊無限大)。如果由pos. entry的值指定的匹配入口具有任何待定的控制流邊緣,則更新所有控制流邊緣以連接到新生成的基礎(chǔ)程序塊上而不是作為出口邊緣。如果生成新的基礎(chǔ)程序塊的,則函數(shù)ENSURE-BB調(diào)用函數(shù)ADD-C0NTR0L-FL0W。這個(gè)函數(shù)為每一個(gè)基礎(chǔ)程序塊的目標(biāo)生成控制流邊緣。如果有一個(gè)具有目標(biāo)基礎(chǔ)程序塊的入口,則控制流邊緣簡單地與其連接;否則,生成到結(jié)尾基礎(chǔ)程序塊的出口控制流邊緣并且調(diào)用函數(shù)ADD-PENDING-CFE來增加到目標(biāo)地址的入口的待定的控制流邊緣的控制流邊緣,如果需要的的話則生成一個(gè)待定的控制流邊緣。連接任何未知的目標(biāo)到結(jié)尾基礎(chǔ)程序塊,因?yàn)槲粗繕?biāo)沒有地址,因此對其不生成入口。這些出口的控制流邊緣表示無向傳輸?shù)男蛄?,無向傳輸指向不同于其他控制流邊緣明確表示的目標(biāo)。為了利用INLINE-HOT-CALLS函數(shù),調(diào)用的控制流邊緣被特別表示。首先,DBR 130 總是假定調(diào)用指令會(huì)返回并且跟在控制流后繼續(xù)執(zhí)行。這保證了 DBR 130具有用于內(nèi)聯(lián)的完整的控制流圖。值得注意的是,上述假定可能通常不會(huì)成立(例如,到一個(gè)編譯器清楚永遠(yuǎn)不會(huì)返回的程序調(diào)用,或者以不標(biāo)準(zhǔn)的方式返回,例如通過調(diào)整返回地址以跳過被放置在調(diào)用之后的文本參數(shù)數(shù)據(jù)),但是函數(shù)MARK-UNPATCHABLE緩和了這個(gè)問題。其次,DBR 130將從調(diào)用到調(diào)用目標(biāo)基礎(chǔ)程序塊的控制流表示為兩個(gè)控制流邊緣;一個(gè)從調(diào)用到結(jié)尾基礎(chǔ)程序塊,一個(gè)從開始基礎(chǔ)程序塊到調(diào)用目標(biāo)基礎(chǔ)程序塊。這些規(guī)定允許PATITI0N-C0DE 函數(shù)為不同的程序?qū)⒋a隔離到獨(dú)立的超級(jí)區(qū)域中,其也有助于內(nèi)聯(lián)器。函數(shù)NEW-CFE和函數(shù)NEW-BB自動(dòng)的管理這個(gè)結(jié)果。當(dāng)函數(shù)NEW-CEF被請求來生成調(diào)用邊緣時(shí),如果調(diào)用目標(biāo)基礎(chǔ)程序塊已經(jīng)存在的話,則該函數(shù)立即生成入口控制流邊緣。否則,該函數(shù)標(biāo)識(shí)該入口作為調(diào)用目標(biāo)并且該入口的生成將會(huì)推遲直到(如果曾經(jīng)有的話)函數(shù)NEW-BB為該入口生成一個(gè)基礎(chǔ)程序塊。返回指令簡單的具有一個(gè)出口控制流邊緣。DBR 130將調(diào)用和返回指令放置在它自己的基礎(chǔ)程序塊中以使得函數(shù) INLINE-HOT-CALLS更加易于修改它們的控制流,將它們轉(zhuǎn)化為偽指令,或刪除它們。關(guān)于層疊的無向控制流的轉(zhuǎn)化的無向控制流指令來說也是同樣的。函數(shù)DISC0VER-INDIRECT-C0DE試圖為那些超出函數(shù)DISASSEMBLE-BB能找到的無向控制傳輸指令推斷目標(biāo)。函數(shù)DISC0VER-INDIRECT-C0DE通過檢查正在執(zhí)行的指令來進(jìn)行推斷,該指令包括位于正在執(zhí)行的基礎(chǔ)程序塊中的指令。因?yàn)樵谀莻€(gè)時(shí)候正在執(zhí)行的基礎(chǔ)程序塊可能還未被發(fā)現(xiàn),因此函數(shù)DISASSEMBLE-BB不能執(zhí)行檢查操作。如果函數(shù)DISC0VER-INDIRECT-C0DE成功的話,它傳遞目標(biāo)到函數(shù)ADD-C0NTR0L-FL0W。這會(huì)增加更多的基礎(chǔ)程序塊到工作列表中,這樣的話,函數(shù)DISC0VER-INDIRECT-FL0W調(diào)用函數(shù) PROCESS-WORK-LIST。反復(fù)地執(zhí)行上述兩步直到不再發(fā)現(xiàn)新的代碼。采用了多種策略來推斷無向控制傳輸指令的目標(biāo)。(1)對存儲(chǔ)器無向索引,檢查基礎(chǔ)程序塊和它的前驅(qū)基礎(chǔ)程序塊的指令以確定是否有被索引的跳轉(zhuǎn)表。這通過索引邊界檢查代碼來識(shí)別。也試圖確定跳轉(zhuǎn)表的地址(例如,訪問可使用絕對或IP相關(guān)基礎(chǔ)地址)。 得到了表的地址,索引范圍以及使用的訪問大小之后,則執(zhí)行檢查以確定該表是否在只讀存儲(chǔ)器中,以及如果是的話,則讀取內(nèi)容以獲得目標(biāo)地址。這種方法能處理由通用編譯器為轉(zhuǎn)換表生成的代碼慣用語(idiom)。( 對無向寄存器,檢查當(dāng)前正在執(zhí)行的指令,可能回到前驅(qū)基礎(chǔ)程序塊,以定位定義該寄存器的基礎(chǔ)程序塊。如果有載入指令,則(1)上面能被檢查,否則通過使用DISASSEMBLE-BB函數(shù)以相同的方式確定目標(biāo)。這種方法能處理由無向調(diào)用的通用編譯器生成的代碼慣用語(idiom)。如果提供有向分支目標(biāo)信息的HPM可用的話,則可使用HPM而不是上述策略。函數(shù)MARK-UNPATCHABLE確保補(bǔ)丁指令并不中斷包含在重疊指令中的字節(jié)。函數(shù) MRAK-UNPATCHABLE通過在匹配中移動(dòng)(walking the mapping)以及將所有入口相關(guān)的且與其他入口重疊的基礎(chǔ)程序快標(biāo)記作為不可補(bǔ)丁的來實(shí)現(xiàn)上述確保。不管其他入口是否具有基礎(chǔ)程序塊上述操作均被執(zhí)行,因?yàn)槿肟诘拇嬖诒硎疽呀?jīng)檢測到到上述地址的控制傳輸, 即使由于超出從熱代碼的跳轉(zhuǎn)數(shù)(jumps-from-hot)的限制而使得該入口是不被支持或不被探測的。父入口信息被用來檢測重疊入口。此外,函數(shù)MARK-UNPATCHABLE通過將基礎(chǔ)程序塊標(biāo)識(shí)為不可補(bǔ)丁的來防止事實(shí)上不是指令的字節(jié)進(jìn)行補(bǔ)丁操作,如果這些字節(jié)對已知已被執(zhí)行的基礎(chǔ)程序塊來說是不可到達(dá)的。這個(gè)操作貫穿控制流圖,從包括樣本指令的基礎(chǔ)程序塊開始,并且沿著后續(xù)的控制流邊緣繼續(xù)進(jìn)行。如前所述,忽略調(diào)用指令導(dǎo)向(fall-through)控制流邊緣,因?yàn)樵撜{(diào)用實(shí)際上可能并不返回。這個(gè)操作由函數(shù)DISASSEMBLE-BB提供的關(guān)于具有樣本的第一指令的信息以及通過其他入口操作借助來自指令邊緣信息的幫助維持所提供的信息來實(shí)現(xiàn)。在貫穿控制流圖前,上述操作將基礎(chǔ)程序塊分區(qū)為三組未執(zhí)行是指不包含樣本的基礎(chǔ)程序塊;部分執(zhí)行是指具有樣本但是該樣本不在第一指令處;以及全部執(zhí)行指的是具有在第一指令上的樣本。所有的部分和全部執(zhí)行基礎(chǔ)程序塊被增加到工作列表中。然后該操作處理在工作列表上的基礎(chǔ)程序塊。每一個(gè)基礎(chǔ)程序塊被這樣處理,將其從工作列表中移除并且跟著它的后繼控制流邊緣。當(dāng)跟隨調(diào)用控制流邊緣時(shí),相應(yīng)的調(diào)用目標(biāo)控制基礎(chǔ)塊被用作為目標(biāo)。然而,忽略調(diào)用導(dǎo)向(fall-through)控制流邊緣因?yàn)檫@個(gè)調(diào)用實(shí)際上可能不返回。對其他控制流邊緣來說,有向地使用該目標(biāo)。如果目標(biāo)在未執(zhí)行組內(nèi),由于該目標(biāo)最初從來不曾在工作列表中,因此將目標(biāo)移動(dòng)到執(zhí)行組中并加入到工作列表中;如果目標(biāo)在部分執(zhí)行組中,由于目前已經(jīng)知道該第一指令對其他基礎(chǔ)程序塊的執(zhí)行的指令是可到達(dá)的, 因此將該目標(biāo)移動(dòng)到執(zhí)行組中;否則,該目標(biāo)在執(zhí)行組中并可忽略該目標(biāo)。當(dāng)工作列表變空時(shí)(1)保留在未執(zhí)行組內(nèi)的所有基礎(chǔ)程序塊被標(biāo)識(shí)為不可補(bǔ)丁 ;并且( 恰好在具有樣本的第一指令之前所有在部分執(zhí)行組內(nèi)的基礎(chǔ)程序塊被拆分并且對應(yīng)于頂部的基礎(chǔ)程序塊被標(biāo)識(shí)為不可打補(bǔ)丁。一旦熱代碼發(fā)現(xiàn)操作完成,則刪除匹配結(jié)構(gòu)。圖11顯示了代碼分區(qū)操作的偽代碼表示。尤其是,此時(shí)的DBR130有一個(gè)大的超級(jí)區(qū)域,其包括一組基本程序塊,也包括DBR已經(jīng)發(fā)現(xiàn)的位于基礎(chǔ)程序塊之間的控制流邊緣。 這個(gè)超級(jí)區(qū)域?qū)⒃噲D包括多個(gè)獨(dú)立連接的子圖,多個(gè)子圖對應(yīng)于熱代碼的獨(dú)立區(qū)域。由于在子圖之間沒有控制流,DBR 130可以為子圖獨(dú)立地生成替換代碼,該操作將更加有效。獨(dú)立地處理子圖為每一個(gè)熱區(qū)域帶來代碼本地化的優(yōu)勢。這種處理也允許每一個(gè)熱區(qū)域被獨(dú)立地管理(例如,保持熱區(qū)域的同時(shí)對不再是熱點(diǎn)的區(qū)域不打補(bǔ)丁)。此外,代碼發(fā)現(xiàn)操作有意地表示調(diào)用使得用于不同程序的代碼將位于不相交的子圖中。如果探索法能獨(dú)立地在程序上操作的話,那么內(nèi)聯(lián)器探索法在估計(jì)內(nèi)聯(lián)執(zhí)行的數(shù)量上將更加有效?;谶@些理由,DBR 130將代碼分區(qū)到不相交的子圖中并且將每一個(gè)子圖放置到獨(dú)立的超級(jí)區(qū)域中。為了支持傳統(tǒng)編譯器的分析(例如,支配者和后支配者和循環(huán)嵌套), DBR 130也增加必須的入口和出口邊緣以確保所有的基礎(chǔ)程序塊從開始基礎(chǔ)程序塊都是可到達(dá)的,并且所有的基礎(chǔ)程序塊都可到達(dá)結(jié)尾基礎(chǔ)程序塊。尤其是,函數(shù) PARTITION-CODE 首先調(diào)用函數(shù) SEPARTE-CONNECTED-COMPONENTS,其標(biāo)識(shí)每一個(gè)連接的組件(CCs connected components)通過從種子基礎(chǔ)程序塊在前后控制流邊緣的貫穿以及忽略入口和出口控制流邊緣。移動(dòng)每一個(gè)連接的組件到它自己的超級(jí)區(qū)域中,并且連接相關(guān)的入口和出口邊緣到超級(jí)區(qū)域的開始和結(jié)尾基礎(chǔ)程序塊上。
然后,在每一個(gè)超級(jí)區(qū)域上調(diào)用函數(shù)CONNECT-TERMINALS。這個(gè)函數(shù)首先計(jì)算每一個(gè)超級(jí)區(qū)域的強(qiáng)連接組件(SCCs =Strongly connected components)。每一個(gè)基礎(chǔ)程序塊對
13其他基礎(chǔ)程序塊都是可到達(dá)的子圖是最大子圖。開始/結(jié)尾基礎(chǔ)程序塊通常在它們自己的強(qiáng)連接組件中,因?yàn)檫@些程序塊沒有前/后控制流邊緣,因此不能與其他基礎(chǔ)程序塊形成一個(gè)循環(huán)。由于強(qiáng)連接基礎(chǔ)程序塊是最大的,在強(qiáng)連接組件之間的控制流不能形成一個(gè)循環(huán)。因此,只有那些不具有來自其他強(qiáng)連接組件的控制流邊緣的強(qiáng)連接組件(不包括開始/ 結(jié)尾強(qiáng)連接組件)需要連接到開始基礎(chǔ)程序塊(任何其中的基礎(chǔ)程序塊都會(huì)這樣,因?yàn)樗鼈冃纬裳h(huán)),因?yàn)樗衅渌麖?qiáng)連接基礎(chǔ)程序塊對這些基礎(chǔ)程序塊都是可達(dá)的。同樣,出口邊緣只需要增加到那些不具有到其他強(qiáng)連接組件的控制流邊緣的強(qiáng)連接組件上(同樣,任何基礎(chǔ)程序塊都會(huì)這樣做)。之前存在的入口和出口邊緣將避免增加多余入口的風(fēng)險(xiǎn)。很少增加出口邊緣,因?yàn)槌隹谶吘壷挥性谌绻蛻舸a確實(shí)有無限循環(huán)的情況下才增加。僅僅控制傳輸指令提供HPM樣本信息,該樣本信息可用來設(shè)置控制流邊緣的計(jì)數(shù)。任何以非控制流傳輸指令結(jié)束的基礎(chǔ)程序塊都有一個(gè)僅導(dǎo)向(fall-through-only)控制流邊緣,該邊緣沒有樣本計(jì)數(shù)。函數(shù)COMPUTE-FALL-THROUGH-ONLY計(jì)算這些計(jì)數(shù)的近似值。該函數(shù)首先使得僅導(dǎo)向(fall-through-only)鏈包含最大路徑,該最大路徑僅包含僅導(dǎo)向(fall-through-only)的控制流邊緣。如果重疊代碼使得多個(gè)基礎(chǔ)程序塊導(dǎo)向到相同的基礎(chǔ)程序塊上,那么該重疊代碼任意選擇一個(gè)基礎(chǔ)程序塊而忽略其他基礎(chǔ)程序塊。由于可能只能導(dǎo)向(fall-through)到具有更高地址的指令,因此就不會(huì)有循環(huán)。對所有未將開始基礎(chǔ)程序塊作為前驅(qū)的鏈路,函數(shù)COMPUTE-FALL-THROUGH-ONLY 向前掃描通過一并加入前驅(qū)控制流邊緣計(jì)數(shù)和減去非導(dǎo)向(non-fall-through)后續(xù)控制流邊緣計(jì)數(shù)來推斷后續(xù)導(dǎo)向(fall-through)控制流邊緣計(jì)數(shù)。通過在最大鏈的頂部開始執(zhí)行,函數(shù)COMPUTE-FALL-THROUGH-ONLY確定任何導(dǎo)向(fall-through)前驅(qū)在使用之前已經(jīng)對其樣本計(jì)數(shù)進(jìn)行計(jì)算了。由于函數(shù)COMPUTE-FALL-THROUGH-ONLY不具備偽入口邊緣的樣本計(jì)數(shù),由此開始的鏈路不能向前掃描。取而代之的是,函數(shù)COMPUTE-FALL-THROUGH-ONLY向后掃描這些鏈路通過一并加入后繼控制流邊緣計(jì)數(shù)和減去非導(dǎo)向(non-fall-through)前驅(qū)控制流邊緣計(jì)數(shù)來推斷前驅(qū)導(dǎo)向(fall-through)控制流邊緣計(jì)數(shù)。同樣,在使用后續(xù)導(dǎo)向 (fall-through)前計(jì)算其計(jì)數(shù)。既有出口邊緣又有入口邊緣的鏈路則不是這樣操作的,函數(shù)COMPUTE-FALL-THROUGH-ONLY簡單地假定偽控制流邊緣的計(jì)數(shù)為0。函數(shù)INLINE-HOT-CALLS連接調(diào)用基礎(chǔ)程序塊到是調(diào)用目標(biāo)的基礎(chǔ)程序塊的“克隆”上。該“克隆”基礎(chǔ)程序塊從相關(guān)調(diào)用目標(biāo)基礎(chǔ)程序塊開始,并沿著控制流至返回基礎(chǔ)程序塊,其進(jìn)而被連接到初始調(diào)用基礎(chǔ)程序塊的后續(xù)程序塊上。由于超級(jí)區(qū)域僅包括熱代碼,因此內(nèi)聯(lián)器實(shí)際上執(zhí)行熱路徑的部分內(nèi)聯(lián)。在被調(diào)用的程序中任何出口邊緣成為克隆基礎(chǔ)程序塊中的出口邊緣。函數(shù)INLINE-HOT-CALLS用偽指令替換初始調(diào)用和內(nèi)聯(lián)返回指令,其中偽代碼隨后被內(nèi)聯(lián)調(diào)用返回地址轉(zhuǎn)換所擴(kuò)展。這個(gè)替換操作允許調(diào)用方法的優(yōu)化。在最壞的情況下, 一旦出口邊緣返回到執(zhí)行實(shí)際返回指令的客戶代碼上,內(nèi)聯(lián)調(diào)用返回地址轉(zhuǎn)換將初始客戶地址推入堆棧(stack)。即使內(nèi)聯(lián)調(diào)用返回地址轉(zhuǎn)換可以避免將返回地址推入堆棧(因?yàn)闆]有出口邊緣),內(nèi)聯(lián)調(diào)用返回地址轉(zhuǎn)換仍然需要在堆棧上為地址留一個(gè)空間(gap),除非內(nèi)聯(lián)調(diào)用返回地址轉(zhuǎn)換能相應(yīng)的改變在“克隆”基礎(chǔ)程序塊中所有堆棧訪問偏移值?!翱寺 被A(chǔ)程序塊實(shí)際上是特定調(diào)用站點(diǎn)的初始程序的特殊化實(shí)例。因此,僅在此種情況下是合法的,即如果該代碼實(shí)際上正在執(zhí)行被來自所述調(diào)用站點(diǎn)調(diào)用的程序,則客戶代碼有向地進(jìn)入該“克隆”基礎(chǔ)程序塊。由于補(bǔ)丁點(diǎn)關(guān)于調(diào)用上下文(context)是不可知的并且僅到替換代碼中的單一目的地,因此最安全的事情絕不是對內(nèi)聯(lián)基礎(chǔ)程序塊進(jìn)行補(bǔ)丁操作。通過標(biāo)識(shí)所有內(nèi)聯(lián)基礎(chǔ)程序塊為不可補(bǔ)丁來實(shí)現(xiàn)上述操作。值得注意的是, 內(nèi)聯(lián)操作并不刪除初始程序的基礎(chǔ)程序塊。因此,生成具有補(bǔ)丁點(diǎn)的程序的替換代碼版本, 并且如果內(nèi)聯(lián)的克隆基礎(chǔ)程序塊存在的話,則只有這個(gè)非特殊化的版本可被進(jìn)入。對無向調(diào)用來說,熱代碼發(fā)現(xiàn)操作為已知的目標(biāo)生成多個(gè)控制流邊緣。函數(shù) INLINE-HOT-CALLS正常地內(nèi)聯(lián)每一個(gè)控制流邊緣并且轉(zhuǎn)換調(diào)用到偽-調(diào)用-分配指令。這被轉(zhuǎn)化為一個(gè)測試的級(jí)聯(lián)以作為無向控制流轉(zhuǎn)換的一部分。函數(shù)INLINE-HOT-CALLS為所有超級(jí)區(qū)域計(jì)算調(diào)用圖并且迭代地內(nèi)聯(lián)滿足所有下述要求的調(diào)用站點(diǎn)(1)該調(diào)用基礎(chǔ)程序塊是熱的。函數(shù)INLINE-HOT-CALLS利用樣本計(jì)數(shù)來確定哪個(gè)調(diào)用是熱的并且值得內(nèi)聯(lián),并可內(nèi)聯(lián)包括非內(nèi)聯(lián)調(diào)用(可能因?yàn)樗麄冊诶渎窂缴?的程序。(2)包括調(diào)用基礎(chǔ)程序塊的程序依然在預(yù)計(jì)的探索內(nèi)。函數(shù)INLINE-HOT-CALLS 監(jiān)控執(zhí)行代碼擴(kuò)展的數(shù)量并且避免過量的代碼激增,該激增可能會(huì)反過來影響代碼本地化的優(yōu)勢或者溢出共享存儲(chǔ)器。在自身獨(dú)立的超級(jí)區(qū)域中包含獨(dú)立程序代碼使得監(jiān)控變得容易,每一個(gè)超級(jí)區(qū)域有其自己的預(yù)計(jì)代碼。( 調(diào)用目標(biāo)基礎(chǔ)程序塊是已知的(這不是無向調(diào)用的未知目標(biāo))。(4)從調(diào)用目標(biāo)基礎(chǔ)程序塊到至少一個(gè)返回基礎(chǔ)程序塊有路徑。如果函數(shù)INLINE-HOT-CALLS能夠?qū)ⅰ翱寺 被A(chǔ)程序塊連接回調(diào)用者處,這樣的話DBR 130可以發(fā)現(xiàn)完整的中間循環(huán),在這種情況下,該路徑是值得被內(nèi)聯(lián)的。具有多入口的程序被支持, 每一個(gè)調(diào)用目標(biāo)基礎(chǔ)程序塊可以有它自身的返回基礎(chǔ)程序塊組。( 被調(diào)用的程序不具有熱調(diào)用站點(diǎn)。從上面留下的程序中處理調(diào)用站點(diǎn)確保該程序僅被內(nèi)聯(lián)在它自身已經(jīng)執(zhí)行內(nèi)聯(lián)之后。這同樣也避免了內(nèi)聯(lián)(可能共有的)遞歸程序,該程序在調(diào)用圖中形成循環(huán)這樣使得調(diào)用再也不能離開。函數(shù)INLINE-HOT-CALLS縮放在“克隆”基礎(chǔ)程序塊以及控制流邊緣上的計(jì)數(shù)以與調(diào)用上的計(jì)數(shù)相一致。盡管并不必然地產(chǎn)生反映調(diào)用站點(diǎn)的實(shí)際行為的“克隆”計(jì)數(shù),但“克隆”計(jì)數(shù)是近似值。函數(shù)INLINE-HOT-CALLS從初始基礎(chǔ)程序塊和控制流邊緣中減去“克隆” 計(jì)數(shù),這樣產(chǎn)生的計(jì)數(shù)反映這些克隆基礎(chǔ)程序塊不再被這個(gè)調(diào)用站點(diǎn)所執(zhí)行??蛻暨M(jìn)程必須從不在替換代碼中執(zhí)行調(diào)用指令,因?yàn)楸煌频姆祷氐刂穼⒃谔鎿Q代碼內(nèi)。將返回地址推入替換代碼中將產(chǎn)生兩個(gè)問題客戶程序可使用例外機(jī)制,當(dāng)選擇處理程序(handler)時(shí),該例外機(jī)制監(jiān)視返回地址;以及替換代碼可不被補(bǔ)丁,并且找到和更新所有被推入的返回地址將是困難的。為了避免這一點(diǎn),函數(shù)INLINE-HOT-CALLS 刪除任何沒有內(nèi)聯(lián)的調(diào)用基礎(chǔ)程序塊。通過連接調(diào)用基礎(chǔ)程序塊的前驅(qū)控制流邊緣到結(jié)尾基礎(chǔ)程序塊,將上述控制流邊緣作為出口邊緣。函數(shù)INLINE-HOT-CALLS調(diào)用函數(shù) C0NNECT-TERMINALS來增加任何必要的入口控制流邊緣到調(diào)用基礎(chǔ)程序塊的后續(xù)基礎(chǔ)程序塊上。這可使得超級(jí)區(qū)域具有多個(gè)連接的組件,但這會(huì)由PRUNE-C0DE函數(shù)執(zhí)行的分區(qū)操作來處理。圖12顯示了補(bǔ)丁點(diǎn)選擇操作的偽代碼表示?;谔幚砑軜?gòu)的一定類型的結(jié)構(gòu)限制,不是客戶代碼中的每一個(gè)指令適于進(jìn)行補(bǔ)丁操作。例如,在x86處理器架構(gòu)中,5字節(jié)分支指令,包括1字節(jié)的操作碼,4字節(jié)的偏移值跟隨其后,該分支指令被用來轉(zhuǎn)換成替換代碼。因此,只有比5字節(jié)大的客戶指令可以被打補(bǔ)丁。補(bǔ)丁更小的指令可能會(huì)覆蓋不止一個(gè)指令;如果后續(xù)指令中的一個(gè)是分支的目標(biāo),那么補(bǔ)丁操作將會(huì)中斷程序。一個(gè)額外的難題是安全修正代碼的能力,該代碼正在同時(shí)被多處理器架構(gòu)上的其他處理器執(zhí)行。這一問題管理代碼系統(tǒng)(例如=Java虛擬機(jī))也會(huì)遇到并且解決方案是可用的,但是其解決方案會(huì)增加額外的限制到能夠被補(bǔ)丁的客戶指令上。對AMD x86處理器的解決方案是(1)如果字節(jié)沒有跨越對齊8字節(jié)邊界,那么就寫入。否則(2)寫2字節(jié)自分支指令到開始的兩個(gè)字節(jié)中。為了保證指令的原子性(atomic),寫操作不應(yīng)該跨越對齊 8字節(jié)邊界。( 等待以確保所有的處理器已經(jīng)完成它們的指令取指(fetch)階段,該取指階段在前一個(gè)寫操作之前已經(jīng)開始,因?yàn)槿≈鸽A段可提取初始指令。(4)寫接下來的3個(gè)字節(jié)(偏移的最后3字節(jié))。(5)用分支操作碼和第一個(gè)字節(jié)的偏移重寫初始的2字節(jié)。可以看到,這增加額外的限制到能夠在AMD類型的x86架構(gòu)下被打補(bǔ)丁的客戶指令上。其他架構(gòu)可能也有同樣的問題。值得注意的是,熱代碼由一旦進(jìn)入就執(zhí)行多次的循環(huán)組成。該循環(huán)可以很大并且跨越多個(gè)程序,但是直線代碼僅本身需要很長時(shí)間來執(zhí)行,因此不會(huì)是熱代碼。DBR 130發(fā)現(xiàn)操作生成超級(jí)區(qū)域(其允許任意的控制流),因此該操作能夠標(biāo)識(shí)完整的循環(huán)。然而,由于DBR 130僅探測熱代碼,因此,在循環(huán)內(nèi)部可能有這樣的路徑,其偶爾被執(zhí)行但是不是超級(jí)區(qū)域的一部分并且退回到客戶代碼。如果這樣的路徑試圖在循環(huán)的早期迭代中執(zhí)行,那么控制流可返回到客戶代碼,其中直到熱超級(jí)區(qū)域下次進(jìn)入該控制會(huì)被保留。因此,即使 DBR 130成功地標(biāo)識(shí)了循環(huán)的熱路徑,DBR 130也不會(huì)在超級(jí)區(qū)域中保留所有的循環(huán)迭代。 這個(gè)問題的解決方案是試圖在循環(huán)本體內(nèi)放置補(bǔ)丁,這樣的話,如果選擇這樣的路徑,則循環(huán)在下一個(gè)迭代被重新進(jìn)入。增加這樣的補(bǔ)丁到內(nèi)部循環(huán)中也可能傾向于限制轉(zhuǎn)換。最后,有兩種其他限制。首先,一些基礎(chǔ)程序塊將從不被打補(bǔ)丁(即,那些被內(nèi)聯(lián)器克隆的和以及那些被MARK-UNPATACHABLE值標(biāo)識(shí)的基礎(chǔ)程序塊)。其次,安裝補(bǔ)丁的成本通常相對較高(需要系統(tǒng)調(diào)用來改變頁面保護(hù)和清空緩存),因此對DBR 130來說,最小化每一個(gè)超級(jí)區(qū)域中補(bǔ)丁的數(shù)量是十分必需的。函數(shù)PATCH-POINT-SELECTION致力于解決這些挑戰(zhàn),通過改變?nèi)肟谶吘壍綇哪鼙谎a(bǔ)丁的指令開始的僅有參考基礎(chǔ)程序塊,并且找到覆蓋超級(jí)區(qū)域的循環(huán)的補(bǔ)丁的最小組。 由于內(nèi)聯(lián)器經(jīng)常需要具備完整程序的超級(jí)區(qū)域并且內(nèi)聯(lián)器通過補(bǔ)丁限制不被阻礙,因此 DBR 130在內(nèi)聯(lián)器操作之后執(zhí)行選擇操作。尤其是,函數(shù)PATCH-POINT-SELECTION通過計(jì)算循環(huán)嵌套結(jié)構(gòu)開始。然后確定補(bǔ)丁點(diǎn)組。該確定是在基礎(chǔ)程序塊的粒度基礎(chǔ)上被確定,對該補(bǔ)丁程序塊的第一指令是否實(shí)質(zhì)上被補(bǔ)丁是不敏感的。函數(shù)PATCH-POINT-SELECTION然后移動(dòng)舊的入口邊緣,切分任何未以補(bǔ)丁指令開始的補(bǔ)丁點(diǎn)基礎(chǔ)程序塊,并且生成到該基礎(chǔ)程序塊的新的入口邊緣。上述操作使得切分最小化以使得基礎(chǔ)程序塊達(dá)到其要求。概念上,函數(shù)PATCH-POINT-SELECTION確定可補(bǔ)丁基礎(chǔ)程序塊的完整組,并且通過移除從該組中其他基礎(chǔ)程序塊可到達(dá)的任何基礎(chǔ)程序塊(沒有必要將兩個(gè)都包含在組內(nèi))來最小化該組。函數(shù)PATCH-POINT-SELECTION可利用支配關(guān)系來確定可到達(dá)性。然后, 對循環(huán)來說,因?yàn)檠h(huán)的后邊緣確保該控制流能到達(dá)其后支配的同一個(gè)循環(huán)中的任何基礎(chǔ)程序塊,因此函數(shù)PATCH-POINT-SELECTION也可利用后支配者關(guān)系。因?yàn)檠a(bǔ)丁到內(nèi)部基礎(chǔ)程序塊可限制循環(huán)的潛在轉(zhuǎn)換,因此最好在外部循環(huán)中補(bǔ)丁基礎(chǔ)程序塊。為了達(dá)到這一點(diǎn), 函數(shù)PATCH-POINT-SELECTION層次化以從最外部循環(huán)開始來處理循環(huán)。循環(huán)層次結(jié)構(gòu)的根循環(huán)實(shí)際上并不是循環(huán),而是包含嵌套循環(huán)的位置標(biāo)志符。這允許由序列代碼開始的超級(jí)區(qū)域能被表示,其中序列代碼指向一系列循環(huán)。為此,當(dāng)處理時(shí)函數(shù)PATCH-POINT-SELECTION維持兩組補(bǔ)丁,即不含于循環(huán)中的根補(bǔ)丁和含于循環(huán)中的補(bǔ)丁。當(dāng)與根補(bǔ)丁進(jìn)行比較時(shí),后支配者(post-dominator)關(guān)系不被使用。PATCHES函數(shù)用來為單一循環(huán)標(biāo)識(shí)補(bǔ)丁基礎(chǔ)程序塊組。該函數(shù)首先為循環(huán)體確定候選基礎(chǔ)程序塊組。如果基礎(chǔ)程序塊是可補(bǔ)丁的并且從現(xiàn)有的根或者循環(huán)補(bǔ)丁均不可到達(dá)的話,則其為候選基礎(chǔ)程序塊。然后該函數(shù)通過如下操作來最小化該候選基礎(chǔ)程序塊組,成對地將每一個(gè)成員與每一個(gè)其他成員相比較,如果其中的一個(gè)是可從另一個(gè)到達(dá)的,則移除該基礎(chǔ)程序塊。通過以深度優(yōu)先的搜索順序處理循環(huán)基礎(chǔ)程序塊,函數(shù) PATCH-POINT-SELECTION在循環(huán)體中的兩個(gè)基礎(chǔ)程序塊中選擇較早的一個(gè),其中該循環(huán)體是互相可達(dá)的。因?yàn)槠渲腥魏我粋€(gè)基礎(chǔ)程序塊可能會(huì)滿足該條件,因此選擇哪一個(gè)基礎(chǔ)程序塊僅是一個(gè)直觀的選擇而不是嚴(yán)格限制的。可達(dá)性由函數(shù)SUPERCEDES來確定,該函數(shù)適當(dāng)?shù)厥褂弥湔吆秃笾湔咧潢P(guān)系。函數(shù)NESTED-PATCHES用來共同處理循環(huán)和其自上而下的嵌套循環(huán)。在無限遞歸到檢查其子循環(huán)之前,該函數(shù)檢查循環(huán)體的基礎(chǔ)程序塊。任何選擇的補(bǔ)丁與任何前面的循環(huán)補(bǔ)丁相聯(lián)合,因此該聯(lián)合可表示為代替其他嵌套循環(huán)的候選者。函數(shù)NESTD-PATECHES以 DFS順序來處理嵌套循環(huán),這樣的話較早的循環(huán)被選中。后期的嵌套循環(huán)可代替較早的嵌套循環(huán),但是DBR 130仍然希望在早期循環(huán)中具有補(bǔ)丁使得替換代碼被輸入到封閉的無補(bǔ)丁循環(huán)的第一個(gè)迭代中。函數(shù)PATCH-POINT-SELECTION實(shí)質(zhì)上與函數(shù)NESTED-PATCHES在根循環(huán)上所做的操作執(zhí)行相同的功能。該函數(shù)利用在根循環(huán)上的PATCHES函數(shù),但是規(guī)定僅利用支配者關(guān)系并將結(jié)果輸入到根補(bǔ)丁中。然后該函數(shù)為每一個(gè)它的嵌套子循環(huán)來使用NESTED-PATCHES 函數(shù)。然而,由于根循環(huán)不是循環(huán),該函數(shù)增加任何子循環(huán)補(bǔ)丁到根補(bǔ)丁中。補(bǔ)丁點(diǎn)操作致力于補(bǔ)丁外圍的循環(huán),這將有利于轉(zhuǎn)換。如果一個(gè)內(nèi)部循環(huán)試圖在早期迭代中跟蹤出口邊緣,那么在安裝替換代碼之后,嵌套循環(huán)將依然是熱的。由于熱代碼發(fā)現(xiàn)并不探測過去已經(jīng)安裝的補(bǔ)丁,該操作將試圖恰好找到嵌套循環(huán),該循環(huán)將被獨(dú)立地轉(zhuǎn)換。這個(gè)通用方法是可操作修改的(例如,通過分析來確定循環(huán)是否具有出口邊緣并處理向外的最深處的循環(huán))。在DBR 130區(qū)域選擇操作的最后一步中,函數(shù)PRUNE-CODE精簡已經(jīng)被發(fā)現(xiàn)的代碼。一個(gè)目標(biāo)是以熱代碼的超級(jí)區(qū)域?yàn)榻Y(jié)尾,其將有利于轉(zhuǎn)換。當(dāng)PATCH-POINT-SELECTION 函數(shù)改變?nèi)肟谶吘墪r(shí),函數(shù)PRUNE-C0DE移除任何會(huì)引起不可達(dá)的基礎(chǔ)程序塊。函數(shù)PRUNE-C0DE也精簡任何冷結(jié)尾基礎(chǔ)程序塊,這些基礎(chǔ)程序塊不能到達(dá)熱基礎(chǔ)程序塊而僅退出超級(jí)區(qū)域。這些基礎(chǔ)程序塊通常是熱代碼發(fā)現(xiàn)的從熱代碼跳轉(zhuǎn)數(shù) (jumps-from-hot)抑制機(jī)制的序列。由于這些基礎(chǔ)程序塊不是熱基礎(chǔ)程序塊,并經(jīng)常傳送回客戶代碼,因此,將其包含在超級(jí)區(qū)域中是無用的;反而,替換代碼可簡單的更早地傳回到客戶代碼。包括這些基礎(chǔ)程序塊為工作線程簡單地提供更多的工作并且,由于這些代碼將會(huì)被替換入冷代碼緩沖器中,這將導(dǎo)致所需要的額外的跳轉(zhuǎn)。通過將所有的冷基礎(chǔ)程序塊放置在冷組中以及將所有的熱基礎(chǔ)程序塊放置在工作列表中來標(biāo)識(shí)這些基礎(chǔ)程序塊。工作列表的基礎(chǔ)程序塊通過檢查所有它們的前驅(qū)來被執(zhí)行,那些位于冷組的基礎(chǔ)程序塊增加到工作列表中是由于它們能夠到達(dá)一個(gè)熱基礎(chǔ)程序塊。保留在冷組中的基礎(chǔ)程序塊被刪除,但是它們的來自基礎(chǔ)程序塊的前驅(qū)的任意控制流邊緣被變?yōu)槌隹谶吘壊⑶疫B接到結(jié)尾基礎(chǔ)程序塊上。基于內(nèi)聯(lián)器作出的控制流改變,補(bǔ)丁點(diǎn)選擇和冷結(jié)尾塊的移除,再次調(diào)用函數(shù) SEPARATE-CONNECTED-COMPONENTS將是有效的。這確保了每一個(gè)超級(jí)區(qū)域再一次僅包括單一的連接組件并因此將被后續(xù)的精簡操作獨(dú)立地檢查。不包含執(zhí)行多迭代的循環(huán)的超級(jí)區(qū)域可能不會(huì)從轉(zhuǎn)換中受益,因?yàn)檠a(bǔ)丁跳轉(zhuǎn)和跳轉(zhuǎn)回去的成本可能超出了任何轉(zhuǎn)換所帶來的收益。DBR 130檢查循環(huán)嵌套并利用控制流邊緣計(jì)數(shù)來估計(jì)循環(huán)被迭代的平均次數(shù)。沒有任何超出閾值的循環(huán)的超級(jí)區(qū)域被刪除(這包括完全不包括循環(huán)的超級(jí)區(qū)域)。最后,DBR 130也刪除那些非常小的超級(jí)區(qū)域,因?yàn)檫@些區(qū)域可能沒有足夠的能改進(jìn)的代碼。本發(fā)明也可適用于達(dá)到上面所描述和內(nèi)在隱含的優(yōu)勢。盡管本發(fā)明已經(jīng)被描述, 并通過參考本發(fā)明的特定實(shí)施例被定義,但是這樣的參考并不意味著對本發(fā)明進(jìn)行限制, 并且沒有這樣的限定被推斷。對本領(lǐng)域普通技術(shù)人員來說,本發(fā)明在形式和功能上能夠進(jìn)行較大的改變、變更或等同。此處所描述的實(shí)施例僅僅是示例性的,并不能作為限制本發(fā)明范圍的邊界。例如,應(yīng)該理解其他處理器架構(gòu)和HPM應(yīng)用也是可預(yù)計(jì)的。同樣,上述描述的實(shí)施例中包括執(zhí)行一定任務(wù)的軟件模塊。此處描述的軟件模塊包括代碼、程序(batch)和其他可執(zhí)行文件。該軟件模塊可被存儲(chǔ)在諸如硬盤驅(qū)動(dòng)等機(jī)器可讀或計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)上。根據(jù)本發(fā)明的實(shí)施例的用來存儲(chǔ)軟件模塊的存儲(chǔ)設(shè)備可以是磁盤、硬盤,或諸如CD-ROMs或CD-Rs等光盤。根據(jù)本發(fā)明的實(shí)施例的用來存儲(chǔ)固件或硬件模塊的存儲(chǔ)設(shè)備也可以包括半導(dǎo)體基存儲(chǔ)器,該存儲(chǔ)器可以永久的、可移除的、或遠(yuǎn)程的方式耦合到微處理器/存儲(chǔ)器系統(tǒng)上。因此,該模塊可被存儲(chǔ)到計(jì)算機(jī)系統(tǒng)的存儲(chǔ)器內(nèi)來配置計(jì)算機(jī)系統(tǒng)執(zhí)行該模塊的功能。其他新的和各種類型的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)可用來存儲(chǔ)此處討論的模塊。此外,本領(lǐng)域技術(shù)人員應(yīng)該意識(shí)到將功能分割成模塊是為了易于說明。 其他實(shí)施例可將多個(gè)單一模塊的功能合并到一個(gè)模塊中或增加可選的模塊功能的分解。例如,調(diào)用子模塊的軟件模塊可被分解使得每一個(gè)子模塊執(zhí)行它的功能并且有向傳遞控制到其他子模塊上。因此,本發(fā)明僅僅受限于以下權(quán)利要求書的精神和范圍,以及在所有方面的可認(rèn)知的等同方式。
權(quán)利要求
1.一種動(dòng)態(tài)二進(jìn)制重寫器(DBR)架構(gòu),包括硬件性能監(jiān)控器,該硬件性能監(jiān)控器對一個(gè)或多個(gè)客戶進(jìn)程進(jìn)行采樣; DBR服務(wù),該DBR服務(wù)作為獨(dú)立的進(jìn)程執(zhí)行;以及DBR代理,該DBR代理在該一個(gè)或多個(gè)客戶進(jìn)程內(nèi)部執(zhí)行,該DBR代理補(bǔ)丁一個(gè)或多個(gè)客戶進(jìn)程以使用替換代碼,該替換代碼在功能上與一個(gè)或多個(gè)客戶進(jìn)程對應(yīng)的初始代碼等同。
2.如權(quán)利要求1所述的DBR架構(gòu),其中該DBR服務(wù)聚集來自硬件性能監(jiān)控器的樣本,通過推斷熱樣本周圍的程序結(jié)構(gòu)來執(zhí)行區(qū)域選擇,在所選擇的區(qū)域上執(zhí)行區(qū)域轉(zhuǎn)換,以及生成該替換代碼。
3.如權(quán)利要求1所述的DBR架構(gòu),其中在該一個(gè)或多個(gè)客戶進(jìn)程的開始階段,該DBR代理自動(dòng)地被裝載到該一個(gè)或多個(gè)客戶進(jìn)程對應(yīng)的客戶進(jìn)程地址空間中并被初始化;以及,該DBR代理執(zhí)行替換代碼的補(bǔ)丁和不補(bǔ)丁操作并報(bào)告必要的系統(tǒng)資料庫用途而不在該一個(gè)或多個(gè)客戶進(jìn)程上施加大量額外的資源需求。
4.如權(quán)利要求1所述的DBR架構(gòu),其中從該一個(gè)或多個(gè)客戶進(jìn)程分離該DBR服務(wù)允許該DBR服務(wù)與該一個(gè)或多個(gè)客戶進(jìn)程并行地執(zhí)行,利用一個(gè)或多個(gè)獨(dú)立內(nèi)核,如果內(nèi)核可用的話,同時(shí)最小化存儲(chǔ)器利用率和避免與該一個(gè)或多個(gè)客戶進(jìn)程共享資料庫;以及,從該一個(gè)或多個(gè)客戶進(jìn)程中分離該DBR服務(wù)允許該DBR服務(wù)管理多客戶進(jìn)程以此來允許該DBR使用的系統(tǒng)資源被協(xié)調(diào)。
5.如權(quán)利要求1所述的DBR架構(gòu),其中從該一個(gè)或多個(gè)客戶進(jìn)程分離該DBR服務(wù)允許該DBR服務(wù)連續(xù)地操作拍攝被管理的該客戶進(jìn)程的快照以及如果必要的話移除或生成新的替換。
6.如權(quán)利要求1所述的DBR架構(gòu),其中該DBR服務(wù)包括DBR控制線程,該DBR控制線程管理與DBR代理的通信并協(xié)調(diào)該DBR 服務(wù)的各個(gè)方面。
7.如權(quán)利要求1所述的DBR架構(gòu),其中該DBR服務(wù)包括一個(gè)或多個(gè)工作線程,該工作線程執(zhí)行區(qū)域選擇操作,區(qū)域轉(zhuǎn)換操作和客戶進(jìn)程的替換代碼生成操作。
8.如權(quán)利要求1所述的DBR架構(gòu),其中該DBR服務(wù)進(jìn)一步包括在該一個(gè)或多個(gè)客戶進(jìn)程中確定熱代碼的系統(tǒng),該系統(tǒng)包括如下指令用于執(zhí)行熱代碼發(fā)現(xiàn)操作的指令; 用于執(zhí)行代碼分區(qū)的操作的指令; 用于執(zhí)行僅導(dǎo)向計(jì)算操作的指令; 用于執(zhí)行熱調(diào)用內(nèi)聯(lián)操作的指令; 用于執(zhí)行補(bǔ)丁點(diǎn)選擇操作的指令;以及用于執(zhí)行代碼精簡操作的指令。
9.如權(quán)利要求8所述的DBR架構(gòu),其中該熱代碼發(fā)現(xiàn)操作分解向前從已知的頻繁執(zhí)行的地址處開始的客戶進(jìn)程的代碼,而不需要任何靜態(tài)程序信息;以及,該客戶進(jìn)程的控制流被跟隨以提供包含任意控制流的控制流圖。
10.如權(quán)利要求9所述的DBR架構(gòu),其中該熱代碼發(fā)現(xiàn)操作利用入口匹配和記錄關(guān)于指令邊界和重疊代碼序列的信息的位置結(jié)構(gòu)來有效地檢測重疊代碼;以及,當(dāng)在可變長度指令架構(gòu)上執(zhí)行以及當(dāng)調(diào)用規(guī)范中包括從不返回的調(diào)用時(shí),產(chǎn)生重疊指令。
全文摘要
本發(fā)明涉及基于動(dòng)態(tài)二進(jìn)制重寫器(DBR)架構(gòu)的采樣,該DBR架構(gòu)為程序分析來平衡獨(dú)立的內(nèi)核。該架構(gòu)包括硬件性能監(jiān)控器,作為獨(dú)立進(jìn)程執(zhí)行的DBR服務(wù)以及執(zhí)行在客戶進(jìn)程內(nèi)部的輕量級(jí)DBR代理。該DBR服務(wù)聚集來自硬件性能監(jiān)控器的樣本,通過推斷熱樣本周邊的程序結(jié)構(gòu)來執(zhí)行區(qū)域選擇,在所選擇的區(qū)域上執(zhí)行轉(zhuǎn)換(例如,優(yōu)化),以及生成替換代碼。然后該DBR代理補(bǔ)丁客戶進(jìn)程以使用該替換代碼。
文檔編號(hào)G06F9/45GK102483700SQ201080038984
公開日2012年5月30日 申請日期2010年8月31日 優(yōu)先權(quán)日2009年9月2日
發(fā)明者史蒂芬·T·泰, 安東·切諾夫, 邁克爾·貝迪, 馬克·赫德格 申請人:超威半導(dǎo)體公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會(huì)獲得點(diǎn)贊!
1
罗山县| 分宜县| 临城县| 青冈县| 诸暨市| 鹿泉市| 谷城县| 沁水县| 五台县| 鹤壁市| 梁平县| 余姚市| 图片| 搜索| 鄂托克旗| 县级市| 怀远县| 怀柔区| 黑山县| 东至县| 托克逊县| 句容市| 高邑县| 祁东县| 吉首市| 古丈县| 河北省| 邹城市| 石嘴山市| 拜泉县| 独山县| 田东县| 民和| 麻城市| 奉节县| 安泽县| 乐亭县| 阿巴嘎旗| 青田县| 海安县| 凤城市|