日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android Bootloader LittleKernel的两篇文章 【转】

發布時間:2023/12/6 Android 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android Bootloader LittleKernel的两篇文章 【转】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉自:http://blog.csdn.net/loongembedded/article/details/41747523

?分類: Android Bootloader(68)?

Android?開發之 ---- bootloader (LK)

?

LK是什么

???????????LK 是 Little Kernel 它是 appsbl (Applications ARM Boot Loader)流程代碼? ,little kernel 是小內核小操作系統。

?????????? LK 代碼 在 bootable/bootloadler/lk 目錄下

?????????? LK 代碼結構

?????????? +app??????????? // 應用相關

?????????? +arch?????????? // arm 體系?

?????????? +dev??????????? // 設備相關

?????????? +include????? // 頭文件

?????????? +kernel??????? // lk系統相關???

?????????? +platform??? //?相關驅動

?????????? +projiect???? // makefile文件

?????????? +scripts????? // Jtag 腳本

?????????? +target??????? // 具體板子相關


LK 流程分析

????????? 在?bootable/bootloadler/lk/arch/arm/ssystem-onesegment.ld 連接文件中 ENTRY(_start)指定 LK 從_start 函數開始,_start 在 lk/arch/crt0.S中 。crt0.S 主要做一些基本的 CPU 的初始化再通過 bl? kmain ;跳轉到 C 代碼中。

????????? kmain 在 lk/kernel/main.c 中


kmain()

??????????? kmain 主要做兩件事:1、本身 lk 這個系統模塊的初始化;2、boot 的啟動初始化動作。

??????????? kmain 源碼分析:

???????????? void kmain()

????????? {

???????????1.初始化進程(lk 中的簡單進程)相關結構體。

?????? ? ? ? thread_init_early();

???????????2.做一些如 關閉 cache,使能 mmu 的 arm 相關工作。

??????????? arch_early_init();

?????????? 3.相關平臺的早期初始化

??????????? platform_early_init();

???????????4.現在就一個函數跳轉,初始化UART(板子相關)

??????????? target_early_init();

???????????5.構造函數相關初始化

??????? ? ? call_constructors();

???????????6.lk系統相關的堆棧初始化

??????????? heap_init();

?????????? 7.簡短的初始化定時器對象

??????????? thread_init();

???????????8.lk系統控制器初始化(相關事件初始化)

??????????? dpc_init();

???????????9.初始化lk中的定時器

??????????? timer_init();
???????????
10.新建線程入口函數?bootstrap2 用于boot 工作(重點)
?????????? thread_resume(thread_create("bootstrap2", &bootstrap2, NULL, DEFAULT_PRIORITY, DEFAULT_STACK_SIZE));

?????????}

???以上與 boot 啟動初始化相關函數是?arch_early_init、? platform_early_init 、bootstrap2,這些是啟動的重點,我們下面慢慢來看。


arch_early_init()

?????????體系架構相關的初始化我們一般用的 ARM 體系

?????????1.關閉cache

???????? arch_disable_cache(UCACHE);

?????????2.設置向量基地址(中斷相關)

???????? set_vector_base(MEMBASE);

?????????3.初始化MMU

???????? arm_mmu_init();

?????????4.初始化MMU映射__平臺相關

???????? platform_init_mmu_mappings();

? ? ? ???5.開啟cache ????????

???????? arch_enable_cache(UCACHE)

?????????6.使能 cp10 和 cp11

???????? __asm__ volatile("mrc?? ?p15, 0, %0, c1, c0, 2" : "=r" (val));

???????? val |= (3<<22)|(3<<20);

?????? ? __asm__ volatile("mcr?? ?p15, 0, %0, c1, c0, 2" :: "r" (val));
?

?? ? ???7.設置使能 fpexc 位?(中斷相關)

??? ??? __asm__ volatile("mrc? p10, 7, %0, c8, c0, 0" : "=r" (val));

??????? val |= (1<<30);

??????? __asm__ volatile("mcr? p10, 7, %0, c8, c0, 0" :: "r" (val));

? ? ? ??8.使能循環計數寄存器

??????? __asm__ volatile("mrc?? ?p15, 0, %0, c9, c12, 0" : "=r" (en));

??????? en &= ~(1<<3);?/*循環計算每個周期*/

??????? en |= 1;?

??????? __asm__ volatile("mcr?? ?p15, 0, %0, c9, c12, 0" :: "r" (en));

???????9.使能循環計數器

?????? en = (1<<31);
?????? __asm__ volatile("mcr?? ?p15, 0, %0, c9, c12, 1" :: "r" (en));


platform_early_init()

???????平臺相關初始化不同平臺不同的初始化下面是msm7x30

? ? ? ??1.初始化中斷

?? ?? ??platform_init_interrupts();

????????2.初始化定時器

????????platform_init_timer();


bootstrap2?

?????????bootstrap2?在kmain的末尾以線程方式開啟。主要分三步:platform_init、target_init、apps_init。

????????1.platform_init

???????????????platform_init 中主要是函數 acpu_clock_init。

?????????????? 在 acpu_clock_init?對 arm11 進行系統時鐘設置,超頻?

????????2.target_init

??????????? ? 針對硬件平臺進行設置。主要對 arm9 和 arm11 的分區表進行整合,初始化flash和讀取FLASH信息

? ? ? ??3.apps_init??

???????????? apps_init 是關鍵,對 LK 中所謂 app 初始化并運行起來,而 aboot_init 就將在這里開始被運行,android?Linux?內核的加載工作就在 aboot_init 中完成的 。


aboot_init

????????1.設置NAND/?EMMC讀取信息頁面大小
????????if (target_is_emmc_boot())

??????? {

????????????????? page_size = 2048;

????????????????? page_mask = page_size - 1;

??????? }

?????? else

?????? {

???????????????? page_size = flash_page_size();

???????????????? page_mask = page_size - 1;

??????? }

????? 2.讀取按鍵信息,判斷是正常開機,還是進入 fastboot ,還是進入recovery 模式

?????? 。。。。。。。。。

??????通過一系列的 if (keys_get_state() == XXX) 判斷

?????? 。。。。。。。。。

????? 3.從 nand 中加載 內核

??????boot_linux_from_flash();

?

????? partition_dump();

????? sz = target_get_max_flash_size();

????? fastboot_init(target_get_scratch_address(), sz);

????? udc_start(); // 開始 USB 協議

?


boot_linux_from_flash

???????????? 主要是內核的加載過程,我們的 boot.img 包含:kernel 頭、kernel、ramdisk、second stage(可以沒有)。

???????????1.讀取boot 頭部

?????????? flash_read(p, offset, raw_header, 2048)?

?????????? offset += 2048;
? ? ? ? ???
2.讀取 內核 ???
?????????? memcmp(hdr->magic, BOOT_MAGIC, BOOT_MAGIC_SIZE)
?????????? n = (hdr->kernel_size + (FLASH_PAGE_SIZE - 1)) & (~(FLASH_PAGE_SIZE - 1));

? ? ? ? ?? flash_read(p, offset, (void*) hdr->kernel_addr, n)

?? ? ? ? ? offset += n;
???????????
3.讀取 ramdisk
? ? ? ? ?? n = (hdr->ramdisk_size + (FLASH_PAGE_SIZE - 1)) & (~(FLASH_PAGE_SIZE - 1));

?????????? flash_read(p, offset, (void*) hdr->ramdisk_addr, n)

?????????? offset += n;

????????????4.啟動內核

????????????? ??boot_linux();//在boot_linux 中entry(0,machtype,tags);從kernel加載在內核中的地址開始運行了。

??????

????????到這里LK的啟動過程就結束了。

?

Android Kernel - Boot Loader

Android Boot loader 的 code 在 bootable/bootloader/lk 底下, LK 是 Little Kernel 的縮寫, 是 andriod bootloader 的核心精神.

?

入口函數在 kernel/main.c 中的 kmain(), 以下就來讀讀這一段 code.

?

?

[c-sharp]?view plaincopyprint?
  • void?kmain(void)??
  • {??
  • ????//?get?us?into?some?sort?of?thread?context???
  • ????thread_init_early();??
  • ????//?early?arch?stuff???
  • ????arch_early_init();??
  • ????//?do?any?super?early?platform?initialization???
  • ????platform_early_init();??
  • ????//?do?any?super?early?target?initialization???
  • ????target_early_init();??
  • ????dprintf(INFO,?"welcome?to?lk/n/n");??
  • ??????
  • ????//?deal?with?any?static?constructors???
  • ????dprintf(SPEW,?"calling?constructors/n");??
  • ????call_constructors();??
  • ????//?bring?up?the?kernel?heap???
  • ????dprintf(SPEW,?"initializing?heap/n");??
  • ????heap_init();??
  • ????//?initialize?the?threading?system???
  • ????dprintf(SPEW,?"initializing?threads/n");??
  • ????thread_init();??
  • ????//?initialize?the?dpc?system???
  • ????dprintf(SPEW,?"initializing?dpc/n");??
  • ????dpc_init();??
  • ????//?initialize?kernel?timers???
  • ????dprintf(SPEW,?"initializing?timers/n");??
  • ????timer_init(); ?
  • #if?(!ENABLE_NANDWRITE)???
  • ????//?create?a?thread?to?complete?system?initialization???
  • ????dprintf(SPEW,?"creating?bootstrap?completion?thread/n");??
  • ????thread_resume(thread_create("bootstrap2",?&bootstrap2,?NULL,?DEFAULT_PRIORITY,?DEFAULT_STACK_SIZE));??
  • ????//?enable?interrupts???
  • ????exit_critical_section();??
  • ????//?become?the?idle?thread???
  • ????thread_become_idle(); ?
  • #else???
  • ????????bootstrap_nandwrite(); ?
  • #endif???
  • }??
  • ?

    ?

    ?

    In include/debug.h: 我們可以看到 dprintf 的第一個參數是代表 debug level.

    ?

    [c-sharp:nogutter]?view plaincopyprint?
  • /*?debug?levels?*/?
  • #define?CRITICAL?0??
  • #define?ALWAYS?0??
  • #define?INFO?1??
  • #define?SPEW?2??
  • ?

    ?

    ?

    In include/debug.h:?

    ?

    ?

    [c-sharp:nogutter]?view plaincopyprint?
  • #define?dprintf(level,?x...)?do?{?if?((level)?<=?DEBUGLEVEL)?{?_dprintf(x);?}?}?while?(0)??
  • ?

    ?

    ?

    所以 dprintf 會依 DEBUGLEVEL 來判斷是否輸出信息.

    ?

    來看第一個 call 的函數: thread_init_early, define in thread.c

    ?

    [c-sharp:nogutter]?view plaincopyprint?
  • void?thread_init_early(void)??
  • {??
  • ????????int?i;??
  • ????????/*?initialize?the?run?queues?*/??
  • ????????for?(i=0;?i?<?NUM_PRIORITIES;?i++)??
  • ????????????????list_initialize(&run_queue[i]);??
  • ????????/*?initialize?the?thread?list?*/??
  • ????????list_initialize(&thread_list);??
  • ????????/*?create?a?thread?to?cover?the?current?running?state?*/??
  • ????????thread_t?*t?=?&bootstrap_thread;??
  • ????????init_thread_struct(t,?"bootstrap");??
  • ????????/*?half?construct?this?thread,?since?we're?already?running?*/??
  • ????????t->priority?=?HIGHEST_PRIORITY;??
  • ????????t->state?=?THREAD_RUNNING;??
  • ????????t->saved_critical_section_count?=?1;??
  • ????????list_add_head(&thread_list,?&t->thread_list_node);??
  • ????????current_thread?=?t;??
  • }??
  • ?

    ?

    ?

    #define NUM_PRIORITIES 32 in include/kernel/thread.h

    ?

    list_initialize() defined in include/list.h: initialized a list

    ?

    ?

    [c-sharp:nogutter]?view plaincopyprint?
  • static?inline?void?list_initialize(struct?list_node?*list)??
  • {??
  • ????????list->prev?=?list->next?=?list;??
  • }??
  • ?

    ?

    ?

    run_queue 是?static struct list_node run_queue[NUM_PRIORITIES]

    ?

    thread_list 是?static struct list_node thread_list

    ?

    再來要 call ?的函數是: arch_early_init() defined in?arch/arm/arch.c

    ?

    [c-sharp:nogutter]?view plaincopyprint?
  • void?arch_early_init(void)??
  • {??
  • ????/*?turn?off?the?cache?*/??
  • ????arch_disable_cache(UCACHE);??
  • ????/*?set?the?vector?base?to?our?exception?vectors?so?we?dont?need?to?double?map?at?0?*/?
  • #if?ARM_CPU_CORTEX_A8???
  • ????set_vector_base(MEMBASE); ?
  • #endif??
  • #if?ARM_WITH_MMU???
  • ????arm_mmu_init();??
  • ????platform_init_mmu_mappings(); ?
  • #endif???
  • ????/*?turn?the?cache?back?on?*/??
  • ????arch_enable_cache(UCACHE); ?
  • #if?ARM_WITH_NEON???
  • ????/*?enable?cp10?and?cp11?*/??
  • ????uint32_t?val;??
  • ????__asm__?volatile("mrc???p15,?0,?%0,?c1,?c0,?2"?:?"=r"?(val));??
  • ????val?|=?(3<<22)|(3<<20);??
  • ????__asm__?volatile("mcr???p15,?0,?%0,?c1,?c0,?2"?::?"r"?(val));??
  • ????/*?set?enable?bit?in?fpexc?*/??
  • ????val?=?(1<<30);??
  • ????__asm__?volatile("mcr??p10,?7,?%0,?c8,?c0,?0"?::?"r"?(val)); ?
  • #endif???
  • }??
  • ?

    ?

    ?

    現代操作系統普遍采用虛擬內存管理(Virtual Memory Management)機制,這需要處理器中的MMU(Memory Management Unit,

    ?

    內存管理單元)提供支持。

    ?

    CPU執行單元發出的內存地址將被MMU截獲,從CPU到MMU的地址稱為虛擬地址(Virtual Address,以下簡稱VA),而MMU將這個地

    ?

    址翻譯成另一個地址發到CPU芯片的外部地址引腳上,也就是將VA映射成PA

    ?

    MMU將VA映射到PA是以頁(Page)為單位的,32位處理器的頁尺寸通常是4KB。例如,MMU可以通過一個映射項將VA的一頁

    ?

    0xb7001000~0xb7001fff映射到PA的一頁0x2000~0x2fff,如果CPU執行單元要訪問虛擬地址0xb7001008,則實際訪問到的物理地

    ?

    址是0x2008。物理內存中的頁稱為物理頁面或者頁幀(Page Frame)。虛擬內存的哪個頁面映射到物理內存的哪個頁幀是通過頁

    ?

    表(Page Table)來描述的,頁表保存在物理內存中,MMU會查找頁表來確定一個VA應該映射到什么PA。

    ?

    ?

    ?

    操作系統和MMU是這樣配合的:

    ?

    1. 操作系統在初始化或分配、釋放內存時會執行一些指令在物理內存中填寫頁表,然后用指令設置MMU,告訴MMU頁表在物理內存中

    ?

    ?? 的什么位置。

    ?

    2. 設置好之后,CPU每次執行訪問內存的指令都會自動引發MMU做查表和地址轉換操作,地址轉換操作由硬件自動完成,不需要用指令

    ?

    ?? ?控制MMU去做。

    ?

    ?

    MMU除了做地址轉換之外,還提供內存保護機制。各種體系結構都有用戶模式(User Mode)和特權模式(Privileged Mode)之分,

    ?

    操作系統可以在頁表中設置每個內存頁面的訪問權限,有些頁面不允許訪問,有些頁面只有在CPU處于特權模式時才允許訪問,有些頁面

    ?

    在用戶模式和特權模式都可以訪問,訪問權限又分為可讀、可寫和可執行三種。這樣設定好之后,當CPU要訪問一個VA時,MMU會檢查

    ?

    CPU當前處于用戶模式還是特權模式,訪問內存的目的是讀數據、寫數據還是取指令,如果和操作系統設定的頁面權限相符,就允許訪

    ?

    問,把它轉換成PA,否則不允許訪問,產生一個異常(Exception)

    ?

    常見的 segmentation fault 產生的原因:

    ?

    用戶程序要訪問一段 VA, 經 MMU 檢查后無權訪問, MMU 會產生異常, CPU 從用戶模式切換到特權模式, 跳轉到內核代碼中執行異常服務程序.

    ?

    內核就會把這個異常解釋為 segmentation fault, 將引發異常的程序終止.

    ?

    簡單的講一下 NEON:?NEON technology can accelerate multimedia and signal processing algorithms such as video encode/decode,

    ?

    2D/3D graphics, gaming, audio and speech processing,?image processing, telephony, and sound synthesis.

    ?

    platform_early_init() defined in platform/<your-platform>/platform.c

    ?

    ?

    [c-sharp:nogutter]?view plaincopyprint?
  • void?platform_early_init(void)??
  • {??
  • ????uart_init();??
  • ????platform_init_interrupts();??
  • ????platform_init_timer();??
  • }??
  • ?

    ?

    ?

    uart_init.c defined in platform/<your-platform>/uart.c 所有用到的變數,也都定義在 uart.c

    ?

    [c-sharp:nogutter]?view plaincopyprint?
  • void?uart_init(void)??
  • {??
  • ????uwr(0x0A,?UART_CR);??/*?disable?TX?and?RX?*/??
  • ??????
  • ????uwr(0x30,?UART_CR);??/*?reset?error?status?*/??
  • ????uwr(0x10,?UART_CR);??/*?reset?receiver?*/??
  • ????uwr(0x20,?UART_CR);??/*?reset?transmitter?*/?
  • ?????
  • #if?PLATFORM_QSD8K???
  • ????/*?TCXO?*/??
  • ????uwr(0x06,?UART_MREG);??
  • ????uwr(0xF1,?UART_NREG);??
  • ????uwr(0x0F,?UART_DREG);??
  • ????uwr(0x1A,?UART_MNDREG); ?
  • #else???
  • ????/*?TCXO/4?*/??
  • ????uwr(0xC0,?UART_MREG);??
  • ????uwr(0xAF,?UART_NREG);??
  • ????uwr(0x80,?UART_DREG);??
  • ????uwr(0x19,?UART_MNDREG);???? ?
  • #endif???
  • ??????
  • ????uwr(0x10,?UART_CR);??/*?reset?RX?*/??
  • ????uwr(0x20,?UART_CR);??/*?reset?TX?*/??
  • ????uwr(0x30,?UART_CR);??/*?reset?error?status?*/??
  • ????uwr(0x40,?UART_CR);??/*?reset?RX?break?*/??
  • ????uwr(0x70,?UART_CR);??/*?rest??*/??
  • ????uwr(0xD0,?UART_CR);??/*?reset?*/??
  • ??????
  • ????uwr(0x7BF,?UART_IPR);?/*?stale?timeout?=?630?*?bitrate?*/??
  • ????uwr(0,?UART_IMR);??
  • ????uwr(115,?UART_RFWR);?/*?RX?watermark?=?58?*?2?-?1?*/??
  • ????uwr(10,?UART_TFWR);??/*?TX?watermark?*/??
  • ??????
  • ????uwr(0,?UART_RFWR);???
  • ??????
  • ????uwr(UART_CSR_115200,?UART_CSR);??
  • ????uwr(0,?UART_IRDA);??
  • ????uwr(0x1E,?UART_HCR);??
  • //??uwr(0x7F4,?UART_MR1);?/*?RFS/?CTS/?500chr?RFR?*/???
  • ????uwr(16,?UART_MR1);??
  • ????uwr(0x34,?UART_MR2);?/*?8N1?*/??
  • ??????
  • ????uwr(0x05,?UART_CR);?/*?enable?TX?&?RX?*/??
  • ????uart_ready?=?1;??
  • }??
  • ?

    ?

    ?

    platform_init_interrupts: defined in platform/msm8x60/interrupts.c

    ?

    ?

    [c-sharp:nogutter]?view plaincopyprint?
  • void?platform_init_interrupts(void)??
  • {??
  • ????platform_gic_dist_init();??
  • ????platform_gic_cpu_init();??
  • }??
  • ?

    ?

    ?

    GIC 指的是 Generic Interrupt Controller. The gic-cpu and gic-dist are two subcomponents of GIC.

    ?

    Devices are wired to the?Git-dist which is in charge of distributing interrupts to the gic-cpu (per cpu IRQ IF).

    ?

    platform_init_timer(): defined in platform/<your-platform>/timer.c

    ?

    [c-sharp:nogutter]?view plaincopyprint?
  • void?platform_init_timer(void)??
  • {??
  • ????writel(0,?DGT_ENABLE);??
  • }??
  • ?

    ?

    ?

    DGT: Digital Game Timer: presents the countdowns of two players, it is also called chess timer or chess clock.

    ?

    target_early_init(): defined in target/init.c

    ?

    ?

    [c-sharp:nogutter]?view plaincopyprint?
  • /*?
  • ?*?default?implementations?of?these?routines,?if?the?target?code?
  • ?*?chooses?not?to?implement.?
  • ?*/??
  • __WEAK?void?target_early_init(void)??
  • {??
  • }??
  • __WEAK?void?target_init(void)??
  • {??
  • }??
  • ?

    ?

    ?

    call_constructors() is defined in kernel/main.c:

    ?

    [c-sharp:nogutter]?view plaincopyprint?
  • static?void?call_constructors(void)??
  • {??
  • ????void?**ctor;??
  • ?????
  • ????ctor?=?&__ctor_list;??
  • ????while(ctor?!=?&__ctor_end)?{??
  • ????????void?(*func)(void);??
  • ????????func?=?(void?(*)())*ctor;??
  • ????????func();??
  • ????????ctor++;??
  • ????}??
  • }??
  • ?

    ?

    ?

    ?

    heap_init is defined in lib/heap/heap.c:

    ?

    ?

    [c-sharp:nogutter]?view plaincopyprint?
  • void?heap_init(void)??
  • {??
  • ????LTRACE_ENTRY;??
  • ????//?set?the?heap?range???
  • ????theheap.base?=?(void?*)HEAP_START;??
  • ????theheap.len?=?HEAP_LEN;??
  • ????LTRACEF("base?%p?size?%zd?bytes/n",?theheap.base,?theheap.len);??
  • ????//?initialize?the?free?list???
  • ????list_initialize(&theheap.free_list);??
  • ????//?create?an?initial?free?chunk???
  • ????heap_insert_free_chunk(heap_create_free_chunk(theheap.base,?theheap.len));??
  • ????//?dump?heap?info???
  • //??heap_dump();???
  • //??dprintf(INFO,?"running?heap?tests/n");???
  • //??heap_test();???
  • }??
  • ?

    ?

    ?

    ?

    thread_init is defined in kernel/thread.c but nothing coded, 先記下.

    ?

    [c-sharp:nogutter]?view plaincopyprint?
  • void?thread_init(void)??
  • {??
  • }??
  • ?

    ?

    ?

    dpc_init() is defined in kernel/dpc.c:

    ?

    ?

    ?

    [c-sharp:nogutter]?view plaincopyprint?
  • void?dpc_init(void)??
  • {??
  • ????event_init(&dpc_event,?false,?0);??
  • ????thread_resume(thread_create("dpc",?&dpc_thread_routine,?NULL,?DPC_PRIORITY,?DEFAULT_STACK_SIZE));??
  • }??
  • ?

    ?

    ?

    dpc 為 Delayed Procedure Call 延遲過程調用的縮寫.

    ?

    timer_init() is defined in kernel/timer.c:

    ?

    [c-sharp:nogutter]?view plaincopyprint?
  • void?timer_init(void)??
  • {??
  • ????list_initialize(&timer_queue);??
  • ????/*?register?for?a?periodic?timer?tick?*/??
  • ????platform_set_periodic_timer(timer_tick,?NULL,?10);?/*?10ms?*/??
  • }??
  • ?

    ?

    ?

    ?

    ?

    執行 thread_resume 或是 bootstrap_nandwrite

    ?

    ?

    ?

    [c-sharp:nogutter]?view plaincopyprint?
  • #if?(!ENABLE_NANDWRITE)???
  • ????//?create?a?thread?to?complete?system?initialization???
  • ????dprintf(SPEW,?"creating?bootstrap?completion?thread/n");??
  • ????thread_resume(thread_create("bootstrap2",?&bootstrap2,?NULL,?DEFAULT_PRIORITY,?DEFAULT_STACK_SIZE));??
  • ????//?enable?interrupts???
  • ????exit_critical_section();??
  • ????//?become?the?idle?thread???
  • ????thread_become_idle(); ?
  • #else???
  • ????????bootstrap_nandwrite(); ?
  • #endif??
  • ?

    ?

    ?

    In kermel/main.c:

    ?

    [c-sharp:nogutter]?view plaincopyprint?
  • static?int?bootstrap2(void?*arg)??
  • {??
  • ????dprintf(SPEW,?"top?of?bootstrap2()/n");??
  • ????arch_init();??
  • ????//?initialize?the?rest?of?the?platform???
  • ????dprintf(SPEW,?"initializing?platform/n");??
  • ????platform_init();??
  • ??????
  • ????//?initialize?the?target???
  • ????dprintf(SPEW,?"initializing?target/n");??
  • ????target_init();??
  • ????dprintf(SPEW,?"calling?apps_init()/n");??
  • ????apps_init();??
  • ????return?0;??
  • } ?
  • #if?(ENABLE_NANDWRITE)???
  • void?bootstrap_nandwrite(void)??
  • {??
  • ????dprintf(SPEW,?"top?of?bootstrap2()/n");??
  • ????arch_init();??
  • ????//?initialize?the?rest?of?the?platform???
  • ????dprintf(SPEW,?"initializing?platform/n");??
  • ????platform_init();??
  • ????//?initialize?the?target???
  • ????dprintf(SPEW,?"initializing?target/n");??
  • ????target_init();??
  • ????dprintf(SPEW,?"calling?nandwrite_init()/n");??
  • ????nandwrite_init();??
  • ????return?0;??
  • } ?
  • #endif??
  • ?

    ?

    ?

    continue to see apps_init():?app/app.c:void apps_init(void)

    ?

    ?

    [c-sharp]?view plaincopyprint?
  • #include?<app.h>??
  • #include?<kernel/thread.h>???
  • extern?const?struct?app_descriptor?__apps_start;??
  • extern?const?struct?app_descriptor?__apps_end;??
  • static?void?start_app(const?struct?app_descriptor?*app);??
  • /*?one?time?setup?*/??
  • void?apps_init(void)??
  • {??
  • ????const?struct?app_descriptor?*app;??
  • ????/*?call?all?the?init?routines?*/??
  • ????for?(app?=?&__apps_start;?app?!=?&__apps_end;?app++)?{??
  • ????????if?(app->init)??
  • ????????????app->init(app);??
  • ????}??
  • ????/*?start?any?that?want?to?start?on?boot?*/??
  • ????for?(app?=?&__apps_start;?app?!=?&__apps_end;?app++)?{??
  • ????????if?(app->entry?&&?(app->flags?&?APP_FLAG_DONT_START_ON_BOOT)?==?0)?{??
  • ????????????start_app(app);??
  • ????????}??
  • ????}??
  • }??
  • static?int?app_thread_entry(void?*arg)??
  • {??
  • ????const?struct?app_descriptor?*app?=?(const?struct?app_descriptor?*)arg;??
  • ????app->entry(app,?NULL);??
  • ????return?0;??
  • }??
  • static?void?start_app(const?struct?app_descriptor?*app)??
  • {??
  • ????printf("starting?app?%s/n",?app->name);??
  • ????thread_resume(thread_create(app->name,?&app_thread_entry,?(void?*)app,?DEFAULT_PRIORITY,?DEFAULT_STACK_SIZE));?????
  • }??
  • ?

    ?

    ?

    至于會有那些 app 被放入 boot thread section, 則定義在 include/app.h 中的 APP_START(appname)

    ?

    [c-sharp:nogutter]?view plaincopyprint?
  • #define?APP_START(appname)?struct?app_descriptor?_app_##appname?__SECTION(".apps")?=?{?.name?=?#appname,?
  • #define?APP_END?};??
  • ?

    ?

    ?

    在 app 中只要像 app/aboot/aboot.c 指定就會在 bootloader bootup 時放入 thread section 中被執行.

    ?

    ?

    [c-sharp:nogutter]?view plaincopyprint?
  • APP_START(aboot)??
  • ????????.init?=?aboot_init,??
  • APP_END??
  • ?

    ?

    ?

    在我的 bootloader 中有 app/aboot/aboot.c, app/tests/tests.c, app/shell/shell.c, 及 app/stringtests/string_tests.c 皆有此聲明.

    ?

    接下來關注: aboot.c 中的 aboot_init()

    ?

    [c-sharp:nogutter]?view plaincopyprint?
  • void?aboot_init(const?struct?app_descriptor?*app)??
  • {??
  • ????unsigned?reboot_mode?=?0;??
  • ????unsigned?disp_init?=?0;??
  • ????unsigned?usb_init?=?0;??
  • ????//test_ram();???
  • ????/*?Setup?page?size?information?for?nand/emmc?reads?*/??
  • ????if?(target_is_emmc_boot())??
  • ????{??
  • ????????page_size?=?2048;??
  • ????????page_mask?=?page_size?-?1;??
  • ????}??
  • ????else??
  • ????{??
  • ????????page_size?=?flash_page_size();??
  • ????????page_mask?=?page_size?-?1;??
  • ????}??
  • ????/*?Display?splash?screen?if?enabled?*/?
  • ????#if?DISPLAY_SPLASH_SCREEN???
  • ????display_init();??
  • ????dprintf(INFO,?"Diplay?initialized/n");??
  • ????disp_init?=?1;??
  • ????diplay_image_on_screen(); ?
  • ????#endif???
  • ????/*?Check?if?we?should?do?something?other?than?booting?up?*/??
  • ????if?(keys_get_state(KEY_HOME)?!=?0)??
  • ????????boot_into_recovery?=?1;??
  • ????if?(keys_get_state(KEY_BACK)?!=?0)??
  • ????????goto?fastboot;??
  • ????if?(keys_get_state(KEY_CLEAR)?!=?0)??
  • ????????goto?fastboot; ?
  • ????#if?NO_KEYPAD_DRIVER???
  • ????/*?With?no?keypad?implementation,?check?the?status?of?USB?connection.?*/??
  • ????/*?If?USB?is?connected?then?go?into?fastboot?mode.?*/??
  • ????usb_init?=?1;??
  • ????udc_init(&surf_udc_device);??
  • ????if?(usb_cable_status())??
  • ????????goto?fastboot; ?
  • ????#endif???
  • ????init_vol_key();??
  • ????if(voldown_press())??
  • ????????goto?fastboot;??
  • ????reboot_mode?=?check_reboot_mode();??
  • ????if?(reboot_mode?==?RECOVERY_MODE)?{??
  • ????????boot_into_recovery?=?1;??
  • ????}?else?if(reboot_mode?==?FASTBOOT_MODE)?{??
  • ????????goto?fastboot;??
  • ????}??
  • ????if?(target_is_emmc_boot())??
  • ????{??
  • ????????boot_linux_from_mmc();??
  • ????}??
  • ????else??
  • ????{??
  • ????????recovery_init();??
  • ????????boot_linux_from_flash();??
  • ????}??
  • ????dprintf(CRITICAL,?"ERROR:?Could?not?do?normal?boot.?Reverting?"??
  • ????????"to?fastboot?mode./n");??
  • fastboot:??
  • ????if(!usb_init)??
  • ????????udc_init(&surf_udc_device);??
  • ????fastboot_register("boot",?cmd_boot);??
  • ????if?(target_is_emmc_boot())??
  • ????{??
  • ????????fastboot_register("flash:",?cmd_flash_mmc);??
  • ????????fastboot_register("erase:",?cmd_erase_mmc);??
  • ????}??
  • ????else??
  • ????{??
  • ????????fastboot_register("flash:",?cmd_flash);??
  • ????????fastboot_register("erase:",?cmd_erase);??
  • ????}??
  • ????fastboot_register("continue",?cmd_continue);??
  • ????fastboot_register("reboot",?cmd_reboot);??
  • ????fastboot_register("reboot-bootloader",?cmd_reboot_bootloader);??
  • ????fastboot_publish("product",?TARGET(BOARD));??
  • ????fastboot_publish("kernel",?"lk");??
  • ??????
  • ????fastboot_init(target_get_scratch_address(),?120?*?1024?*?1024);??
  • ??????
  • ????udc_start();??
  • ????target_battery_charging_enable(1,?0);??
  • }??
  • ?

    ?

    ?


    ?

    target_is_emmc_boot() is defined in target/init.c: _EMMC_BOOT 是 compiler 時的 flags

    ?

    ?

    [c-sharp:nogutter]?view plaincopyprint?
  • __WEAK?int?target_is_emmc_boot(void)??
  • { ?
  • #if?_EMMC_BOOT???
  • ????return?1; ?
  • #else???
  • ????return?0; ?
  • #endif???
  • }??
  • ?

    ?

    ?

    check_reboot_mode is defined in target/<your-platform>/init.c:

    ?

    [c-sharp:nogutter]?view plaincopyprint?
  • unsigned?check_reboot_mode(void)??
  • {??
  • ????????unsigned?restart_reason?=?0;??
  • ????????void?*restart_reason_addr?=?0x401FFFFC;??
  • ????????/*?Read?reboot?reason?and?scrub?it?*/??
  • ????????restart_reason?=?readl(restart_reason_addr);??
  • ????????writel(0x00,?restart_reason_addr);??
  • ????????return?restart_reason;??
  • }??
  • ?

    ?

    ?

    reboot mode in bootloader:

    ?

    ?

    [c-sharp:nogutter]?view plaincopyprint?
  • #define?RECOVERY_MODE???0x77665502??
  • #define?FASTBOOT_MODE???0x77665500??
  • ?

    ?

    ?

    ?

    再來就會執行?boot_linux_from_mmc():

    ?

    [c-sharp:nogutter]?view plaincopyprint?
  • int?boot_linux_from_mmc(void)??
  • {??
  • ????struct?boot_img_hdr?*hdr?=?(void*)?buf;??
  • ????struct?boot_img_hdr?*uhdr;??
  • ????unsigned?offset?=?0;??
  • ????unsigned?long?long?ptn?=?0;??
  • ????unsigned?n?=?0;??
  • ????const?char?*cmdline;??
  • ????uhdr?=?(struct?boot_img_hdr?*)EMMC_BOOT_IMG_HEADER_ADDR;??
  • ????if?(!memcmp(uhdr->magic,?BOOT_MAGIC,?BOOT_MAGIC_SIZE))?{??
  • ????????dprintf(INFO,?"Unified?boot?method!/n");??
  • ????????hdr?=?uhdr;??
  • ????????goto?unified_boot;??
  • ????}??
  • ????if(!boot_into_recovery)??
  • ????{??
  • ????????ptn?=?mmc_ptn_offset("boot");??
  • ????????if(ptn?==?0)?{??
  • ????????????dprintf(CRITICAL,?"ERROR:?No?boot?partition?found/n");??
  • ????????????????????return?-1;??
  • ????????}??
  • ????}??
  • ????else??
  • ????{??
  • ????????ptn?=?mmc_ptn_offset("recovery");??
  • ????????if(ptn?==?0)?{??
  • ????????????dprintf(CRITICAL,?"ERROR:?No?recovery?partition?found/n");??
  • ????????????????????return?-1;??
  • ????????}??
  • ????}??
  • ????if?(mmc_read(ptn?+?offset,?(unsigned?int?*)buf,?page_size))?{??
  • ????????dprintf(CRITICAL,?"ERROR:?Cannot?read?boot?image?header/n");??
  • ????????????????return?-1;??
  • ????}??
  • ????if?(memcmp(hdr->magic,?BOOT_MAGIC,?BOOT_MAGIC_SIZE))?{??
  • ????????dprintf(CRITICAL,?"ERROR:?Invaled?boot?image?header/n");??
  • ????????????????return?-1;??
  • ????}??
  • ????if?(hdr->page_size?&&?(hdr->page_size?!=?page_size))?{??
  • ????????page_size?=?hdr->page_size;??
  • ????????page_mask?=?page_size?-?1;??
  • ????}??
  • ????offset?+=?page_size;??
  • ????n?=?ROUND_TO_PAGE(hdr->kernel_size,?page_mask);??
  • ????if?(mmc_read(ptn?+?offset,?(void?*)hdr->kernel_addr,?n))?{??
  • ????????dprintf(CRITICAL,?"ERROR:?Cannot?read?kernel?image/n");??
  • ????????????????return?-1;??
  • ????}??
  • ????offset?+=?n;??
  • ????n?=?ROUND_TO_PAGE(hdr->ramdisk_size,?page_mask);??
  • ????if?(mmc_read(ptn?+?offset,?(void?*)hdr->ramdisk_addr,?n))?{??
  • ????????dprintf(CRITICAL,?"ERROR:?Cannot?read?ramdisk?image/n");??
  • ????????????????return?-1;??
  • ????}??
  • ????offset?+=?n;??
  • unified_boot:??
  • ????dprintf(INFO,?"/nkernel??@?%x?(%d?bytes)/n",?hdr->kernel_addr,??
  • ????????hdr->kernel_size);??
  • ????dprintf(INFO,?"ramdisk?@?%x?(%d?bytes)/n",?hdr->ramdisk_addr,??
  • ????????hdr->ramdisk_size);??
  • ????if(hdr->cmdline[0])?{??
  • ????????cmdline?=?(char*)?hdr->cmdline;??
  • ????}?else?{??
  • ????????cmdline?=?DEFAULT_CMDLINE;??
  • ????}??
  • ????dprintf(INFO,?"cmdline?=?'%s'/n",?cmdline);??
  • ????dprintf(INFO,?"/nBooting?Linux/n");??
  • ????boot_linux((void?*)hdr->kernel_addr,?(void?*)TAGS_ADDR,??
  • ???????????(const?char?*)cmdline,?board_machtype(),??
  • ???????????(void?*)hdr->ramdisk_addr,?hdr->ramdisk_size);??
  • ????return?0;??
  • }??
  • ?

    ?

    ?

    mmc_read() is defined in platform/<your-platform>/mmc.c:

    ?

    ?

    [c-sharp:nogutter]?view plaincopyprint?
  • unsigned?int?mmc_read?(unsigned?long?long?data_addr,?unsigned?int*?out,?unsigned?int?data_len)??
  • {??
  • ????int?val?=?0;??
  • ????val?=?mmc_boot_read_from_card(?&mmc_host,?&mmc_card,?data_addr,?data_len,?out);??
  • ????return?val;??
  • }??
  • ?

    ?

    ?

    boot_linux(): 啟動 Linux, 看看函數定義

    ?

    [c-sharp:nogutter]?view plaincopyprint?
  • void?boot_linux(void?*kernel,?unsigned?*tags,???
  • ????????const?char?*cmdline,?unsigned?machtype,??
  • ????????void?*ramdisk,?unsigned?ramdisk_size)??
  • {??
  • ????unsigned?*ptr?=?tags;??
  • ????unsigned?pcount?=?0;??
  • ????void?(*entry)(unsigned,unsigned,unsigned*)?=?kernel;??
  • ????struct?ptable?*ptable;??
  • ????int?cmdline_len?=?0;??
  • ????int?have_cmdline?=?0;??
  • ????int?pause_at_bootup?=?0;??
  • ????/*?CORE?*/??
  • ????*ptr++?=?2;??
  • ????*ptr++?=?0x54410001;??
  • ????if?(ramdisk_size)?{??
  • ????????*ptr++?=?4;??
  • ????????*ptr++?=?0x54420005;??
  • ????????*ptr++?=?(unsigned)ramdisk;??
  • ????????*ptr++?=?ramdisk_size;??
  • ????}??
  • ????ptr?=?target_atag_mem(ptr);??
  • ????if?(!target_is_emmc_boot())?{??
  • ????????/*?Skip?NAND?partition?ATAGS?for?eMMC?boot?*/??
  • ????????if?((ptable?=?flash_get_ptable())?&&?(ptable->count?!=?0))?{??
  • ????????????int?i;??
  • ????????????for(i=0;?i?<?ptable->count;?i++)?{??
  • ????????????????struct?ptentry?*ptn;??
  • ????????????????ptn?=??ptable_get(ptable,?i);??
  • ????????????????if?(ptn->type?==?TYPE_APPS_PARTITION)??
  • ????????????????????pcount++;??
  • ????????????}??
  • ????????????*ptr++?=?2?+?(pcount?*?(sizeof(struct?atag_ptbl_entry)?/??
  • ???????????????????????????????sizeof(unsigned)));??
  • ????????????*ptr++?=?0x4d534d70;??
  • ????????????for?(i?=?0;?i?<?ptable->count;?++i)??
  • ????????????????ptentry_to_tag(&ptr,?ptable_get(ptable,?i));??
  • ????????}??
  • ????}??
  • ????if?(cmdline?&&?cmdline[0])?{??
  • ????????cmdline_len?=?strlen(cmdline);??
  • ????????have_cmdline?=?1;??
  • ????}??
  • ????if?(target_is_emmc_boot())?{??
  • ????????cmdline_len?+=?strlen(emmc_cmdline);??
  • ????}??
  • ????if?(target_pause_for_battery_charge())?{??
  • ????????pause_at_bootup?=?1;??
  • ????????cmdline_len?+=?strlen(battchg_pause);??
  • ????}??
  • ????if?(cmdline_len?>?0)?{??
  • ????????const?char?*src;??
  • ????????char?*dst;??
  • ????????unsigned?n;??
  • ????????/*?include?terminating?0?and?round?up?to?a?word?multiple?*/??
  • ????????n?=?(cmdline_len?+?4)?&?(~3);??
  • ????????*ptr++?=?(n?/?4)?+?2;??
  • ????????*ptr++?=?0x54410009;??
  • ????????dst?=?(char?*)ptr;??
  • ????????if?(have_cmdline)?{??
  • ????????????src?=?cmdline;??
  • ????????????while?((*dst++?=?*src++));??
  • ????????}??
  • ????????if?(target_is_emmc_boot())?{??
  • ????????????src?=?emmc_cmdline;??
  • ????????????if?(have_cmdline)?--dst;??
  • ????????????have_cmdline?=?1;??
  • ????????????while?((*dst++?=?*src++));??
  • ????????}??
  • ????????if?(pause_at_bootup)?{??
  • ????????????src?=?battchg_pause;??
  • ????????????if?(have_cmdline)?--dst;??
  • ????????????while?((*dst++?=?*src++));??
  • ????????}??
  • ????????ptr?+=?(n?/?4);??
  • ????}??
  • ????/*?END?*/??
  • ????*ptr++?=?0;??
  • ????*ptr++?=?0;??
  • ????dprintf(INFO,?"booting?linux?@?%p,?ramdisk?@?%p?(%d)/n",??
  • ????????kernel,?ramdisk,?ramdisk_size);??
  • ????if?(cmdline)??
  • ????????dprintf(INFO,?"cmdline:?%s/n",?cmdline);??
  • ????enter_critical_section();??
  • ????platform_uninit_timer();??
  • ????arch_disable_cache(UCACHE);??
  • ????arch_disable_mmu(); ?
  • #if?DISPLAY_SPLASH_SCREEN???
  • ????display_shutdown(); ?
  • #endif???
  • ????entry(0,?machtype,?tags);??
  • }??
  • ?

    ?

    ?

    配合 boot.img 來看會比較好理解.

    ?

    ?

    ?

    由此可知?boot_img_hdr?中各成員值為:

    ?

    ?

    ?

    TAGS_ADDR 如上 target/<your-platform>/rules.mk 所定義的 : 0x40200100,?所以 boot_linux(), 就是傳入TAGS_ADDR,

    ?

    然后將資料寫入 tag, tag 的結構如下所示.

    ?

    ?

    然后進入到 kernel 的入口函數: entry(0, machtype, tags)











    本文轉自張昺華-sky博客園博客,原文鏈接:http://www.cnblogs.com/sky-heaven/p/6077828.html,如需轉載請自行聯系原作者


    創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的Android Bootloader LittleKernel的两篇文章 【转】的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    人人爽人人爽人人爽 | 精品成人国产 | 婷婷色五| 日本午夜免费福利视频 | 欧美日韩xxxxx| 亚洲精品乱码久久久久久蜜桃不爽 | 亚洲自拍偷拍色图 | 亚洲高清在线视频 | 色婷婷亚洲婷婷 | 国产视频综合在线 | 久久综合精品国产一区二区三区 | 亚洲综合激情小说 | 看v片| 国产免费一区二区三区最新 | 九九热免费在线视频 | 欧美综合在线视频 | 天天天天天天天操 | 精品免费国产一区二区三区四区 | 免费av福利 | 成片人卡1卡2卡3手机免费看 | 国产日韩中文在线 | 久久久精品成人 | 日韩视频免费观看高清 | 久久久久黄| 久章操| 色偷偷888欧美精品久久久 | 天天综合网久久综合网 | 中文字幕最新精品 | 久草视频手机在线 | 91视频3p | 成人一区二区在线 | 久久精品免视看 | 免费在线观看日韩欧美 | 韩国av电影在线观看 | 国产亚洲免费的视频看 | 日韩三级视频在线观看 | 国语自产偷拍精品视频偷 | 国产精品美女免费看 | 免费在线激情电影 | 天天干天天射天天操 | 四虎成人精品永久免费av | 国产一区视频在线观看免费 | 2019中文 | 五月婷婷香蕉 | 亚洲综合在线一区二区三区 | 中文字幕视频播放 | 一区二区三区高清在线 | 国产精品婷婷 | 日韩精品电影在线播放 | 久久久一本精品99久久精品 | 国产在线 一区二区三区 | 国产亚洲精品成人av久久影院 | 免费网站在线观看成人 | 成人a视频 | 五月婷视频 | 色视频在线免费观看 | 欧美日韩二区三区 | 亚洲伦理中文字幕 | 久草视频在线观 | 国产美女黄网站免费 | 韩国精品一区二区三区六区色诱 | 亚洲精品99久久久久久 | 日本黄色免费观看 | 亚洲欧美视屏 | 美女国内精品自产拍在线播放 | 91免费观看视频网站 | 亚洲精品一区二区三区在线观看 | 在线中文字幕一区二区 | 六月激情丁香 | 好看av在线 | 亚洲激情 欧美激情 | 国产区在线视频 | av在线播放观看 | aaa日本高清在线播放免费观看 | 欧美亚洲国产一卡 | www在线观看视频 | 91九色porny在线 | 成人91在线观看 | 91精品秘密在线观看 | 亚洲女人天堂成人av在线 | 人人爱天天操 | 欧美成年网站 | 在线中文字幕网站 | 黄色免费在线看 | 一区二区三区久久 | 久久不卡国产精品一区二区 | 成人国产精品久久久春色 | 93久久精品日日躁夜夜躁欧美 | 亚洲综合欧美精品电影 | 中文字幕av全部资源www中文字幕在线观看 | 日韩手机在线观看 | 国内精品久久久久国产 | 免费日韩 精品中文字幕视频在线 | 丰满少妇久久久 | free,性欧美 九九交易行官网 | 国产精品热视频 | 免费观看国产精品 | 伊人久操 | 四虎永久国产精品 | 黄色网在线免费观看 | 91av片| 黄色官网在线观看 | 公与妇乱理三级xxx 在线观看视频在线观看 | 亚洲91精品在线观看 | 亚洲综合狠狠干 | 久草精品资源 | 天堂在线视频中文网 | 99热官网| 黄网站www | 欧美日韩免费在线观看视频 | 热久久最新地址 | 99久久婷婷 | 亚洲手机av | 欧美国产日韩激情 | 中文字幕国产一区二区 | 亚洲资源 | 免费看的视频 | 久久久www成人免费精品张筱雨 | 日韩高清成人在线 | 久久午夜精品视频 | 懂色av懂色av粉嫩av分享吧 | 亚洲国内在线 | 亚洲国产精品日韩 | 在线观看成人国产 | 欧美中文字幕久久 | 婷婷丁香综合 | 中文字幕一区二区三区四区视频 | 波多野结衣一区三区 | 六月久久婷婷 | 国产亚洲免费观看 | 日本久久精品视频 | 日日夜夜综合网 | 天天操福利视频 | 亚洲精品黄色在线观看 | 亚洲精品视频在线观看免费 | 91亚洲精品乱码久久久久久蜜桃 | 又黄又爽的免费高潮视频 | 91精品国产九九九久久久亚洲 | 涩涩资源网 | 欧美成年性| 免费看的黄色片 | 亚洲精品在线一区二区 | 97视频在线观看视频免费视频 | 中文字幕在线观看第二页 | 亚洲毛片在线观看. | 国产黄色资源 | 91精品国| 国产色黄网站 | 久久久91精品国产 | 99在线热播精品免费 | 在线观看成年人 | 99热精品视| 色婷婷www| 亚洲精品玖玖玖av在线看 | 久久影院精品 | 国产日韩在线观看一区 | 一级免费黄视频 | 亚洲欧美日韩不卡 | 免费成人在线观看视频 | 天堂在线成人 | aaa毛片视频 | 天天操天天操天天操 | 日本精品在线 | 美女在线免费视频 | 好看av在线 | 91热精品| 九九热99视频 | 色网站中文字幕 | 97精品一区 | 国产精品久久网 | 亚洲免费成人av电影 | 中文字幕中文字幕在线中文字幕三区 | 综合网五月天 | 国产精品第一 | 亚洲午夜小视频 | 天天爽天天爽天天爽 | 国产视频首页 | 国产爽妇网 | 久久久久久久久久免费视频 | 中文字幕免费观看全部电影 | 婷婷亚洲综合五月天小说 | 精品福利在线 | 国产精久久久久久妇女av | 亚洲无在线 | 四虎国产精品永久在线国在线 | 天天操夜夜干 | 在线国产视频一区 | 亚洲欧美视频一区二区三区 | 亚洲国产精品成人av | 中文字幕人成一区 | 久久免费看片 | 久久精品4 | 91香蕉国产在线观看软件 | 91精品久久久久久久99蜜桃 | 国产成人精品久久亚洲高清不卡 | 在线看片一区 | 国产精品爽爽久久久久久蜜臀 | 字幕网资源站中文字幕 | av福利在线导航 | 亚洲国产精品久久久久久 | 中文字幕中文字幕在线中文字幕三区 | 天天摸天天操天天舔 | 激情婷婷久久 | 免费大片黄在线 | 黄色成人av| 人人擦| 亚洲欧美日韩国产精品一区午夜 | 麻花传媒mv免费观看 | 亚州国产视频 | 在线免费观看欧美日韩 | 日韩三级精品 | 国产精品久久久久久久久久久免费看 | 日韩av有码在线 | 欧美成人在线网站 | 五月天天av | 久久久综合电影 | 激情丁香 | 欧洲精品码一区二区三区免费看 | 国产精品欧美久久久久无广告 | 349k.cc看片app | 在线小视频你懂得 | 亚洲精品国产综合99久久夜夜嗨 | 日韩va亚洲va欧美va久久 | 天天综合久久综合 | 日本久久久精品视频 | 中文一区二区三区在线观看 | 日日色综合 | 日韩av三区 | 中文字幕一区二区三区四区久久 | avv天堂| 欧美色插 | 欧美analxxxx| 久久综合九色综合欧美狠狠 | 国产在线观看污片 | 99爱这里只有精品 | 国产午夜三级一二三区 | 亚洲一区二区观看 | 99久热在线精品视频成人一区 | 97成人在线 | 国产精品国产三级国产 | 成人黄色中文字幕 | 欧美一级电影在线观看 | 开心色激情网 | 欧美最猛性xxxxx免费 | 成人一区二区三区中文字幕 | 亚洲精品在线免费看 | 在线色网站| 成人免费大片黄在线播放 | 丝袜美腿亚洲综合 | 一区二区三区在线观看中文字幕 | 国产一区二区日本 | 天天精品视频 | 操操操日日日干干干 | 欧美日韩国产精品久久 | 六月色丁 | 久久久三级视频 | 日日夜夜免费精品视频 | 99婷婷狠狠成为人免费视频 | 免费黄色在线网址 | 一区二区视频播放 | 香蕉视频网站在线观看 | 免费日韩av片 | 欧美亚洲成人免费 | 日韩欧美视频在线免费观看 | 久久久久国产一区二区 | 伊人资源站 | 一区二区三区在线免费 | 欧美一级黄色网 | 欧美做受高潮1 | 午夜精品福利影院 | 黄色1级大片 | 免费看短 | 中文乱幕日产无线码1区 | 丁香婷婷综合激情 | av三级在线看| 97成人精品 | 欧美成人手机版 | 91日本在线播放 | 久久试看| 97人人射| 日本电影黄色 | 国产精久久久久久久 | 欧美精选一区二区三区 | 中文字幕婷婷 | 亚洲国产成人在线播放 | 国产精品久久艹 | 亚洲一一在线 | 国产午夜精品一区二区三区嫩草 | 在线国产黄色 | 中文字幕一区二区三区乱码在线 | 天天插夜夜操 | 国产精品久久久久aaaa九色 | 狠狠色噜噜狠狠 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 婷婷丁香九月 | 久久久久久久久久免费 | 在线免费91 | 成年一级片| 久久精品国产成人 | 国产一区二区三精品久久久无广告 | 中文字幕高清免费日韩视频在线 | 欧美日韩在线精品一区二区 | 在线播放国产一区二区三区 | 狠狠夜夜 | 国产成人精品日本亚洲999 | 国产资源网站 | 欧美 日韩 成人 | 国产成人精品亚洲精品 | 天天性天天草 | 99久久久久久久久 | 国产四虎在线 | 日本高清免费中文字幕 | 欧美精选一区二区三区 | 久久99爱视频 | 久久久久久毛片精品免费不卡 | 欧美精品三级在线观看 | 国产精品久久久久久久99 | 国产1区2区3区精品美女 | 婷婷视频在线播放 | 国产一区二区日本 | 日韩欧美在线观看一区二区三区 | 国产成人黄色在线 | 国产精品久久精品国产 | 在线视频中文字幕一区 | www.黄色小说.com | 在线观看中文字幕视频 | 伊人色**天天综合婷婷 | 日韩在线观看免费 | 久草在线免费在线观看 | 久久免费精品一区二区三区 | av蜜桃在线 | 国产亚洲成av片在线观看 | 日韩精品在线免费观看 | 天天色天天色天天色 | 在线看黄网站 | 久久视频在线视频 | 国产精品女同一区二区三区久久夜 | 久久久高清免费视频 | 国产在线一线 | 欧美一级小视频 | 天天综合狠狠精品 | 人人艹人人 | 国产最新在线视频 | 国产色视频网站 | 国产视频一区精品 | 欧美99精品| 亚洲欧美日韩国产一区二区 | 欧美精品久久 | 成人av一二三区 | 欧美精品一区二区免费 | 国产一级片在线播放 | 91女人18片女毛片60分钟 | 8x成人免费视频 | 一级淫片在线观看 | 精品一二三区 | 91av视频网 | 91黄视频在线 | 久久久久久久久久久久久久电影 | 欧美小视频在线 | 91av在线免费播放 | 免费看成人片 | 一本色道久久精品 | 在线国产精品一区 | 久久久国产一区二区 | 亚洲国产中文在线观看 | 黄色一二级片 | 99色网站 | 在线观看亚洲专区 | www在线观看国产 | 亚洲网站在线 | 亚洲美女久久 | 天天操综合| 免费看黄色小说的网站 | 久久久久久视频 | 久久xx视频 | 伊人精品在线 | 激情视频一区 | 久久伦理 | 草久久精品| 欧美尹人 | 国产97免费| 在线观看视频一区二区 | 99久在线精品99re8热视频 | 国产成人精品久久亚洲高清不卡 | 亚洲国产丝袜在线观看 | 免费欧美| 久久情爱 | 日韩成人看片 | av大全在线看 | 欧美大片第1页 | 正在播放国产一区二区 | 国产一二三区在线观看 | 久草久草在线 | 亚洲天天做 | 久久国产免费视频 | 久草视频免费 | 免费看污在线观看 | 2019精品手机国产品在线 | 日韩免费看片 | 超碰国产在线观看 | 成年人网站免费在线观看 | 五月天久久综合网 | 国产精品第10页 | 国产aa精品| 久久久麻豆视频 | 久久久福利视频 | 玖玖玖精品 | 黄色成人小视频 | 制服丝袜在线91 | 欧美 激情在线 | 人人草人人草 | 国产精品久久久久久久久久99 | 国产色爽 | 亚洲 中文字幕av | 中文字幕色播 | 亚洲精品久久视频 | 久久人人添人人爽添人人88v | 国产精品免费视频久久久 | 天天搞天天| 国产精品6999成人免费视频 | 人人爽久久涩噜噜噜网站 | 久久夜色精品国产欧美一区麻豆 | 人人草在线视频 | 婷婷精品在线视频 | 一区二区三区在线不卡 | 中文字幕高清免费日韩视频在线 | 久久亚洲在线 | 九九九热视频 | 中文字幕精品一区 | 在线观看中文字幕一区二区 | 成人在线视频观看 | 久久精品视频在线观看免费 | 国产呻吟在线 | 韩国在线一区二区 | 一级片观看 | 天天摸天天操天天舔 | 久久观看免费视频 | 日韩av网址在线 | 超级碰碰碰碰 | 国产永久网站 | 国产白浆视频 | 久久免费观看视频 | 五月激情丁香婷婷 | 日韩欧美电影 | 日韩免费网站 | 精品久久一区 | 伊人天天操 | 国产成人精品不卡 | 婷婷久草| 日韩伦理一区二区三区av在线 | 国产成人久久av免费高清密臂 | 久久久精品国产免费观看同学 | 91精品国产欧美一区二区 | 欧美亚洲国产一卡 | 天天综合天天做天天综合 | 亚洲国产成人精品电影在线观看 | 国产亚洲综合精品 | 久久九九影视网 | 国产精品资源在线观看 | 一区二区三区电影大全 | 成人av片免费观看app下载 | 麻花天美星空视频 | 日韩av中文在线观看 | av中文字幕在线免费观看 | 亚洲欧美在线视频免费 | 久久99网站 | 特级毛片网站 | 在线免费视频 你懂得 | 色婷婷在线观看视频 | 亚洲精品乱码久久久久v最新版 | 成人av动漫在线 | 久草精品在线播放 | 欧美极品少妇xbxb性爽爽视频 | 日本精品视频免费观看 | 伊人久久在线观看 | 美女网站视频免费黄 | 日韩中文字幕免费视频 | 91看片淫黄大片在线播放 | 国产一级片免费视频 | 97免费公开视频 | 激情欧美在线观看 | 国产精品精品久久久久久 | 欧美日韩中文国产一区发布 | 不卡av电影在线 | 亚洲最大av | 色综合久久88色综合天天6 | 国产精品ⅴa有声小说 | 亚洲va天堂va欧美ⅴa在线 | 国产在线美女 | 成人小视频在线观看免费 | 日韩av影片在线观看 | 色a网| 一区二区三区福利 | 国产女做a爱免费视频 | 成人av在线网 | 丁香一区二区 | 在线欧美日韩 | 黄色aaaaa| 超碰人人在线观看 | 免费观看mv大片高清 | 国产一区久久 | 黄污网 | 最近中文字幕在线播放 | a视频在线观看免费 | 国产中文伊人 | va视频在线观看 | 国产黄免费在线观看 | 91成人精品一区在线播放 | 欧美日韩在线精品一区二区 | 国产伦精品一区二区三区高清 | 五月天激情综合网 | 丁香六月伊人 | 日韩精品欧美专区 | 久久99九九99精品 | 操操日 | 在线观看免费 | 欧美a级在线免费观看 | 在线观看久久久久久 | 国产精品久久久久久妇 | 久久激情五月丁香伊人 | 四虎最新域名 | 国产99在线播放 | 久久综合在线 | 久久在线视频精品 | 国产精品国产三级国产aⅴ9色 | 日本不卡一区二区 | 欧美日韩天堂 | 911免费视频 | 中文有码在线 | 九九久久久久99精品 | 日韩欧在线 | av看片网| 欧美性脚交 | 伊人春色电影网 | 深爱激情五月综合 | 中文字幕在线影视资源 | 久久久免费观看视频 | 在线播放一区二区三区 | 国产精品永久久久久久久久久 | 美女视频免费一区二区 | 国产精品国产三级国产专区53 | 国产精品一区二区电影 | 亚洲伊人色| 国产美女精品视频免费观看 | 91国内在线 | 国产精品你懂的在线观看 | 探花视频免费在线观看 | 精品国产伦一区二区三区观看体验 | 亚洲精品国产电影 | 免费a视频 | 黄色一级在线观看 | 成人亚洲精品久久久久 | 怡春院av | 97影视 | 在线观看完整版 | 91精品成人 | 欧美日韩国产一二 | 亚洲最新精品 | 四虎影视成人精品国库在线观看 | 国产精品久久久久av福利动漫 | 久久久精品国产一区二区电影四季 | 国产超碰在线 | 天天干夜夜擦 | 狠狠色丁香九九婷婷综合五月 | 大型av综合网站 | 欧美美女视频在线观看 | 99视屏| 国产高清视频在线免费观看 | av中文字幕在线观看网站 | 丁香五月亚洲综合在线 | 国产成人一区二区三区影院在线 | 国产一区二区三区免费观看视频 | 色小说在线 | 特黄色大片 | 日韩有码在线观看视频 | 综合久久久| 天天干天天射天天插 | 黄色三级在线看 | 久久国产精品系列 | 99免费看片 | 美女免费黄视频网站 | 人人澡人人澡人人 | 97在线视频免费 | 欧美日韩性视频 | 97电院网手机版 | 国产精品毛片久久久 | 西西444www大胆高清视频 | 欧美一级片 | 国产精品视频999 | 精品久久免费 | 99色视频在线 | 久久av黄色| 91成年视频 | 嫩草伊人久久精品少妇av | avav99| 99热只有精品在线观看 | 成人av资源网 | 国产91精品欧美 | 一本一本久久a久久精品综合小说 | 日韩av播放在线 | 97精品国产91久久久久久久 | 99成人免费视频 | 国产伦精品一区二区三区… | 9热精品| 毛片a级片 | 国产一级片网站 | 日日爽日日操 | 日本韩国精品一区二区在线观看 | 免费三级影片 | 日韩激情三级 | 成人免费亚洲 | 久久久免费观看完整版 | 亚洲精品中文字幕视频 | 午夜精品视频免费在线观看 | 麻豆91在线观看 | 亚洲精品乱码久久久久 | 伊人色**天天综合婷婷 | 久久福利国产 | 天天色官网 | 国产伦精品一区二区三区无广告 | 狠狠狠狠狠狠狠狠 | 蜜臀久久99精品久久久无需会员 | 四虎在线免费视频 | 成人a毛片| 成年人视频在线 | 麻豆综合网 | 夜夜操夜夜干 | 国产99黄| 国产精品一区二区无线 | 97视频在线免费 | 最新av网址在线 | 日韩精品免费在线观看视频 | 久久国内免费视频 | 亚洲涩涩涩涩涩涩 | 久久久影片 | 超碰在97| 日韩一区精品 | 96香蕉视频 | 欧美日韩精品在线播放 | 99在线观看| 欧美激情视频一区二区三区免费 | 精品国产aⅴ麻豆 | 69av在线播放 | 精品久久久久久亚洲综合网站 | 一级免费av | 香蕉影院在线播放 | 黄污污网站 | 国产视频18| 天天插综合| 久久视频精品在线观看 | 国产精品亚洲片在线播放 | 天天干,天天射,天天操,天天摸 | 久久久99精品免费观看乱色 | 亚洲精品在线免费看 | 国产黄色视 | 视频一区亚洲 | 久久综合欧美 | 久久99精品国产一区二区三区 | 婷婷去俺也去六月色 | 99免费在线观看视频 | 国产精品精品视频 | 成人毛片一区 | 色吊丝在线永久观看最新版本 | 国内精品久久久久久 | 视频一区二区三区视频 | 国产很黄很色的视频 | 中文字幕 国产 一区 | 国产一级视频在线观看 | 日韩中文字幕免费电影 | 一区 二区 精品 | 999热线在线观看 | 91九色视频在线播放 | 人人狠| 夜又临在线观看 | 91日韩在线专区 | 有没有在线观看av | 911国产在线观看 | 黄色看片 | 久久成人麻豆午夜电影 | 伊人久久一区 | 免费看色视频 | 五月婷久久 | 一区二区三区久久精品 | 成人av在线直播 | 在线视频免费观看 | 夜夜操天天操 | 日韩中文字 | 精品国产_亚洲人成在线 | 久久综合9988久久爱 | aaa亚洲精品一二三区 | 狠狠色丁香久久婷婷综合_中 | 狠狠色丁香久久婷婷综合_中 | 欧美性爽爽 | 懂色av一区二区在线播放 | 成人免费看黄 | 久久草精品 | 久久精品视频网 | 亚洲日韩欧美一区二区在线 | 久久综合成人网 | 国产中文字幕视频在线 | 黄色av成人在线观看 | 日韩大片在线观看 | 久久激情五月婷婷 | 国产这里只有精品 | 最新亚洲视频 | 欧美日韩一区二区在线 | 国产精品久久久久永久免费 | 亚洲日本中文字幕在线观看 | 2021国产视频 | 国产91精品高清一区二区三区 | 午夜av大片| 99精品国产视频 | 综合久久精品 | 综合久久五月天 | 亚洲欧洲美洲av | 精品视频久久久 | 精品91在线 | 超碰在线人人爱 | 黄在线 | 最新成人av| 久久av福利 | 99精品视频免费观看视频 | 天天操天天操 | 999久久国产精品免费观看网站 | 午夜美女福利直播 | 精品一区欧美 | 热re99久久精品国产66热 | 成 人 黄 色 视频 免费观看 | 亚洲欧美日韩精品久久久 | 日韩在线免费小视频 | 人人狠狠综合久久亚洲 | 日韩 精品 一区 国产 麻豆 | 欧美日韩在线播放一区 | 国产精品久久久久久久久久了 | 在线黄色国产电影 | 亚洲激情网站免费观看 | 国产精品高清免费在线观看 | 国产黄色免费在线观看 | 精品视频免费看 | 99久久国产免费看 | 丁香六月伊人 | 日韩毛片在线免费观看 | 亚洲在线精品 | 久久久久99999 | av亚洲产国偷v产偷v自拍小说 | 91麻豆精品国产91久久久使用方法 | 午夜电影久久 | 免费亚洲片 | 干天天 | 天天干天天综合 | 欧美国产日韩在线视频 | 国产在线91精品 | 黄色影院在线观看 | 99在线观看视频 | 国产精品精品国产色婷婷 | 国产亚洲精品久久久久久电影 | 欧美一性一交一乱 | 97视频在线观看免费 | 丁香五月亚洲综合在线 | 久久免费久久 | 久久成人国产精品一区二区 | 在线观看免费91 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 国产999精品久久久影片官网 | 99久久婷婷国产精品综合 | 最新午夜电影 | 欧美91片| 亚洲成年人在线播放 | 97超碰资源网 | 国产精品永久免费 | 九九久久久久久久久激情 | 久色 网| 久久国产精品一二三区 | 亚洲经典视频 | 亚洲一区二区三区在线看 | 久要激情网 | 色婷婷激情网 | 樱空桃av | 久久伦理网 | 日韩欧美综合在线视频 | 欧美性猛片| 中国一区二区视频 | 国产一卡在线 | 亚洲精品美女久久17c | 日本精品一二区 | 狠狠色丁香久久婷婷综合五月 | 99久久久久久国产精品 | www.天天草 | 欧美在线视频精品 | 国产精品永久免费 | 99欧美精品 | 婷婷精品 | 久久精品国产免费看久久精品 | 久久久久麻豆 | 91精品在线免费观看视频 | 久草视频网 | 久久电影中文字幕视频 | 奇米网777| 91在线观看视频网站 | 欧美一级爽 | 久久免费视频这里只有精品 | 一区二区三区在线免费观看视频 | 日韩视频免费 | 久久美女免费视频 | 亚洲资源片| 人人草在线观看 | 国产资源精品 | 激情丁香 | 欧美日本高清视频 | 国产日本亚洲高清 | 国产乱老熟视频网88av | 激情五月婷婷网 | www.夜色.com| 日韩国产欧美在线视频 | 91刺激视频 | 超碰人在线 | 欧美日韩观看 | 特级黄色视频毛片 | 一级免费看 | 国产精品久久久久久久电影 | 中文字幕在线看片 | 欧美激情视频在线免费观看 | 国产精品成人久久久久久久 | 色婷婷婷 | 在线中文视频 | 日韩av免费大片 | 在线免费观看黄色小说 | 国产精品久久久久久久久久直播 | 日本韩国在线不卡 | 久久综合婷婷国产二区高清 | 91久久久国产精品 | 91香蕉视频污在线 | 国产日韩视频在线播放 | 99久久精品免费看国产四区 | 国产最新在线观看 | 五月婷婷六月丁香在线观看 | 婷婷在线视频观看 | 国产男男gay做爰 | 久久久黄视频 | 久久久久欠精品国产毛片国产毛生 | 91视频在线观看免费 | 久久久福利视频 | 97视频人人 | 伊人五月综合 | 久久成人一区 | 97超碰人人干 | 免费午夜在线视频 | 18+视频网站链接 | 亚洲欧美在线观看视频 | 国产中文在线播放 | 在线看欧美 | 国产一级二级三级视频 | 日日干网 | www.婷婷com| 毛片99 | 在线看国产视频 | 天天色天天操综合网 | 日韩高清国产精品 | 国内丰满少妇猛烈精品播 | 亚洲一片黄| 国内精品免费久久影院 | 亚洲激情小视频 | 色综合久久综合中文综合网 | 日韩资源在线播放 | 亚洲精品免费在线播放 | 综合色综合色 | www五月天com| 丁香五婷| 中文字幕在线观看完整版电影 | 国产精品丝袜久久久久久久不卡 | 久久久九色精品国产一区二区三区 | 午夜美女视频 | 天天综合视频在线观看 | 一区二区三区观看 | 国产一区二区三区高清播放 | 久久久这里有精品 | 久青草视频在线观看 | 91视频在线观看免费 | 香蕉免费 | 久久国产午夜精品理论片最新版本 | 亚洲乱码精品久久久久 | 欧美影院久久 | 久久久久免费精品国产小说色大师 | 国产精品国产精品 | 国产一二区视频 | 在线观看精品视频 | 成人永久在线 | 久久久久97国产 | 亚洲美女精品区人人人人 | 香蕉久草| 久久国际影院 | 亚洲伊人天堂 | 国产不卡一二三区 | 亚洲不卡av一区二区三区 | 国产成人精品午夜在线播放 | 69欧美视频 | 五月婷婷丁香在线观看 | 日韩亚洲国产中文字幕 | h视频在线看 | 91在线视频精品 | 免费看一级 | 久草在线最新 | 丁香六月五月婷婷 | 韩国av免费观看 | 国产免费一区二区三区最新 | 国产黄在线免费观看 | 中文字幕刺激在线 | av网站在线免费观看 | 日本精品视频在线观看 | 中文字幕在线播放av | 日本中文字幕影院 | 成人在线视频在线观看 | 搡bbbb搡bbb视频 | 久久超级碰 | 国产高清免费观看 | 国产成人福利在线观看 | 91视频3p| 91精品国产三级a在线观看 | 久久黄色小说 | 亚洲一区二区三区四区精品 | 国产美女精品久久久 | 亚洲精品福利在线 | 啪啪肉肉污av国网站 | 久久综合婷婷综合 | 91高清在线 | 免费看亚洲毛片 | 国产一区免费 | 99色免费视频 | 玖玖玖在线观看 | 国产91精品高清一区二区三区 | 国产亚洲高清视频 | 一区二区影视 | 欧美中文字幕久久 | 欧美一级欧美一级 | 天天天天天天天操 | 国产一级视屏 | 在线va视频 | 99精品视频在线观看视频 | 国产精品一区二区你懂的 | 久草在线视频免费资源观看 | 色网站中文字幕 | 亚州精品国产 | 亚洲精品乱码久久久久久蜜桃动漫 | www一起操| 欧美大片大全 | 国产成人l区 | 91一区在线观看 | 欧美精品做受xxx性少妇 | 久久天天综合网 | 免费在线观看成年人视频 | 国产精品av免费在线观看 | 国产精品视频最多的网站 | 五月天,com | 久久精品看 | 亚洲免费精彩视频 | caobi视频 | 久久av一区二区三区亚洲 | 99视频这里只有 | 91av手机在线观看 | 精品黄色在线 | 最近最新中文字幕 | 国产拍在线 | 亚洲观看黄色网 | 丁香婷婷激情 | 国产精品女同一区二区三区久久夜 | 久久99久国产精品黄毛片入口 | 免费看黄视频 | 国产精品永久免费观看 | 日韩丝袜 | 欧美一级淫片videoshd | 97超碰站 | 国产成人精品一区二区三区 | 国产黄网站在线观看 | 探花视频在线观看免费版 | 毛片网站免费 | 亚洲精品成人免费 | 午夜精品一区二区三区在线视频 | 天天爱天天爽 | 一区二区三区在线影院 | 久久久高清 | 日韩av资源在线观看 | 久久久久久久久久久影视 | 丁香花中文字幕 | 狠狠色丁香婷婷综合久小说久 | 亚洲涩涩一区 | 97在线视频免费看 | 丁香五月缴情综合网 | 在线三级播放 | free,性欧美 九九交易行官网 | 特黄一级毛片 | 黄色免费大全 | 色婷婷精品大在线视频 | 日韩理论在线播放 | 美女精品在线 | 伊人久久国产精品 | 九九在线高清精品视频 | 亚洲欧美激情精品一区二区 | 天天操天天操天天操天天操 |