国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

面向二進制代碼的軟錯誤故障注入器設(shè)計與實現(xiàn)

2021-10-15 12:48羅予東董守玲
計算機應(yīng)用與軟件 2021年10期
關(guān)鍵詞:寄存器存儲器應(yīng)用程序

羅予東 董守玲 陸 璐

1(嘉應(yīng)學(xué)院計算機學(xué)院 廣東 梅州 514015) 2(華南理工大學(xué)計算機科學(xué)與工程學(xué)院 廣東 廣州 510641)

0 引 言

隨著計算機硬件設(shè)備集成度的日益提高,現(xiàn)代系統(tǒng)中的硬件故障率也與日俱增。隨著芯片小型化和精密化的不斷發(fā)展,硬件設(shè)備更容易受到外部環(huán)境的影響。在使用過程中,主要的故障問題是軟錯誤:一些隨機位在存儲器和寄存器中翻轉(zhuǎn),導(dǎo)致軟件在計算時產(chǎn)生不可預(yù)知的錯誤。導(dǎo)致硬件設(shè)備電壓變化、存儲器位翻轉(zhuǎn)等軟錯誤的原因很多,對于高可靠性要求的軟件應(yīng)用,更加重視軟錯誤的影響。目前,硬件和系統(tǒng)級檢測與校正機制幾乎不能監(jiān)視某些軟錯誤。因此,研究軟錯誤對程序計算、程序控制的系統(tǒng)來說具有重要意義。

為了評估軟錯誤對系統(tǒng)的影響,通常的解決方案是手動生成故障并研究程序在故障下的行為及動作。通常的方法是采用軟件方式注入故障,除此以外還可以模擬外部環(huán)境(如輻射等)產(chǎn)生故障。由于在實際應(yīng)用中很少發(fā)生軟錯誤,因此需要提高軟錯誤的發(fā)生概率。實際上,模擬外部環(huán)境和直接修改硬件設(shè)備狀態(tài),代價是昂貴且不切實際的。研究表明在機器代碼級通過軟件故障注入技術(shù)更容易模擬硬件故障,并且具有較高的精度[1]。

在硬件模擬方法中,通過硬件模擬設(shè)備實現(xiàn)位翻轉(zhuǎn)。該方法可以提供機器代碼級的硬件故障注入,通過檢測和校正機制可以覆蓋整個注入過程。為了實現(xiàn)匯編代碼的故障注入結(jié)果與源代碼的映射,研究并設(shè)計了一種軟件故障注入方法,可以針對源代碼進行故障注入。目前,該技術(shù)面臨的主要挑戰(zhàn)是如何保證硬件錯誤能夠精確注入。原因是硬件錯誤可以分布在程序的任何地方和任何部分,而程序的某些組件無法提供源代碼。二進制故障注入技術(shù)可以有效解決上述兩個問題,能夠提供可操縱的、準確以及實用的故障注入方法,該方法通過直接修改二進制代碼來模擬硬件故障。常用的動態(tài)二進制故障檢測和注入工具包括PIN[2]和Valgrind[3],基于上述工具進行故障模擬的方法已被證明是準確和有效的。該故障注入技術(shù)主要是處理機器代碼級的硬件指令,對于源代碼級的故障注入更是準確和有效的。

為了研究軟錯誤對程序計算的實際影響,本文設(shè)計并開發(fā)了一種基于PIN的故障注入器。其主要特點是可以在特定位置檢測和修改應(yīng)用程序,包括各種寄存器和存儲器單元。實驗證明,該方法針對ECC保護存儲器和邏輯單元可以有效地模擬位翻轉(zhuǎn)。本文的主要貢獻是:

1) 本文設(shè)計的故障注入器基于PIN工具。介紹了故障注入器的設(shè)計和實現(xiàn),它能夠注入軟錯誤并分析運行結(jié)果,同時提供了一種將故障注入任何特定存儲器和寄存器的方法。

2) 研究并分析了基于PIN的故障注入器的準確性,評估了軟錯誤對應(yīng)用程序的影響。

1 國內(nèi)外主要研究工作

截至目前,軟錯誤對應(yīng)用性能和系統(tǒng)可靠性的影響越來越受到關(guān)注,故障注入技術(shù)作為研究軟錯誤對系統(tǒng)影響的一種常用方法,現(xiàn)已被廣泛采用。在故障注入技術(shù)領(lǐng)域,已經(jīng)提出了許多種方法,主要包括以下內(nèi)容。

1.1 軟錯誤分析的故障注入

硬件模擬方法通過在機器代碼級別使用硬件模擬器產(chǎn)生單粒子翻轉(zhuǎn),可以在系統(tǒng)架構(gòu)級別輕松注入故障,例如內(nèi)存和寄存器。研究人員采用了照射硬件的方法使存儲器單元在運行過程中引發(fā)位翻轉(zhuǎn)。Karlsson等[4]提出了一種通過使用來自acallfbtnhun-252源的重離子輻射將瞬態(tài)故障注入到集成芯片電路的方法。該方法模擬軟錯誤的基本原理實現(xiàn)了硬件單粒子翻轉(zhuǎn)。這種方法的缺點顯而易見,它們通常是無法控制且高成本的。另外,該方法可能會破壞目標系統(tǒng)。

基于軟件的故障注入技術(shù)是修改目標系統(tǒng)運行的硬件狀態(tài),分析在硬件故障發(fā)生時系統(tǒng)的運行情況。Guan等[5]設(shè)計并實現(xiàn)了軟錯誤故障注入框架SEFI,這是一種分析軟件對軟錯誤敏感性的工具。在不改變其他程序或共享VM的操作系統(tǒng)的情況下,可以通過使用開源虛擬機和處理器仿真器(QEMU)成功地實現(xiàn)在目標程序的邏輯操作中注入軟錯誤。但是該方法不支持對特定的寄存器和存儲器進行故障注入。

1.2 基于動態(tài)二進制插裝的故障注入

目前,比較流行的故障注入技術(shù)是動態(tài)地模擬應(yīng)用程序二進制文件中的軟錯誤。王承松[6]提出了一個名為BIFIT的故障注入工具,它基于二進制檢測來模擬位翻轉(zhuǎn)。BIFIT能夠在任何指定的位置注入錯誤,如應(yīng)用程序的全局或堆棧數(shù)據(jù)對象等。但是不支持對寄存器的注入操作,需要進一步的改進。Li等[7]開發(fā)了一種新的故障注入工具FIT-grind,它使用了Valgrind提供的動態(tài)二進制插裝。該工具從底層硬件架構(gòu)進行抽象,并將故障注入到Valgrind提供的人工架構(gòu)中。但是其不支持軟件在動態(tài)運行過程中的注入操作,所以需要增強故障注入的靈活性。

2 故障模型和動態(tài)二進制檢測框架

2.1 故障模型

本文主要考慮針對處理器和存儲器單元發(fā)生的單粒子翻轉(zhuǎn)錯誤。該錯誤一般是由外部環(huán)境輻射引起的。通常每個應(yīng)用程序運行過程中僅產(chǎn)生一個bit位的翻轉(zhuǎn)錯誤,根據(jù)研究表明,在短時間內(nèi)產(chǎn)生多位翻轉(zhuǎn)的概率非常低。在選擇注入故障的指令時,采用隨機均勻分布。例如,如果應(yīng)用程序選擇與插裝條件匹配的N條指令,則指令注入故障的概率為1/N。由于寄存器值和存儲器單元內(nèi)容具有多個位,因此采用隨機均勻分布的方法選擇翻轉(zhuǎn)故障的位[8]。

依據(jù)軟錯誤模擬的相關(guān)研究,將實驗結(jié)果分為以下幾類,具體定義內(nèi)容如下。

定義1良性故障——故障注入的程序輸出與原始執(zhí)行結(jié)果相同。其主要原因是可以通過后續(xù)的程序計算來覆蓋故障數(shù)據(jù)。因此,故障不會擴散到應(yīng)用程序中,也不會影響其運行結(jié)果。

定義2硬件異?!捎诠收献⑷胍鸬挠布葳寤虍惓#涘e誤可能會導(dǎo)致應(yīng)用程序崩潰。

定義3內(nèi)存捕獲——注入的錯誤被內(nèi)置檢測機制捕獲。

定義4靜默數(shù)據(jù)損壞(SDC)——故障注入程序的輸出與原始程序成功執(zhí)行后的結(jié)果不一致,通常被認為是危險故障,因為它們在程序執(zhí)行期間無法被檢測到,但確實會影響其結(jié)果。

定義5應(yīng)用程序掛起(“超時”)——如果應(yīng)用程序沒有在規(guī)定的時間內(nèi)終止,則定義為超時。通常在不執(zhí)行故障注入的情況下運行程序以獲得基準時間[9]。

2.2 PIN

PIN是由英特爾設(shè)計的程序分析框架,它在執(zhí)行Linux應(yīng)用程序過程中進行二進制插裝,具有可移植性、透明性、高效率和健壯性,采用C/C++編程實現(xiàn),提供了一個支持多種體系結(jié)構(gòu)的插裝平臺,實現(xiàn)了一種程序分析器和故障注入器[10]。PIN配備了豐富的API,抽象出架構(gòu)的具體細節(jié),可以編寫便攜式插裝工具。PIN采用即時(JIT)編譯的方法插入和優(yōu)化代碼,提供了一種高效的檢測機制,該檢測機制可以在程序運行過程中探測代碼,從而使得PIN比靜態(tài)檢測或代碼修補的系統(tǒng)工具更強大。

3 軟錯誤故障注入器

軟錯誤故障注入器是一種基于二進制檢測的故障注入工具,可在機器代碼級注入硬件故障。該注入器使用PIN(動態(tài)二進制插裝和分析工具)模擬存儲器和各種寄存器中的單粒子翻轉(zhuǎn)。故障注入的目標是可執(zhí)行的二進制程序,可以在沒有源代碼的情況下模擬軟錯誤,其故障注入方法不受編程語言的影響[11]。

3.1 軟錯誤故障注入器概述

圖1給出了故障注入器的架構(gòu)設(shè)計,主要由三個模塊組成:控制器、監(jiān)視器和故障注入模塊。使用動態(tài)檢測工具可以在應(yīng)用程序執(zhí)行期間將故障注入到存儲器和寄存器的隨機位置。為了提高插裝性能,設(shè)計并開發(fā)了一個收集指令信息的監(jiān)視器。為了協(xié)調(diào)預(yù)處理和插裝功能,采用了基于Python腳本的控制器。控制器不僅僅是提供給用戶直接使用的組件,而且還是整個故障注入過程的控制器。在控制器的協(xié)同下,注入器使用預(yù)處理的指令信息執(zhí)行故障注入操作;故障注入模塊負責(zé)軟錯誤的模擬與實現(xiàn)。圖2為故障注入過程,其整個過程如下:

1) 用戶控制器,該控制器通過界面的方式提供給用戶,配置實驗的相關(guān)參數(shù)信息。

2) 控制器激活目標系統(tǒng)和監(jiān)視器并執(zhí)行。監(jiān)視器獲取有關(guān)故障注入點的相關(guān)數(shù)據(jù)。故障注入點為程序監(jiān)視模式下的具體實例,故障信息被傳遞到故障注入器中,注入器激活故障并注入到與控制器相連的進程中。

3) 故障注入器啟動后,將故障注入到二進制程序中。故障注入產(chǎn)生的數(shù)據(jù)傳遞給控制器,然后存儲在文件中以供離線分析。在注入操作完成并且從目標系統(tǒng)收集了所有數(shù)據(jù)之后,控制器退出實驗并關(guān)閉監(jiān)視器。

圖1 故障注入器架構(gòu)設(shè)計

圖2 故障注入過程

3.2 監(jiān)視器

監(jiān)視器是故障注入器的一個模塊,用于判斷在測試過程中注入軟件故障的位置。該模塊能夠收集所有可能的故障信息以及相關(guān)的故障模式,并為故障注入器提供該信息。在注入操作之前監(jiān)視器獲取了指令的詳細信息進而加速故障注入過程。應(yīng)用程序的分析過程不會影響程序?qū)收献⑷氲捻憫?yīng)。事實上,監(jiān)視器為所有可能的故障位置提供了特定插裝操作的相關(guān)故障模式??刂破鲉涌蓤?zhí)行程序和監(jiān)視器。后者識別某些指令模式并將分析信息存儲到文件中作為故障注入點。當應(yīng)用程序到達指定的執(zhí)行點并匹配輸入的分析信息時,故障注入模塊立即注入故障以模擬bit位翻轉(zhuǎn)。故障注入操作將使不相關(guān)的代碼快速運行。通過在指定的故障注入執(zhí)行點之前注入故障和插裝,可以精確地提高插裝性能。

3.3 控制器

控制器為用戶與故障注入器之間的接口,通過用戶配置實現(xiàn)故障注入操作。采用Python腳本的方式實現(xiàn)控制器信息配置,故障支持多次注入,用戶可以靈活地設(shè)計各種故障實例集。控制器將用戶設(shè)置的參數(shù)傳遞給監(jiān)視器,并協(xié)調(diào)監(jiān)視器和故障注入模塊之間的工作。

控制器負責(zé)收集故障注入操作產(chǎn)生的相關(guān)數(shù)據(jù),包括應(yīng)用狀態(tài)、執(zhí)行輸出和故障注入信息。此外,如果應(yīng)用程序運行很長時間,控制腳本將中止應(yīng)用程序執(zhí)行。如果執(zhí)行時間超過設(shè)定值,故障注入器將可執(zhí)行程序狀態(tài)定義為超時。根據(jù)之前的故障注入研究成果,超時時間系數(shù)設(shè)置為10,表示故障注入下目標應(yīng)用程序的執(zhí)行時間比無錯誤執(zhí)行時間延長了10倍。

3.4 故障注入模塊

故障注入模塊是整個系統(tǒng)的關(guān)鍵模塊。通過監(jiān)視器和控制器的協(xié)調(diào),故障注入器可以在任何執(zhí)行位置產(chǎn)生位翻轉(zhuǎn)錯誤。故障注入模塊應(yīng)能夠識別故障注入點,通過PIN的API識別與用戶配置匹配的特定故障模式。PIN提供了一種通過允許分析例程覆蓋應(yīng)用程序寄存器和應(yīng)用程序內(nèi)存來修改程序行為的方法,這種機制可以模擬寄存器和存儲器的位翻轉(zhuǎn)。對于寄存器,可以通過確定操作數(shù)是否帶PIN助手的寄存器來選擇限定指令,同時,可以指定寄存器的類型,包括數(shù)據(jù)寄存器、標志寄存器等。對于存儲器借助PIN的功能接口判斷是否進行加載或存儲操作[12]。

4 實驗與結(jié)果分析

4.1 典型應(yīng)用程序的選取

實驗所選應(yīng)用程序代表了典型的應(yīng)用程序。本文中使用的目標應(yīng)用程序主要包括:

1) 多線程程序應(yīng)用。多線程協(xié)同工作,共享存儲資源,線程之間通過鎖控制不同順序的執(zhí)行過程。要求訪問全局存儲線程安全的工具或手段能夠與其他線程協(xié)調(diào)。

2) 預(yù)測算法?;诰€性關(guān)系數(shù)據(jù)的算法,通過讀寫存儲器完成數(shù)據(jù)的訪問,通過寄存器保存中間過程,完成復(fù)雜的預(yù)測式計算。

3) 浮點計算。通過浮點寄存器傳遞參數(shù),完成浮點計算,輸出計算結(jié)果到其他應(yīng)用。

4.2 實驗方法

本節(jié)主要介紹了故障注入實驗的結(jié)果。實驗環(huán)境的操作系統(tǒng)是Linux(x64),在該環(huán)境中下載PIN 3.7并進行二次開發(fā)以實現(xiàn)功能擴展。在選擇注入故障的模式時,采用隨機均勻分布的方法。

通過實驗評估軟錯誤對應(yīng)用程序執(zhí)行時間和應(yīng)用程序輸出結(jié)果的影響。為了評估故障注入對執(zhí)行時間的影響,定義了三個執(zhí)行時間。T0為最初的程序執(zhí)行時間,作為基準時間;T1為故障注入后的執(zhí)行時間;T2為在沒有故障注入但是使用插裝的情況下的執(zhí)行時間。將故障注入的性能影響定義為P。其計算公式如下:

P=(T1-T2)/T0

對于故障注入操作,根據(jù)監(jiān)視器的指令信息隨機選擇800條指令,選擇一個隨機均勻分布的指令來隨機翻轉(zhuǎn)。對于每個應(yīng)用程序,模擬寄存器和存儲器的單粒子翻轉(zhuǎn),分別執(zhí)行三次故障注入,觀察整個故障注入期間應(yīng)用程序的執(zhí)行時間,并評估軟錯誤對其性能的影響。

4.3 實驗結(jié)果

在同一應(yīng)用程序的不同位置注入故障會對執(zhí)行時間產(chǎn)生不同的影響。圖3顯示了軟錯誤對多線程應(yīng)用程序執(zhí)行時間的影響,同時可以看到寄存器故障注入下的執(zhí)行時間明顯長于內(nèi)存故障注入時的執(zhí)行時間,這說明應(yīng)用程序的寄存器單元對軟錯誤故障特別敏感。

圖3 多線程應(yīng)用程序的擴展執(zhí)行時間

圖4說明了在預(yù)測算法應(yīng)用程序中,寄存器故障的執(zhí)行時間明顯比存儲器的執(zhí)行時間延長,這表明應(yīng)用程序的寄存器故障對軟錯誤故障響應(yīng)明顯。而在寄存器故障方面性能損耗較小。圖5說明了內(nèi)存故障的浮點計算應(yīng)用程序的執(zhí)行時間比寄存器故障的應(yīng)用程序執(zhí)行時間更為敏感。

圖4 預(yù)測算法應(yīng)用程序的擴展執(zhí)行時間

圖5 浮點計算應(yīng)用程序的擴展執(zhí)行時間

實驗結(jié)果表明,應(yīng)用程序執(zhí)行時間對軟錯誤非常敏感。此外,還可以得出結(jié)論,寄存器中的軟錯誤對性能的影響更大,因為寄存器錯誤注入會顯著延長執(zhí)行時間。在預(yù)測算法應(yīng)用程序中,可以看到執(zhí)行時間增加了幾倍,這表明寄存器中的數(shù)據(jù)一旦被破壞,就會導(dǎo)致算法收斂達到預(yù)期精度的時間延長。同時在某些情況下,可以觀察到執(zhí)行時間的增加取決于某些特殊的故障注入點。

圖6和圖7分別比較了三個目標應(yīng)用程序之間的故障注入結(jié)果對性能的影響,通過結(jié)果可以看出預(yù)測算法應(yīng)用程序最容易受到軟錯誤對程序性能的影響。這主要可能是預(yù)測算法需要通過計算收斂到預(yù)期的精度,從而導(dǎo)致預(yù)測的時間增加。

圖6 寄存器故障注入執(zhí)行時間

圖7 存儲器故障注入執(zhí)行時間

圖8和圖9分別給出了目標應(yīng)用程序的寄存器和存儲器的故障注入結(jié)果,錯誤行為也因不同的應(yīng)用程序而不同。從圖9中可以看到寄存器故障的浮點計算應(yīng)用成功率高于其他應(yīng)用,統(tǒng)計上證明了該應(yīng)用對寄存器故障不敏感。內(nèi)存捕獲僅在多線程應(yīng)用程序上發(fā)生,因為它在此應(yīng)用程序上有自己的檢測機制。無論是在寄存器還是在內(nèi)存中,類型SDC錯誤在預(yù)測算法應(yīng)用程序中比在其他應(yīng)用程序中更為常見,這表明此類故障對應(yīng)用程序的輸出具有更大影響。良性故障的成功率在浮點計算中比在其他應(yīng)用程序中更為常見;硬件異常在多線程應(yīng)用中比在其他應(yīng)用程序中更為常見;超時在預(yù)測算法中比在其他應(yīng)用程序中更為常見。通過評估軟錯誤對應(yīng)用程序的影響,本文發(fā)現(xiàn)如果應(yīng)用程序?qū)M件敏感,應(yīng)用程序執(zhí)行時間和應(yīng)用程序輸出幾乎會同時受到影響。

圖8 存儲器故障注入結(jié)果統(tǒng)計

圖9 寄存器故障注入結(jié)果統(tǒng)計

4.4 軟錯誤結(jié)果分析

根據(jù)4.3節(jié)中的實驗結(jié)果,分析故障注入器的實驗結(jié)果。如圖3所示,可以看出寄存器故障注入下的應(yīng)用程序其執(zhí)行時間明顯長于內(nèi)存故障浮點計算應(yīng)用程序。為了探究軟錯誤對各種寄存器的影響,將故障分別注入通用寄存器,臨時寄存器和標志寄存器,以分析故障注入對特定寄存器的影響。

每個故障注入都針對以下三種寄存器之一:

1) 1x86-64 ISA中的16個64位通用寄存器(RAX,RBX,RCX,RDX,RDI,RSI,RSP,RBP,R8,R9,R10,R11,R12,R13,R14,R15)。

2) 一個64位標志寄存器。

3) 32個64位臨時寄存器,代表寄存器的高位或低位。

圖10顯示了多線程應(yīng)用中的故障注入崩潰率。臨時寄存器只延長執(zhí)行時間,不會產(chǎn)生崩潰。R8寄存器和R15寄存器的影響很小,因為它們很少使用。由此可以得出結(jié)論,在堆棧指針寄存器中注入的故障大大增加了該實驗中程序的崩潰率。

圖10 多線程應(yīng)用程序寄存器故障崩潰率

根據(jù)4.3節(jié)中的結(jié)果,進一步研究注入故障后的程序產(chǎn)生不同行為的原因。注入的故障通常從硬件傳播到軟件級別,然后破壞各種程序狀態(tài)和行為。

故障注入類型分為三種:

1) 控制方式注入:如果將故障注入用于條件分支的寄存器,則定義為控制故障。在這種情況下,故障注入器將故障直接注入到條件分支中的條件標志。

2) 地址方式注入:如果故障被注入到影響加載或存儲操作中的存儲器地址的寄存器中,則將其作為地址故障。

3) 數(shù)據(jù)方式注入:這種類型的故障通常涉及整數(shù)算術(shù)指令、浮點計算、寄存器之間的數(shù)據(jù)移動、邏輯指令等。從后續(xù)程序的運行結(jié)果分析,在軟錯誤傳播之后,數(shù)據(jù)故障將轉(zhuǎn)變?yōu)榈刂饭收匣蚩刂乒收稀?/p>

從圖11中可以看出,在多線程應(yīng)用中,地址方式注入的故障率高于其他類型,這說明在內(nèi)存操作階段注入故障時可能會導(dǎo)致程序中止。此外,可以得出結(jié)論,當在預(yù)測算法的數(shù)值計算階段中注入故障時,可能會導(dǎo)致應(yīng)用程序的執(zhí)行時間增加。由于算法結(jié)構(gòu)和數(shù)據(jù)規(guī)模的原因,故障注入下不同程序的執(zhí)行時間和輸出變化很大。

圖11 不同故障類型注入結(jié)果

5 結(jié) 語

本文設(shè)計一種軟錯誤的故障注入器,用于模擬機器級代碼的軟錯誤,主要基于英特爾的動態(tài)插裝和分析框架PIN。該注入器能夠模擬寄存器和存儲器中的單bit錯誤。為了提高插裝性能,設(shè)計并實現(xiàn)了監(jiān)視和控制腳本。此外,將該注入器應(yīng)用于典型的應(yīng)用程序,并運行數(shù)百次故障注入實驗以評估其對程序執(zhí)行時間和程序輸出的影響。

實驗結(jié)果表明,典型應(yīng)用程序的軟錯誤對性能和精度敏感。故障注入的位置不同,會對應(yīng)用程序產(chǎn)生不同的影響,基于應(yīng)用程序固有的算法特性和計算規(guī)模的不同,其對軟錯誤響應(yīng)也不同。

下一步的工作是開發(fā)一個完全集成的故障注入環(huán)境,該環(huán)境可以在各種操作系統(tǒng)下使用。此外,還要進一步改進支持的故障類型,以便將來在實際系統(tǒng)上進行應(yīng)用。

猜你喜歡
寄存器存儲器應(yīng)用程序
靜態(tài)隨機存儲器在軌自檢算法
刪除Win10中自帶的應(yīng)用程序
谷歌禁止加密貨幣應(yīng)用程序
飛思卡爾單片機脈寬調(diào)制模塊用法研究
移位寄存器及算術(shù)運算應(yīng)用
數(shù)字電路環(huán)境下汽車控制電路信號設(shè)計
存儲器——安格爾(墨西哥)▲
三星電子將開設(shè)應(yīng)用程序下載商店
微軟軟件商店開始接受應(yīng)用程序
Buffalo推出四硬盤網(wǎng)絡(luò)存儲器 主打Soho一族
广东省| 报价| 东兴市| 阜平县| 印江| 乌审旗| 蒲江县| 西贡区| 石城县| 凤山市| 海盐县| 咸宁市| 山西省| 寿光市| 湖北省| 岚皋县| 新营市| 巴林右旗| 呼图壁县| 诸暨市| 太和县| 新乡市| 福鼎市| 晋中市| 财经| 石泉县| 内江市| 苏尼特左旗| 太仆寺旗| 拉萨市| 德惠市| 新津县| 昌平区| 邛崃市| 商丘市| 西乡县| 浑源县| 桦南县| 扬中市| 湖北省| 南充市|