《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 嵌入式技術(shù) > 設(shè)計(jì)應(yīng)用 > WinCE啟動(dòng)失敗的原因與解決辦法分析
WinCE啟動(dòng)失敗的原因與解決辦法分析
摘要: 為什么會(huì)出現(xiàn)這種情況呢?經(jīng)過(guò)幾個(gè)晚上通宵達(dá)旦的加班分析和研究,原來(lái)主因是系統(tǒng)的引導(dǎo)過(guò)程、內(nèi)核加載過(guò)程、OAL啟動(dòng)過(guò)程和硬件驅(qū)動(dòng)加載過(guò)程時(shí)都存在可能導(dǎo)致的失敗的隱憂。本文通過(guò)對(duì)以上因素進(jìn)行分析,并提出相應(yīng)的解決辦法。但由于WinCE啟動(dòng)失敗會(huì)非常取決于硬件平臺(tái),因此在具體應(yīng)用時(shí)需要綜合考慮和分析。
關(guān)鍵詞: 嵌入式操作系統(tǒng) WinCE
Abstract:
Key words :

  本文通過(guò)一個(gè)真實(shí)的嵌入式項(xiàng)目進(jìn)行說(shuō)明。文中的嵌入式系統(tǒng)用的是arm處理器+WinCE平臺(tái),項(xiàng)目的目的是要把WinCE平臺(tái)從舊版本移植到WinCE6.0平臺(tái)上。但結(jié)果是這個(gè)WinCE系統(tǒng)在啟動(dòng)的時(shí)候經(jīng)常會(huì)出現(xiàn)失敗,而且每次失敗的原因都莫明其妙和不盡相同。這使到我們開(kāi)發(fā)團(tuán)隊(duì)每個(gè)人在啟動(dòng)WinCE系統(tǒng)時(shí)都心驚肉跳,非常擔(dān)心系統(tǒng)又再一次出現(xiàn)讓人意想不到的失敗。這種頻繁的啟動(dòng)失敗對(duì)開(kāi)發(fā)團(tuán)隊(duì)來(lái)說(shuō)顯然是一種讓人難以忍受的折磨。

  為什么會(huì)出現(xiàn)這種情況呢?經(jīng)過(guò)幾個(gè)晚上通宵達(dá)旦的加班分析和研究,原來(lái)主因是系統(tǒng)的引導(dǎo)過(guò)程、內(nèi)核加載過(guò)程、OAL啟動(dòng)過(guò)程和硬件驅(qū)動(dòng)加載過(guò)程時(shí)都存在可能導(dǎo)致的失敗的隱憂。本文通過(guò)對(duì)以上因素進(jìn)行分析,并提出相應(yīng)的解決辦法。但由于WinCE啟動(dòng)失敗會(huì)非常取決于硬件平臺(tái),因此在具體應(yīng)用時(shí)需要綜合考慮和分析。

  一.什么是WinCE啟動(dòng)過(guò)程?

  WinCE系統(tǒng)在啟動(dòng)時(shí)一般需要三個(gè)基本元素:引導(dǎo)初始化、內(nèi)核加載和OAL初始化等。它們的作用是要完成引導(dǎo)過(guò)程的初始化和操作系統(tǒng)執(zhí)行環(huán)境的初始化。其中引導(dǎo)初始化是由引導(dǎo)工具BootLoader完成,主要是完成板級(jí)、片級(jí)的初始化。例如,通過(guò)設(shè)置寄存器來(lái)完成硬件的初始化,如設(shè)置時(shí)鐘、設(shè)置中斷控制寄存器、完成內(nèi)存映射和初始化MMU的工作方式等。內(nèi)核加載是指將操作系統(tǒng)內(nèi)核映像從只讀存儲(chǔ)器加載或者拷貝到系統(tǒng)的RAM中并執(zhí)行。OAL(OEM Adaption Layer,即原始設(shè)備制造商適配層)是位于操作系統(tǒng)的內(nèi)核與硬件之間的適配層,也是連接系統(tǒng)內(nèi)核與硬件的樞紐,它具有屏蔽硬件設(shè)備細(xì)節(jié)以及抽象硬件功能的作用。而OAL初始化則是指通過(guò)一組函數(shù)來(lái)體現(xiàn)出0AL屏蔽和抽象硬件設(shè)備的作用。

  此外,如果要WinCE系統(tǒng)成為完整的操作系統(tǒng),還得加上硬件驅(qū)動(dòng)程序、硬件接口程序和應(yīng)用程序組。因此,即使在一個(gè)簡(jiǎn)單的嵌入式系統(tǒng)里,WinCE系統(tǒng)啟動(dòng)時(shí)是需要加載內(nèi)核和加載許多組件或驅(qū)動(dòng)程序。

  現(xiàn)在讓我們來(lái)看看WinCE系統(tǒng)在啟動(dòng)時(shí)調(diào)用函數(shù)的順序:①CPU執(zhí)行引導(dǎo)向量,跳轉(zhuǎn)到硬件初始化代碼,即Startup函數(shù)。②在start up函數(shù)完成最小硬件環(huán)境初始化后跳轉(zhuǎn)到KernelStart函數(shù),來(lái)對(duì)內(nèi)核進(jìn)行初始化。③Kernelstart函數(shù)調(diào)用OEMInitDebugSerial完成對(duì)調(diào)試串口的初始化;同時(shí)調(diào)用0EMInit函數(shù)來(lái)完成硬件初始化工作以及設(shè)置時(shí)鐘、中斷;最后,調(diào)用OEMGetExtensionDRAM函數(shù)來(lái)判斷是否還有另外一塊DRAM。至此,內(nèi)核加載完畢。由此可見(jiàn),WinCE系統(tǒng)啟動(dòng)的重中之重是Startup函數(shù)的正確加載,如果這個(gè)Startup函數(shù)調(diào)用失敗,則會(huì)使到系統(tǒng)在啟動(dòng)頻繁出錯(cuò)。WinCE啟動(dòng)時(shí)調(diào)用函數(shù)順序如下圖所示:

  因此,WinCE啟動(dòng)失敗可能會(huì)存在于引導(dǎo)初始化失敗、內(nèi)核加載失敗、0AL函數(shù)初始化失敗、驅(qū)動(dòng)程序加載失敗、組件加載失敗和應(yīng)用程序加載失敗。也就是說(shuō),WinCE啟動(dòng)失敗一方面可能是在Startup函數(shù)的處理上,例如引導(dǎo)初始化和OAL初始化。另一方面還存在于驅(qū)動(dòng)程序和組件自啟動(dòng)的失敗上,例如基本的驅(qū)動(dòng)程序、注冊(cè)表配置或自運(yùn)行的程序等。

  就不能被使用。所以,當(dāng)注冊(cè)表在啟動(dòng)時(shí)加載錯(cuò)誤或者注冊(cè)表配置有錯(cuò)誤時(shí),也是會(huì)導(dǎo)致WinCE系統(tǒng)啟動(dòng)失敗的。

  二.導(dǎo)致WinCE啟動(dòng)失敗的主因分析

  Windows CE在啟動(dòng)時(shí)為什么會(huì)失敗呢?這個(gè)問(wèn)題也一直讓我頭痛。因?yàn)閃indows CE啟動(dòng)失敗既有軟件因素,也有硬件因素。例如,可能是WinCE的啟動(dòng)引導(dǎo)過(guò)程有問(wèn)題、也許是內(nèi)核加載時(shí)有問(wèn)題、也許是OAL函數(shù)調(diào)用的隱性問(wèn)題或者硬件設(shè)備本身的問(wèn)題造成的。所以,解決起來(lái)比較麻煩和比較耗時(shí)間,也是最讓我們頭疼的事情。

  一般來(lái)說(shuō),解決和分析WinCE啟動(dòng)失敗有一個(gè)原則,就是"先軟后硬"的原則,也就是說(shuō)要先分析軟件因素再到硬件因素。本文主要是在arm微處理器和Windows CE 6.0平臺(tái)上進(jìn)行分析軟件因素造成的失敗。

  (1)引導(dǎo)程序BootLoader導(dǎo)致的失敗

  在Windows CE系統(tǒng)中,整個(gè)系統(tǒng)的加載啟動(dòng)任務(wù)由BootLoader來(lái)完成,BootLoader是在WinCE內(nèi)核運(yùn)行之前運(yùn)行的一段小程序。通過(guò)這段小程序,可以初始化硬件設(shè)備、建立內(nèi)存空間的映射圖和初始化MMU等。從而將系統(tǒng)的軟硬件環(huán)境帶到一個(gè)合適的狀態(tài),為調(diào)用操作系統(tǒng)內(nèi)核準(zhǔn)備好環(huán)境。因此,只有在引導(dǎo)程序正確的完成自己的任務(wù)后,才會(huì)將控制權(quán)移交給內(nèi)核。

  在WinCE平臺(tái)上,引導(dǎo)裝載程序是在硬件上執(zhí)行的第一段代碼,通常將引導(dǎo)程序放置在不易丟失的存儲(chǔ)器的開(kāi)始地址或者是系統(tǒng)冷啟動(dòng)時(shí)PC寄存器的初始值。如果這段小程序代碼編寫(xiě)錯(cuò)誤,則系統(tǒng)無(wú)法完成第一步的引導(dǎo)操作,這是導(dǎo)致啟動(dòng)系統(tǒng)失敗的第一個(gè)因素。

  ①BootLoader初始化硬件失敗

  BootLoader第一個(gè)功能是要實(shí)現(xiàn)板級(jí)和片級(jí)初始化硬件,主要是把CPU初始化到一已知狀態(tài)。在BootLoader目錄下,會(huì)發(fā)現(xiàn)一些.s文件,可能會(huì)是init.s或者是reset.s等,這樣的文件是CPU加電后最先執(zhí)行的代碼。StartUp 函數(shù)是BootLoader的入口函數(shù)。該函數(shù)一般是使用匯編語(yǔ)言編寫(xiě),與CPU關(guān)系非常緊密,能完成初始化CPU、內(nèi)存等核心硬件。然后,BootLoader在平臺(tái)初始化完畢后就可以在不用人工干預(yù)的情況下自動(dòng)加載WinCE內(nèi)核了。但如果BootLoader在初始化硬件時(shí)失敗,就會(huì)直接導(dǎo)致系統(tǒng)的啟動(dòng)失敗了。

  ②BootLoader加載內(nèi)核時(shí)失敗

  一般在平臺(tái)調(diào)試完畢后,BootLoader就會(huì)加載WinCE內(nèi)核映像,這也是BootLoader的功能之一。WinCE內(nèi)核映像文件通常叫做nk.bin,它是Windows CE二進(jìn)制數(shù)據(jù)格式文件,不僅包含了有效的程序代碼,還有按照一定規(guī)則加入的控制信息。

  在系統(tǒng)啟動(dòng)時(shí)BootLoader可以通過(guò)兩種不同的方式來(lái)加載WinCE內(nèi)核文件nk.bin。一種是下載模式,另一種是本地啟動(dòng)模式。本地啟動(dòng)模式也稱為自主模式,即 BootLoader 從目標(biāo)機(jī)上的某個(gè)固態(tài)存儲(chǔ)設(shè)備上將操作系統(tǒng)加載到 RAM 中運(yùn)行,整個(gè)過(guò)程并沒(méi)有用戶的介入。而下載模式則是目標(biāo)機(jī)上的 BootLoader 將通過(guò)串口連接或網(wǎng)絡(luò)連接等通信手段從主機(jī)(Host)下載文件。當(dāng)BootLoader正確的把nk.bin解壓到RAM后,就會(huì)把CPU控制權(quán)交給CE內(nèi)核。因此,如果Boot Loader處理不當(dāng),就可能會(huì)造成加載和解壓nk.bin文件的失敗,這樣自然也就會(huì)造成系統(tǒng)啟動(dòng)的失敗了。

 

 

 

  (2)OAL導(dǎo)致的啟動(dòng)失敗

  OAL(OEM Adaptation Layer)是指OEM 適配層,它是位于Windows CE內(nèi)核和硬件之間的一層適配層,是OAL各個(gè)模塊代碼被編譯后(.lib)和其它內(nèi)核庫(kù)鏈接到一起形成Windows CE的內(nèi)核可執(zhí)行文檔NK.EXE。OAL包括了和系統(tǒng)硬件通訊的最底層代碼,內(nèi)核是通過(guò)OAL跟硬件進(jìn)行交互。邏輯上,OAL是介于CE內(nèi)核和設(shè)備硬件之間的一個(gè)代碼層,是一個(gè)抽象的概念。物理上,OAL和其它一些庫(kù)一起鏈接成可執(zhí)行文件。

  與以前的Win CE舊版本不同的是,在Win CE 6.0中內(nèi)核(Kenerl)和OEM代碼被分成oal.exe、kernel.dll和kitl.dll三個(gè)部分,其中啟動(dòng)代碼(startup)和 OAL層的實(shí)現(xiàn)部分不再與內(nèi)核鏈接生成NK.exe,取而代之的是啟動(dòng)代碼(startup)和硬件相關(guān)且獨(dú)立于內(nèi)核的OAL層的實(shí)現(xiàn)部分編譯成 oal.exe;而與內(nèi)核相關(guān)且獨(dú)立于硬件的OAL層代碼包含在kernel.dll中,內(nèi)核無(wú)關(guān)傳輸層(KITL)的支持代碼從OAL層分離出來(lái)編譯成 kitl.dll。因此,WinCE6.0的啟動(dòng)只與oal.exe和kernel.dll有關(guān)。至于kitl.dll,只有將操作系統(tǒng)編譯成具有 KITL功能時(shí)才用到。這樣做的好處是可以單獨(dú)升級(jí)OAL,但整體的OAL結(jié)構(gòu)并沒(méi)有改變。

  ①OAL初始化硬件時(shí)失敗

  oal.exe是通過(guò)Startup函數(shù)來(lái)完成硬件的初始化。一般來(lái)說(shuō),OAL的啟動(dòng)代碼(Startup.s)與該硬件平臺(tái)的Bootloader的啟動(dòng)代碼(Startup.s)是可以共享的。例如,其中PreInit 函數(shù)主要完成將arm處理器工作模式切換到管理員模式,同時(shí)關(guān)閉MMU,并檢測(cè)系統(tǒng)啟動(dòng)原因。如果是熱啟動(dòng),即在該函數(shù)調(diào)用之前已經(jīng)啟動(dòng)過(guò) Bootloader的啟動(dòng)代碼(Startup.s),相當(dāng)基本硬件初始化已經(jīng)完成,則可直接跳轉(zhuǎn)到OALStartUp函數(shù)中;否則需要進(jìn)行硬件中斷屏蔽、內(nèi)存、系統(tǒng)時(shí)鐘頻率、電源管理等硬件的基本初始化過(guò)程。

  在StartUp 函數(shù)初始化CPU等核心硬件并跳轉(zhuǎn)到Main函數(shù)后,系統(tǒng)就會(huì)轉(zhuǎn)入C語(yǔ)言代碼執(zhí)行環(huán)境。這時(shí)Main函數(shù)分為3個(gè)模塊:BLCOMMON、Download Function、FLASH Function。其中BLCOMMON模塊是由微軟提供的,執(zhí)行一些邏輯上的功能。而Download Function、FLASH Function中的函數(shù)與硬件平臺(tái)息息相關(guān)。因此,對(duì)于每種硬件平臺(tái)都要將函數(shù)的實(shí)現(xiàn)進(jìn)行適當(dāng)修改,這種修改是需要對(duì)硬件非常熟悉的。當(dāng)修改出現(xiàn)錯(cuò)誤時(shí),就會(huì)導(dǎo)致系統(tǒng)啟動(dòng)失敗了。

  在硬件平臺(tái)初始化完成后,oal.exe的啟動(dòng)任務(wù)基本完成,余下的啟動(dòng)工作由內(nèi)核相關(guān)且獨(dú)立于內(nèi)核的OAL層實(shí)現(xiàn)體kernel.dll接管。也就是說(shuō),這時(shí)Startup會(huì)調(diào)用OALStartUp函數(shù),OALStartUp函數(shù)主要完成將OEMAddressTable表傳遞給內(nèi)核,然后調(diào)用KernelStart函數(shù)跳轉(zhuǎn)到內(nèi)核。因此,如果此時(shí)OAL的啟動(dòng)Startup函數(shù)調(diào)用失敗的話,就也會(huì)導(dǎo)致系統(tǒng)的啟動(dòng)失敗了。

  這里需要特別注意的是,Bootloader和OAL中均包含啟動(dòng)Startup函數(shù)。它的功能大致相同,都是要初始化最小硬件環(huán)境。Bootloader的啟動(dòng)Startup函數(shù)是在為自己的執(zhí)行準(zhǔn)備硬件環(huán)境,OAL的啟動(dòng)Startup函數(shù)則是為kernel的執(zhí)行準(zhǔn)備硬件環(huán)境。由于這兩種硬件環(huán)境要求基本相同,所以它們的代碼也有很大部分可以相互借鑒。但應(yīng)該明白Bootloader與OAL在物理上是獨(dú)立的,它們并不是同一段代碼。當(dāng)然,如果可以確定這一部分在Bootloader已經(jīng)初始化過(guò)如熱啟動(dòng),則在OAL中不必重復(fù)執(zhí)行。

  ②OAL入口位置定位失誤導(dǎo)致的失敗

  從上述WinCE啟動(dòng)流程可知,在OAL初始化硬件后而在內(nèi)核啟動(dòng)前,系統(tǒng)是需要調(diào)用KernelStart函數(shù)來(lái)跳轉(zhuǎn)到內(nèi)核。因此,這里有一個(gè)要點(diǎn),就是WinCE需要找到OAL的入口位置,然后才能調(diào)用入口函數(shù)與全局塊進(jìn)行指針交換,這樣內(nèi)核才能使用OAL層中的信息,同樣OAL層也才能訪問(wèn)內(nèi)核(kernel)導(dǎo)出的函數(shù)。

  OAL入口位置函數(shù)的調(diào)用實(shí)際上是通過(guò)OEMGLOBAL結(jié)構(gòu)體實(shí)現(xiàn)的,實(shí)際調(diào)用位置為OEMInitDebugSerial和OEMInit。也就是說(shuō),OEMGLOBAL結(jié)構(gòu)體構(gòu)建了內(nèi)核和OAL層之間進(jìn)行通信的橋梁。OEMGLOBAL結(jié)構(gòu)體定義了OAL層所有必須的函數(shù),該結(jié)構(gòu)體在oemglobal.c文件中被初始化,并會(huì)被編譯在OEMMain.lib和 OEMMain_StaticKITL.lib兩個(gè)庫(kù)中。如果OAL鏈接這兩個(gè)庫(kù),則必須要有正確的該結(jié)構(gòu)體的函數(shù)實(shí)現(xiàn)體,同時(shí)還需要調(diào)用ARMSetup來(lái)設(shè)置物理地址和非緩沖的虛擬內(nèi)存地址的映像、arm中斷向量以及內(nèi)核模式所需要的堆棧、調(diào)用OEMInitDebugSerial函數(shù)初始化調(diào)試串口、調(diào)用OEMInit進(jìn)行平臺(tái)初始化等。否則,如果OAL入口位置函數(shù)有誤,則內(nèi)核和OAL層之間的訪問(wèn)就會(huì)失敗,也就會(huì)導(dǎo)致系統(tǒng)在啟動(dòng)時(shí)出錯(cuò)和失敗。

  三.導(dǎo)致的WinCE啟動(dòng)失敗的其它相關(guān)因素

  (1)驅(qū)動(dòng)程序加載錯(cuò)誤導(dǎo)致的失敗

  在調(diào)試中,我們還發(fā)現(xiàn)系統(tǒng)在啟動(dòng)時(shí)執(zhí)行到OEMInit時(shí)也經(jīng)常會(huì)出現(xiàn)錯(cuò)誤。一般來(lái)說(shuō),系統(tǒng)調(diào)用OEMInit運(yùn)行完成之后,就會(huì)跳回Private或Public下的代碼繼續(xù)運(yùn)行,然后再啟動(dòng)device.exe加載各個(gè)驅(qū)動(dòng)程序。由于這一段代碼是微軟提供的default代碼,基本上不會(huì)有問(wèn)題。所以,我們就有理由懷疑如果加載的驅(qū)動(dòng)程序出了問(wèn)題,是也會(huì)造成系統(tǒng)啟動(dòng)失敗的。一般來(lái)說(shuō),這些加載的驅(qū)動(dòng)程序主要是 BSP中的Audio、Display、SDMMC、Serial、USB等。

  (2)啟動(dòng)時(shí)加載配置有誤的注冊(cè)表導(dǎo)致的失敗

  在WinCE中注冊(cè)表在啟動(dòng)過(guò)程中也扮演著非常重要的角色。與桌面Windows一樣,WinCE注冊(cè)表(Registry)也是一個(gè)系統(tǒng)數(shù)據(jù)庫(kù),用來(lái)保存應(yīng)用程序、驅(qū)動(dòng)程序、用戶的設(shè)定以及其它一些系統(tǒng)的配置信息,通常還存儲(chǔ)著操作系統(tǒng)運(yùn)作和調(diào)用程序的狀態(tài)信息。例如,每個(gè)用戶的配置文件、安裝的應(yīng)用程序以及每個(gè)應(yīng)用程序可以創(chuàng)建的文檔類型、文件夾和應(yīng)用程序圖標(biāo)的屬性表設(shè)置、系統(tǒng)上存在哪些硬件以及正在使用哪些端口等。

  因此,對(duì)于硬件外設(shè)來(lái)說(shuō)注冊(cè)表是一個(gè)記錄驅(qū)動(dòng)程序設(shè)置和位置的數(shù)據(jù)庫(kù)。當(dāng)WinCE系統(tǒng)在啟動(dòng)時(shí)需要啟動(dòng)某些必要的硬件設(shè)備時(shí),就會(huì)需要使用外設(shè)驅(qū)動(dòng)程序。但如果在WinCE中這個(gè)外設(shè)驅(qū)動(dòng)是獨(dú)立于操作系統(tǒng)的,WinCE系統(tǒng)就需要知道從哪里找到它們,例如文件名、版本號(hào)、其它設(shè)置和信息。因此,注冊(cè)表上沒(méi)有此設(shè)備的記錄時(shí),它們就不能被使用。所以,當(dāng)注冊(cè)表在啟動(dòng)時(shí)加載錯(cuò)誤或者注冊(cè)表配置有錯(cuò)誤時(shí),也是會(huì)導(dǎo)致WinCE系統(tǒng)啟動(dòng)失敗的。

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
国产日韩在线一区二区三区| 伊人久久综合| 快播亚洲色图| 亚洲欧美日韩网| 中文国产一区| av成人手机在线| 亚洲精品视频免费观看| 一本高清dvd不卡在线观看| 在线免费观看成人网| 国内精品模特av私拍在线观看| 国产精品毛片| 国产精品日本| 国产精品一卡二卡| 国产精品毛片a∨一区二区三区|国| 欧美日韩在线三区| 欧美日韩国内| 欧美日本久久| 欧美日韩精品免费看| 欧美精品日韩| 欧美日韩一区二区三区在线观看免 | 一区二区高清视频| 一区二区精品在线观看| 一区二区三区三区在线| 亚洲影视在线| 性欧美在线看片a免费观看| 午夜精品久久久久久久99樱桃| 欧美在线免费视频| 欧美一区二区在线观看| 久久久久国产一区二区三区| 免费h精品视频在线播放| 欧美寡妇偷汉性猛交| 欧美日韩国产高清视频| 欧美午夜精品久久久| 国产精品午夜在线观看| 国产在线精品二区| 亚洲福利免费| 亚洲日本一区二区三区| 一本色道久久88综合亚洲精品ⅰ | 国产精品视频导航| 国产亚洲在线观看| 在线成人免费观看| 亚洲日韩第九十九页| 中文一区字幕| 欧美一级免费视频| 亚洲激情影视| 亚洲一区二区在| 久久狠狠亚洲综合| 欧美成人综合一区| 国产精品国产自产拍高清av| 国产亚洲视频在线| 亚洲三级性片| 午夜视频在线观看一区| 亚洲精品乱码久久久久久按摩观| 亚洲午夜一二三区视频| 久久精品视频免费播放| 欧美黄色大片网站| 国产精品网站在线观看| 雨宫琴音一区二区在线| 99亚洲一区二区| 亚洲欧美自拍偷拍| 亚洲精品国产精品国自产在线| 一区二区三区**美女毛片| 欧美一区二区三区精品| 免费久久99精品国产| 国产精品99一区| 伊人久久男人天堂| 中日韩美女免费视频网站在线观看| 翔田千里一区二区| 亚洲作爱视频| 久久免费视频这里只有精品| 欧美日韩国产天堂| 国产在线日韩| 日韩一级成人av| 久久精品视频在线观看| 亚洲一区二区在| 欧美高清在线播放| 国产日韩在线看片| 夜夜狂射影院欧美极品| 欧美一区三区三区高中清蜜桃 | 免费亚洲电影在线| 国产精品区一区二区三区| 亚洲福利久久| 欧美一区日本一区韩国一区| 亚洲婷婷综合色高清在线| 久久夜色精品国产亚洲aⅴ| 欧美性一区二区| 亚洲国产日韩欧美在线图片| 欧美一区二粉嫩精品国产一线天| 制服丝袜激情欧洲亚洲| 美女日韩欧美| 国产一区激情| 亚洲欧美日韩精品久久亚洲区| 一区二区久久久久| 欧美成人精品不卡视频在线观看| 国产欧美综合一区二区三区| 一本色道久久88精品综合| 亚洲精品一区二区网址| 久久久精品国产99久久精品芒果| 国产精品免费看片| 亚洲精品影院在线观看| 亚洲三级电影全部在线观看高清| 久久精品99国产精品| 国产精品国产三级国产aⅴ入口 | 欧美一级淫片aaaaaaa视频| 亚洲一区欧美二区| 欧美精选在线| 亚洲国产视频一区二区| 亚洲国产小视频| 久久免费视频一区| 国产资源精品在线观看| 午夜激情综合网| 亚洲女同精品视频| 国产精品hd| 一本不卡影院| 亚洲亚洲精品在线观看 | 欧美婷婷在线| 99在线精品免费视频九九视| 亚洲最新色图| 欧美片第1页综合| 91久久极品少妇xxxxⅹ软件| 亚洲精品一区二区三区av| 狼人社综合社区| 伊人久久亚洲热| 亚洲欧洲一二三| 欧美国产日韩一区| 亚洲欧洲日本一区二区三区| 日韩亚洲精品电影| 欧美日本乱大交xxxxx| 亚洲精品在线电影| 亚洲天堂黄色| 国产精品久久久久久久久动漫| 制服丝袜亚洲播放| 性xx色xx综合久久久xx| 国产精品入口尤物| 亚洲欧美日韩国产精品| 欧美亚洲在线观看| 国产日产欧美一区| 欧美一区2区视频在线观看| 久久久精品免费视频| 伊人春色精品| 亚洲精品久久久久久久久| 欧美精品www| 在线一区欧美| 欧美一区二区视频观看视频| 国产一本一道久久香蕉| 亚洲国产精品一区在线观看不卡| 欧美a级大片| 亚洲开发第一视频在线播放| 亚洲综合三区| 国产亚洲电影| 亚洲黄一区二区三区| 欧美绝品在线观看成人午夜影视| 一本色道久久综合精品竹菊| 欧美在线关看| 亚洲二区视频| 亚洲图片欧洲图片日韩av| 国产精品入口尤物| 亚洲国产成人久久综合| 欧美精品观看| 亚洲制服欧美中文字幕中文字幕| 久久精品电影| 亚洲国产99| 亚洲女人天堂成人av在线| 国产情人综合久久777777| 亚洲国产精品久久久久秋霞蜜臀| 欧美日本精品一区二区三区| 亚洲综合首页| 奶水喷射视频一区| 一区二区不卡在线视频 午夜欧美不卡'| 欧美一区国产一区| 在线观看欧美日韩| 亚洲一区二区欧美日韩| 国产一区二区视频在线观看| 99国产精品自拍| 国产日韩亚洲欧美| 最新中文字幕亚洲| 国产精品黄页免费高清在线观看| 久久精品视频在线看| 欧美日韩国产精品一区二区亚洲| 午夜精品剧场| 欧美精品一区二| 午夜精品久久久久久久久久久久久| 欧美wwwwww| 亚洲综合精品一区二区| 欧美**字幕| 亚洲女人小视频在线观看| 欧美成人久久| 欧美亚洲在线播放| 欧美日韩精品一区二区三区四区| 欧美一区二区大片| 欧美日韩理论| 久久精品免费观看| 国产精品久久影院| 亚洲三级免费观看| 国产亚洲一级高清| 亚洲综合日韩在线| 亚洲激情影视| 久久天堂成人| 亚洲综合日本| 欧美深夜影院|