衛(wèi) 兵,郭玉堂*,張 磊,李 斌
(1.合肥師范學(xué)院 計算機(jī)學(xué)院 ,安徽 合肥 2300601;2.安徽大學(xué) 計算教學(xué)部,安徽 合肥 230009;3.安徽廣播電視大學(xué),安徽 合肥 230022)
嵌入式系統(tǒng)中UBI設(shè)備分區(qū)快速加載方案的設(shè)計與研究
衛(wèi) 兵1,郭玉堂1*,張 磊2,李 斌3
(1.合肥師范學(xué)院 計算機(jī)學(xué)院 ,安徽 合肥 2300601;2.安徽大學(xué) 計算教學(xué)部,安徽 合肥 230009;3.安徽廣播電視大學(xué),安徽 合肥 230022)
針對當(dāng)前嵌入式系統(tǒng)啟動時間過長的問題,提出了一種新UBI設(shè)備架構(gòu)方案。該方案在分區(qū)中劃分出物理預(yù)留區(qū)域,UBI設(shè)備卸載時使用新線程預(yù)先將UBI管理信息進(jìn)行壓縮,存入預(yù)留區(qū)域,UBI設(shè)備重新加載時再次調(diào)用線程直接讀取預(yù)存儲的壓縮包實(shí)現(xiàn)快速加載,節(jié)省大量DMA讀外設(shè)的時間。采用Block循環(huán)隊列設(shè)計以及標(biāo)志鎖機(jī)制確保系統(tǒng)工作穩(wěn)定性。實(shí)驗(yàn)測試結(jié)果表明,采用新UBI方案,系統(tǒng)分區(qū)加載時間縮短約50%左右。該方案可以有效解決系統(tǒng)升級時分區(qū)容量不斷擴(kuò)大導(dǎo)致開機(jī)速度變慢問題,在使用大容量閃存的嵌入式系統(tǒng)中有很好的應(yīng)用優(yōu)勢。
嵌入式系統(tǒng);UBI;NAND;DMA;快速加載
當(dāng)前以智能設(shè)備為代表的嵌入式產(chǎn)品廣泛普及,所依賴的嵌入式平臺幾乎都使用支持內(nèi)存管理單元(MemoryManagementUnit,MMU)的操作系統(tǒng)。例如,嵌入式Linux系統(tǒng)、基于Linux內(nèi)核的Andriod系統(tǒng),以及在Andriod基礎(chǔ)上深度開發(fā)的各種變本等。多數(shù)嵌入式平臺都會使用NANDFLASH閃存設(shè)備,基于NAND的文件系統(tǒng)也被廣泛使用,主要有YAFFS、JEFFS2、無排序區(qū)塊鏡像文件系統(tǒng)(UnsortedBlockImageFileSystem,UBIFS)[1]等。UBIFS是針對NAND開發(fā)的一種專業(yè)閃存日志文件系統(tǒng),相比較傳統(tǒng)的文件系統(tǒng)具備很多優(yōu)點(diǎn)[2]。UBIFS文件系統(tǒng)是基于無排序區(qū)塊鏡像 (UnsortedBlockImage,UBI)設(shè)備層基礎(chǔ)上使用,UBI設(shè)備是為管理NAND存儲塊而設(shè)計的一種設(shè)備管理接口層[4]。系統(tǒng)啟動時UBI需要掃描分區(qū)中所有物理存儲塊(Block)的頭信息,進(jìn)而在內(nèi)存中建立起管理設(shè)備分區(qū)的數(shù)據(jù)結(jié)構(gòu)信息,完成UBI設(shè)備加載,為上層UBIFS提供文件操作接口[3-4]。
嵌入式平臺不斷發(fā)展的同時,NAND制程也越來越先進(jìn),從43nm發(fā)展到28nm工藝,從小容量的單層單元NAND(SingleLayerCellNAND,SLCNAND)到大容量的多層單元NAND(Multi-LayerCellNAND,MLCNAND)逐漸在智能平臺中普及[5-6]。系統(tǒng)UBI設(shè)備分區(qū)也不斷擴(kuò)展,以容納更多的應(yīng)用程序和數(shù)據(jù),但存在的問題也逐漸顯現(xiàn)出來。UBI設(shè)備是依靠掃描分區(qū)所有Block的頭信息完成加載的,設(shè)備分區(qū)的不斷擴(kuò)展導(dǎo)致需要掃描的Block越來越多。由于系統(tǒng)讀取外設(shè)數(shù)據(jù)通常是耗時較大的操作,因此會出現(xiàn)設(shè)備開機(jī)時間變長。這種情況對于實(shí)時便捷性要求較高的嵌入式產(chǎn)品往往比較棘手,會直接影響用戶對設(shè)備的使用體驗(yàn)。課題在該背景下對UBI設(shè)備架構(gòu)進(jìn)行研究并重新設(shè)計了其架構(gòu),提高系統(tǒng)開機(jī)速度,以適應(yīng)大容量閃存的嵌入式系統(tǒng)發(fā)展。
UBI是一種設(shè)計用于NAND塊設(shè)備的管理接口層,架設(shè)于mtd設(shè)備之上。UBI對mtd層的物理擦寫塊(PhysicalEraseBlock,PEB)進(jìn)行統(tǒng)一管理,將其打包成邏輯擦寫塊(LogicalErase,LEB),內(nèi)部封裝壞塊管理、損益均衡管理以及卷管理等功能,提供給上層文件系統(tǒng)以統(tǒng)一的設(shè)備讀寫接口。UBIFS文件系統(tǒng)層只需要關(guān)注于日志文件管理層的設(shè)計,結(jié)構(gòu)上相互獨(dú)立。
UBI設(shè)備分區(qū)格式化過程中會對所屬存儲分區(qū)的mtd層物理PEB塊進(jìn)行格式化操作。UBI向PEB中寫入頭信息:VIDheader和ECCheader,大小為64字節(jié)(Byte),占用PEB前兩個頁面(Page),同時在內(nèi)存中建立起邏輯管理結(jié)構(gòu)。格式化后PEB塊被UBI作為邏輯LEB接口統(tǒng)一使用。系統(tǒng)啟動時,UBI設(shè)備的加載過程其實(shí)就是建立起UBI邏輯管理結(jié)構(gòu),UBI會依次掃描分區(qū)中的所有物理PEB,讀取LEB頭信息結(jié)構(gòu)和壞塊(BadBlock)標(biāo)志。UBI設(shè)備卸載相對簡單,只需要釋放相關(guān)內(nèi)存資源即可。
UBI設(shè)備占用PEB塊的前兩個頁面,每個頁面只使用64Bytes用于存儲頭信息,在大頁面NAND(如4KB、8KB型)中只使用到頁面的一小部分存儲空間。由于NAND設(shè)備的隨機(jī)讀取(Randomread)效率很低,一般驅(qū)動程序都會以整頁為單位進(jìn)行DMA讀操作。讀取PEB的前兩個Page屬于DMA讀外設(shè)數(shù)據(jù)的過程,DMA控制器發(fā)送讀數(shù)據(jù)命令后需要等待NAND內(nèi)部wait/busy(R/B)信號結(jié)束才會觸發(fā)對應(yīng)端口開始數(shù)據(jù)采樣[7-8]。NAND內(nèi)部R/B信號等待時間遠(yuǎn)大于通常CPU指令的工作時間,不同制程和款型NAND的內(nèi)部取數(shù)據(jù)的R/B信號等待時間約為20μs到100μs不等[9]。另外,DMA完成從I/O端口采樣整個Page的2 112Bytes數(shù)據(jù)操作也會耗費(fèi)較長時間。圖1為系統(tǒng)控制器以DMA方式讀取NANDPage數(shù)據(jù)的耗時分析。
(1)
圖1 DMA讀NAND頁面耗時分析
由公式(1)分析可知,讀取單位NAND頁面數(shù)據(jù)周期達(dá)72.984μs,相對于CPU指令周期耗時很大,尤其對于高性能嵌入式處理器平臺。因此,讀外設(shè)數(shù)據(jù)對于系統(tǒng)啟動時間來說是一種較大的負(fù)擔(dān)。UBI加載時需要掃描的PEB越多,意味著加載時間越長。隨著嵌入式平臺的升級,NAND容量在不斷擴(kuò)大,UBI設(shè)備分區(qū)也不斷擴(kuò)大。這種情況下,UBI加載所需耗時也會相應(yīng)增加,進(jìn)而影響到系統(tǒng)啟動時間。
2. 新UBI設(shè)備的架構(gòu)設(shè)計
由以上分析可知,UBI讀取64Bytes頭信息需要讀整個頁面,頁面大部分?jǐn)?shù)據(jù)為0xFF,大量的啟動時間被耗費(fèi)在DMA讀外設(shè)操作。因此,有必要對UBI進(jìn)行改進(jìn),以適應(yīng)系統(tǒng)平臺不斷升級帶來的問題。文中在先前課題的研究基礎(chǔ)上針對UBI設(shè)備工作原理和特點(diǎn),對其架構(gòu)改進(jìn)設(shè)計。新方案中UBI設(shè)備卸載時調(diào)用相關(guān)線程對UBI管理信息進(jìn)行壓縮處理,更新至分區(qū)中指定的物理存儲區(qū)域,UBI再次啟動加載時調(diào)用線程從該區(qū)域直接讀取壓縮信息即可完成加載,從而節(jié)約大量系統(tǒng)開機(jī)讀外設(shè)時間。圖2為新架構(gòu)UBI設(shè)備原理圖。方案設(shè)計中充分考慮系統(tǒng)運(yùn)行的健壯性,下面對各環(huán)節(jié)模塊進(jìn)行分析介紹。
圖2 新型UBI設(shè)備運(yùn)行原理圖
在新UBI設(shè)備中,系統(tǒng)分區(qū)格式化中在固定物理位置劃分出若干PEB塊的預(yù)留區(qū)域。UBI設(shè)備卸載時,調(diào)用所設(shè)計線程對內(nèi)存中UBI設(shè)備管理信息進(jìn)行壓縮,然后將壓縮包信息存儲進(jìn)預(yù)留區(qū)域。系統(tǒng)再次啟動,UBI設(shè)備加載時,調(diào)用相關(guān)線程從預(yù)留區(qū)域讀出壓縮包,直接解壓即可建立起UBI管理信息,完成加載。該方法和傳統(tǒng)UBI加載掃描所有PEB的頭信息一樣,均可得到前一次設(shè)備卸載時的最后信息記錄。由于壓縮包存儲的頁面數(shù)遠(yuǎn)小于常規(guī)掃描需要讀取的頁面數(shù),可以減少大量系統(tǒng)讀外設(shè)的DMA中斷耗時,進(jìn)而大幅節(jié)約系統(tǒng)啟動時間。圖3為新UBI設(shè)備卸載設(shè)計流程。
圖3 新UBI設(shè)備卸載流程圖
如圖3所示,設(shè)備卸載時先啟動線程對UBI管理信息進(jìn)行打包壓縮處理,具體做法為申請一塊連續(xù)內(nèi)存緩沖區(qū),將UBI管理信息依次拷入緩沖區(qū),然后使用壓縮算法對緩沖區(qū)數(shù)據(jù)進(jìn)行壓縮處理,得到UBI信息壓縮包,存儲關(guān)機(jī)時UBI的最后信息。目前很多高端IC平臺都自帶有支持高效壓縮算法的硬件控制器,基于該類平臺時可以使用硬件數(shù)據(jù)壓縮方式將UBI信息盡可能地壓縮到較小格式。UBI分區(qū)中邏輯塊LEB的頭信息VIDheader和ECCheader均為64Bytes,通常只占用頁面的一小部分,在方案測試實(shí)驗(yàn)中,整個分區(qū)的管理信息經(jīng)過壓縮處理后通??梢源鎯υ谝粋€PEB塊中。
UBI壓縮包制作好后,需要將其更新到預(yù)留物理存儲區(qū)域供下次啟動使用。以UBI壓縮包格式大小為一個PEB以內(nèi)為例,存儲區(qū)域的設(shè)計需要考慮諸多因素。NANDFLASH存儲塊Block有使用擦寫壽命(Program/Erasecycle,P/ECycles)問題,常規(guī)制程的SLCNAND的P/ECycles約60K~100K,MLCNAND約為3K~5K不等[10]。Block隨著擦寫次數(shù)增加會產(chǎn)生位反轉(zhuǎn)(bit-flip)并逐漸增多導(dǎo)致ECC無法糾正,同時NANDFLASH本身會存在BadBlock問題,以及操作中也可能意外產(chǎn)生BadBlock。這些因素都會影響系統(tǒng)穩(wěn)定性[11-12]。因此,不能簡單地將UBI壓縮包固定在某物理Block。新UBI中使用Block循環(huán)隊列設(shè)計,將劃分的預(yù)留區(qū)域Block統(tǒng)一管理起來,按照隊列的方式循環(huán)供數(shù)據(jù)存儲線程使用,確保數(shù)據(jù)信息安全性和穩(wěn)定性。如圖3中Block循環(huán)隊列工作流程設(shè)計,預(yù)留區(qū)域使用Block循環(huán)隊列管理,每個預(yù)留Block的Page的前四個4Bytes作為索引標(biāo)志位,用于隊列的循環(huán)累加計數(shù)。UBI定位存儲位置時,遍歷隊列,讀出預(yù)留標(biāo)志位,標(biāo)志值最大的BlockX即為上一次壓縮數(shù)據(jù)的存儲位置,則隊列中的下一個BlockX+1即為本次存儲位置,將標(biāo)志位的計數(shù)器加1和UBI壓縮包一起存入隊列,完成UBI壓縮包更新。在遍歷隊列和更新壓縮包的過程中遇到BadBlock就跳過使用下一個。通過一系列操作流程,使新UBI設(shè)備最大程度地克服NAND固有的BadBlock和P/ECycles問題,確保系統(tǒng)工作穩(wěn)定性。
系統(tǒng)啟動后,UBI設(shè)備分區(qū)開始執(zhí)行加載流程。如圖2中所示,UBI設(shè)備會首先啟動線程嘗試從預(yù)留區(qū)域?qū)ふ易钚耈BI壓縮包以實(shí)現(xiàn)快速加載(Fastattach)。UBI設(shè)備的前一次卸載操作中,如果預(yù)留區(qū)域出現(xiàn)大量BadBlock,則會導(dǎo)致定位儲存位置出錯以及更新壓縮包出錯等問題,卸載流程失敗。另外,若出現(xiàn)嵌入式系統(tǒng)常見的意外斷電情況,也無法執(zhí)行UBI卸載流程。這類情況下預(yù)留區(qū)域均無最新UBI壓縮包供加載讀取,新UBI架構(gòu)中使用標(biāo)志鎖設(shè)計以避免加載流程出錯。圖4為新UBI設(shè)備加載工作流程設(shè)計。
圖4中流程所示,新UBI加載操作中首先啟動新線程嘗試Fastattach。系統(tǒng)從物理預(yù)留區(qū)域?qū)ふ夷繕?biāo)UBI壓縮包,對Block循環(huán)隊列進(jìn)行遍歷,依次讀出Block中第一個Page的前4Bytes存儲的壓縮包編號信息(UBIindex)。若隊列中均為BadBlock,則預(yù)留區(qū)存儲塊無法使用,視為極端情況,退出Fastattach。遍歷完成后定位隊列中UBIindex最大的BlockX,接著檢查緊鄰下一個無故障BlockX+1作進(jìn)一步判斷:若BlockX+1中存儲最小UBIindex,表示UBI壓縮包隊列處于開鎖(LockOpen)狀態(tài),BlockX中數(shù)據(jù)為最新壓縮包;若BlockX+1中第一個Page信息為預(yù)定義標(biāo)志鎖(Lockmark),則表示UBI壓縮包隊列處于鎖定(Locked)狀態(tài),意味著當(dāng)前隊列中沒有前一次卸載所更新的UBI壓縮包可供讀取。推斷系統(tǒng)前一次UBI卸載更新壓縮包出錯,或者發(fā)生意外掉電狀況,此時退出Fastattach。針對UBI隊列LockOpen狀態(tài),直接讀取BlockX中UBI壓縮包,解壓數(shù)據(jù)包建立起UBI信息結(jié)構(gòu),實(shí)現(xiàn)Fastattach。然后在退出前LockUBI隊列:向BlockX+1中第一個Page寫入Lockmark。同時,圖3分析中,新UBI卸載時會將最新UBI壓縮包和UBIindex更新到BlockX+1中,即覆蓋Fastattach后的Lockmark,將UBI隊列打開(Unlock),為系統(tǒng)下次啟動UBI加載進(jìn)行狀態(tài)設(shè)置。采用這種標(biāo)志鎖機(jī)制防止系統(tǒng)工作異常。
圖4 新UBI設(shè)備加載流程圖
新UBI加載流程中出現(xiàn)退出Fastattach時,則快速加載失敗,關(guān)閉新線程重新走常規(guī)UBI掃描加載流程(Commonattach)。UBI分區(qū)格式化中,對Block循環(huán)隊列進(jìn)行格式化處理,在隊列N個Block中依次遞增寫入UBIindex,取值為從0到N-2,BlockN-1寫入Lockmark。分區(qū)格式化后,新UBI壓縮包隊列初始化為Locked狀態(tài),第一次開機(jī)會執(zhí)行Commonattach,通過卸載流程建立起第一個UBI壓縮包,為后續(xù)運(yùn)行提供可用信息。圖5為設(shè)備初始化工作流程圖。
圖5 新UBI設(shè)備初始化流程
實(shí)驗(yàn)設(shè)計針對新UBI設(shè)備進(jìn)行性能測試。實(shí)驗(yàn)測試平臺選擇SAMSUNGCortex-A9 4210開發(fā)板,該平臺為ARMCortex-A9 雙核架構(gòu)處理器,主頻為1GHz,具有64/32位的內(nèi)部總線結(jié)構(gòu)。NAND使用SAMSUNGK9K8G08U0M,該款型NAND容量為1GB,頁面為2KB,塊為128KB。
實(shí)驗(yàn)中系統(tǒng)固件內(nèi)核版本選用Linux-2.6.35。在系統(tǒng)分中設(shè)計三個UBIFS分區(qū),每個UBIFS分區(qū)設(shè)計一個UBI設(shè)備。依照新UBI設(shè)備設(shè)計方案重新編寫UBI源程序中attachdevice和detachdevice模塊,預(yù)留存儲區(qū)域Block數(shù)目初始化為5,經(jīng)交叉編譯得到基于新UBI的內(nèi)核鏡像文件,再更新至系統(tǒng)平臺。重啟系統(tǒng)后依次測試UBIFS分區(qū)的掛載速度(第二次掛載),并與基于原始UBI內(nèi)核鏡像文件的平臺進(jìn)行對比,分析新UBI設(shè)備性能(Performance),如表1所示。
表1 UBI設(shè)備掛載時間統(tǒng)計
從表1測試數(shù)據(jù)看,基于新UBI設(shè)備的分區(qū)加載時間普遍縮短約50%左右。設(shè)計中采用UBI隊列標(biāo)志鎖機(jī)制,測試中加入意外斷電操作,重啟系統(tǒng)可以按照原始開機(jī)速率正常啟動。針對BadBlock問題,測試中使用指令操作人為將Block循環(huán)隊列中Block全部標(biāo)記為Bad,重啟系統(tǒng)后同樣按照原始開機(jī)速率正常啟動。系統(tǒng)健壯性表現(xiàn)較好。新UBI設(shè)備分區(qū)加載Fastattach流程時,相對于原始UBI設(shè)備分區(qū)加載操作只需要讀取1個Block數(shù)據(jù),節(jié)省很多UBI掃描分區(qū)Block步驟,即DMA讀外設(shè)耗時。當(dāng)系統(tǒng)平臺中大容量分區(qū)較多時,新UBI設(shè)備可以節(jié)省大量系統(tǒng)啟動時間,Performance十分可觀。
采用盡可能減少系統(tǒng)讀外設(shè)工作量的設(shè)計思想,新UBI設(shè)計方案在設(shè)備分區(qū)加載速度上相對原始UBI設(shè)備具備很大優(yōu)勢。通過一系列設(shè)計方法使方案的在測試性能和穩(wěn)定性處于較好的狀態(tài)。系統(tǒng)整體健壯性的再提高以及UBI與上下層接口的磨合情況還有進(jìn)一步研究改進(jìn)的空間。
[1]MuhammadN,JamshidD.SoftwareBasedNANDFlashManagementTechniques[C].IEEEComputing,EngineeringandInformation.Washington,DC,2009:168-171.
[2] 韋 斯,丁志剛,張偉宏.LINUX下UBI子系統(tǒng)的研究與應(yīng)用[J].計算機(jī)應(yīng)用與軟件,2010,27(10):68-71.
[3] 韓春曉,陳香蘭,李 曦,等.UBIFS損耗均衡對系統(tǒng)I/O性能的影響[J].計算機(jī)工程,2009,35(6):260-262.
[4]UBIFSDocumentation,Nokia&UniversityofSzeged[EB/OL]. 2008.http://www.linux-mtd.infradead.org/doc/ubifs.html.
[5]YooB,WonY,ChoS,etal.Ssdcharacterization:Fromenergyconsumption’sperspective.InProceedingsofHotStorage’2011[C].USENIXAssociationBerkeley,CA,USA,2011:3-3.
[6]ChenF,LuoT,ZhangX.Caftl:Acontent-awareflashtranslationlayerenhancingthelifespanofflashmemorybasedsolidstatedrives,Proceedingsof9thUSENIXConferenceonFileandStorageTechnologies[C].USENIXAssociationBerkeley,CA,USA,2011: 6-20.
[7] 史 斌,丁志剛,張偉宏.基于PXA3xx處理器的NAND閃存DMA方案[J].計算機(jī)應(yīng)用,2009,29(8):2136-2138, 2142.
[8]WildaniA,MillerEL,ANDWardL.Efficientlyidentifyingworkingsetsinblocki/ostreams,Proceedingsofthe4thAnnualInternationalSystemsandStorageConference[C].ArticleNo. 5,ACMNewYork,NY,USA,2011.
[9]SAMSUNG.K9K8G08U0MFLASHMEMORYdatasheet,Rev.2.6[EB/OL][2015-11-02].http://www.dzsc.com.
[10]曹 璐.基于NANDFLASH的文件系統(tǒng)設(shè)計與實(shí)現(xiàn)[D].上海:華東師范大學(xué),2012:5-6.
[11]MuhammadN,JamshidD.SoftwareBasedNANDFlashManagementTechniques[C].IEEE.Computing,EngineeringandInformation.Washington,DC:IEEEPress,2009: 168-171.
[12]ChangLP.OnefficientwearlevelingforLarge-ScaleFlash-Memorystoragesystems[C]//APPLIEDCOMPUTING2007,VOL1AND2,seoul:acmpress, 2007: 1126-1130.
AdesignandresearchofimprovedUBIwhichcouldbefastattachedinembeddedsystem
WEIBing1,GUOYu-tang1*,ZHANGLei2,LIBin3
(1.DepartmentofComputerScienceandTechnology,HefeiNormalCollege,Hefei230601; 2.DepartmentofComputerScienceandTechnology,AnhuiUniversity,Hefei230039;3.AnhuiOpenUniversity,Hefei230022)
Inthispaper,anewUBIdeviceframeworkwasproposed,whichfocusedonproblemsofboottimeinEmbeddedsystemcurrently.Inthesolution,afixedphysicalareawasdividedinsystempartition,whichisreservedforstoringUBImanagementinformationpackagecompressedbyanewthreadafterUBIdetachaccomplished,then,anothernewthreadwouldbecreatedtoreadoutthepreviousUBIpackagefromreservedareatorealizefastUBIattachment,whichcouldsavealotoftimeconsumingduringDMAperipheralreading.Furthermore,ablockcircularqueueandlogolockingmechanismweredesignedtoensurethestabilityofthesystem.Experimentalresultsshowedthatthepartitionloadtimewasreducedabout50%byusingthenewUBI.Thesolutioncouldsolvetheproblemsofslowlybootingcausedbycontinuouslyexpandingthepartitioncapacitywhenupgradethesystems,whichhasgoodapplicationadvantagesinEmbeddedsystemswithlarge-capacityflashmemory.
embeddedsystem;UBI;NAND;DMA;fastattach
魂芯DSP產(chǎn)業(yè)化研究院開放課題(2014dspkfb03);安徽省高等學(xué)校省級優(yōu)秀青年人才基金重點(diǎn)項目(2013SQRL097ZD);合肥師范學(xué)院青年基金項目(2015QN16)資助。
衛(wèi) 兵 (1984-),男,碩士,講師,研究方向:嵌入式系統(tǒng)、模式識別與智能數(shù)據(jù)處理。
郭玉堂 (1962-),男,博士,教授,研究方向:圖像處理與模式識別。Email:28297852@qq.com。
TP302.1,TP302.7
A
1004-4329(2015)04-074-06
10.14096/j.cnki.cn34-1069/n/1004-4329(2015)04-074-06
投稿日期:2015-04-23