精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

鴻蒙內核源碼分析(中斷切換篇) | 匯編注解中斷切換實現全過程

開發
文章由鴻蒙社區產出,想要了解更多內容請前往:51CTO和華為官方戰略合作共建的鴻蒙技術社區https://harmonyos.51cto.com

[[389420]]

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

關于中斷部分系列篇將用三篇詳細說明整個過程.

● 中斷概念篇 中斷概念很多,比如中斷控制器,中斷源,中斷向量,中斷共享,中斷處理程序等等.本篇做一次整理.先了解透概念才好理解中斷過程.用海公公打比方說明白中斷各個概念.可前往鴻蒙內核源碼分析(總目錄)查看.

● 中斷管理篇 用自上而下的方式,從C語言中斷注冊管理開始往下跟蹤代碼細節,一直到匯編調用的4個HalIrqHandler OsTaskProcSignal OsSchedPreempt OsSaveSignalContextIrqC函數為止.可前往鴻蒙內核源碼分析(總目錄)查看.

● 中斷切換篇(本篇) 用自下而上的方式,從匯編開始處往上跟蹤代碼細節.說清楚保存和恢復TaskIrqContext,以及調用HalIrqHandler的入口.

中斷環境下的任務切換

在鴻蒙的內核線程就是任務,系列篇中說的任務和線程當一個東西去理解.

一般二種場景下需要切換任務上下文:

● 在中斷環境下,從當前線程切換到目標線程,這種方式也稱為硬切換.不由軟件控制的被動式切換.哪些情況下會出現硬切換呢?

◊ 由硬件產生的中斷,比如 鼠標,鍵盤外部設備每次點擊和敲打,屏幕的觸摸,USB的插拔等等這些都是硬中斷.同樣的需要切換棧運行,需要復用寄存器,但與軟切換不一樣的是,硬切換會切換工作模式(中斷模式).所以會更復雜點,但道理還是一樣要保存和恢復切換現場寄存器的值, 而保存寄存器順序格式結構體叫:任務中斷上下文(TaskIrqContext).

● 在線程環境下,從當前線程切換到目標線程,這種方式也稱為軟切換,能由軟件控制的自主式切換.哪些情況下會出現軟切換呢?

◊ 運行的線程申請某種資源(比如各種鎖,讀/寫消息隊列)失敗時,需要主動釋放CPU的控制權,將自己掛入等待隊列,調度算法重新調度新任務運行.

◊ 每隔10ms就執行一次的OsTickHandler節拍處理函數,檢測到任務的時間片用完了,就發起任務的重新調度,切換到新任務運行.

◊ 不管是內核態的任務還是用戶態的任務,于切換而言是統一處理,一視同仁的,因為切換是需要換棧運行,寄存器有限,需要頻繁的復用,這就需要將當前寄存器值先保存到任務自己的棧中,以便別人用完了輪到自己再用時恢復寄存器當時的值,確保老任務還能繼續跑下去. 而保存寄存器順序格式結構體叫:任務上下文(TaskContext).

本篇說清楚在中斷環境下切換(硬切換)的實現過程.線程切換(軟切換)實現過程已在鴻蒙內核源碼分析(總目錄)任務切換篇中詳細說明.

ARM的七種工作模式中,有兩個是和中斷相關.

普通中斷模式(irq):一般中斷模式也叫普通中斷模式,用于處理一般的中斷請求,通常在硬件產生中斷信號之后自動進入該模式,該模式可以自由訪問系統硬件資源。

快速中斷模式(fiq):快速中斷模式是相對一般中斷模式而言的,用來處理高優先級中斷的模式,處理對時間要求比較緊急的中斷請求,主要用于高速數據傳輸及通道處理中。

此處分析普通中斷模式下的任務切換過程.

普通中斷模式相關寄存器

這張圖一定要刻在腦海里,系列篇會多次拿出來,目的是為了能牢記它.

● 普通中斷模式(圖中IRQ列)是一種異常模式,有自己獨立運行的棧空間.一個(IRQ)中斷發生后,硬件會將CPSR寄存器工作模式置為IRQ模式.并跳轉到入口地址OsIrqHandler執行.

  1. #define OS_EXC_IRQ_STACK_SIZE    64 //中斷模式棧大小 64個字節 
  2. __irq_stack: 
  3.     .space OS_EXC_IRQ_STACK_SIZE * CORE_NUM 
  4. __irq_stack_top: 

● OsIrqHandler匯編代碼實現過程,就干了三件事:

◊ 1.保存任務中斷上下文TaskIrqContext

◊ 2.執行中斷處理程序HalIrqHandler,這是個C函數,由匯編調用

◊ 3.恢復任務中斷上下文TaskIrqContext,返回被中斷的任務繼續執行

TaskIrqContext 和 TaskContext

先看本篇結構體 TaskIrqContext

  1. #define TASK_IRQ_CONTEXT \ 
  2.         unsigned int R0;     \ 
  3.         unsigned int R1;     \ 
  4.         unsigned int R2;     \ 
  5.         unsigned int R3;     \ 
  6.         unsigned int R12;    \ 
  7.         unsigned int USP;    \ 
  8.         unsigned int ULR;    \ 
  9.         unsigned int CPSR;   \ 
  10.         unsigned int PC; 
  11.  
  12. typedef struct {//任務中斷上下文 
  13. #if !defined(LOSCFG_ARCH_FPU_DISABLE) 
  14.     UINT64 D[FP_REGS_NUM]; /* D0-D31 */ 
  15.     UINT32 regFPSCR;       /* FPSCR */ 
  16.     UINT32 regFPEXC;       /* FPEXC */ 
  17. #endif 
  18.     UINT32 resved; 
  19.     TASK_IRQ_CONTEXT 
  20. } TaskIrqContext; 
  21.  
  22. typedef struct {//任務上下文,已在任務切換篇中詳細說明,放在此處是為了對比   
  23. #if !defined(LOSCFG_ARCH_FPU_DISABLE) 
  24.     UINT64 D[FP_REGS_NUM]; /* D0-D31 */ 
  25.     UINT32 regFPSCR;       /* FPSCR */ 
  26.     UINT32 regFPEXC;       /* FPEXC */ 
  27. #endif 
  28.     UINT32 resved;          /* It's stack 8 aligned */ 
  29.     UINT32 regPSR;          //保存CPSR寄存器 
  30.     UINT32 R[GEN_REGS_NUM]; /* R0-R12 */ 
  31.     UINT32 SP;              /* R13 */ 
  32.     UINT32 LR;              /* R14 */ 
  33.     UINT32 PC;              /* R15 */ 
  34. } TaskContext; 

● 兩個結構體很簡單,目的更簡單,就是用來保存寄存器現場的值的. TaskContext把17個寄存器全部保存了,TaskIrqContext保存的少些,在棧中并沒有保存R4-R11寄存器的值,這說明在整個中斷處理過程中,都不會用到R4-R11寄存器.不會用到就不會改變,當然就沒必要保存了.這也說明內核開發者的嚴謹程度,不造成時間和空間上的一丁點浪費.效率的提升是從細節處入手的,每個小地方優化那么一丟丟,整體性能就上來了.

● TaskIrqContext中有兩個變量有點奇怪 unsigned int USP; unsigned int ULR; 指的是用戶模式下的SP和LR值, 這個要怎么理解? 因為對一個正運行的任務而言,中斷的到來是顆不定時炸彈,無法預知,也無法提前準備,中斷一來它立即被打斷,壓根沒有時間去保存現場到自己的棧中,那保存工作只能是放在IRQ棧或者SVC棧中.而IRQ棧非常的小,只有64個字節,16個棧空間,指望不上了,就保存在SVC棧中,SVC模式棧可是有 8K空間的.

● 從接下來的 OsIrqHandler代碼中可以看出,鴻蒙內核整個中斷的工作其實都是在SVC模式下完成的,而irq的棧只是個過渡棧.具體看匯編代碼逐行注解分析.

普通中斷處理程序

  1. OsIrqHandler:   @硬中斷處理,此時已切換到硬中斷棧 
  2.     SUB     LR, LR, #4  @記錄譯碼指令地址,以防切換過程丟失指令 
  3.  
  4.     /* push r0-r3 to irq stack */ @irq棧只是個過渡棧 
  5.     STMFD   SP, {R0-R3}     @r0-r3寄存器入 irq 棧 
  6.     SUB     R0, SP, #(4 * 4)@r0 = sp - 16,目的是記錄{R0-R3}4個寄存器保存的開始位置,屆時從R3開始出棧 
  7.     MRS     R1, SPSR        @獲取程序狀態控制寄存器 
  8.     MOV     R2, LR          @r2=lr 
  9.  
  10.     /* disable irq, switch to svc mode */@超級用戶模式(SVC 模式),主要用于 SWI(軟件中斷)和 OS(操作系統)。 
  11.     CPSID   i, #0x13                @切換到SVC模式,此處一切換,后續指令將在SVC棧運行 
  12.                                     @CPSID i為關中斷指令,對應的是CPSIE 
  13.     @TaskIrqContext 開始保存中斷現場 ......                          
  14.     /* push spsr and pc in svc stack */ 
  15.     STMFD   SP!, {R1, R2} @實際是將 SPSR,和PC入棧對應TaskIrqContext.PC,TaskIrqContext.CPSR, 
  16.     STMFD   SP, {LR}      @LR再入棧,SP不自增,如果是用戶模式,LR值將被 282行:STMFD   SP, {R13, R14}^覆蓋   
  17.                           @如果非用戶模式,將被 286行:SUB     SP, SP, #(2 * 4) 跳過. 
  18.     AND     R3, R1, #CPSR_MASK_MODE @獲取CPU的運行模式 
  19.     CMP     R3, #CPSR_USER_MODE     @中斷是否發生在用戶模式 
  20.     BNE     OsIrqFromKernel         @非用戶模式不用將USP,ULR保存在TaskIrqContext 
  21.  
  22.     /* push user sp, lr in svc stack */ 
  23.     STMFD   SP, {R13, R14}^         @將用戶模式的sp和LR入svc棧 
  24.  
  25. OsIrqFromKernel:    @從內核發起中斷 
  26.     /* from svc not need save sp and lr */@svc模式下發生的中斷不需要保存sp和lr寄存器值 
  27.     SUB     SP, SP, #(2 * 4)    @目的是為了留白給 TaskIrqContext.USP,TaskIrqContext.ULR 
  28.                                 @TaskIrqContext.ULR已經在 276行保存了,276行用的是SP而不是SP!,所以此處要跳2個空間 
  29.     /* pop r0-r3 from irq stack*/ 
  30.     LDMFD   R0, {R0-R3}         @從R0位置依次出棧  
  31.  
  32.     /* push caller saved regs as trashed regs in svc stack */ 
  33.     STMFD   SP!, {R0-R3, R12}   @寄存器入棧,對應 TaskIrqContext.R0~R3,R12 
  34.  
  35.     /* 8 bytes stack align */ 
  36.     SUB     SP, SP, #4          @棧對齊 對應TaskIrqContext.resved 
  37.  
  38.     /* 
  39.      * save fpu regs in case in case those been 
  40.      * altered in interrupt handlers. 
  41.      */ 
  42.     PUSH_FPU_REGS   R0 @保存fpu regs,以防中斷處理程序中的fpu regs被修改。 
  43.     @TaskIrqContext 結束保存中斷現場......   
  44.     @開始執行真正的中斷處理函數了. 
  45. #ifdef LOSCFG_IRQ_USE_STANDALONE_STACK @是否使用了獨立的IRQ棧 
  46.     PUSH    {R4}    @R4先入棧保存,接下來要切換棧,需保存現場 
  47.     MOV     R4, SP  @R4=SP 
  48.     EXC_SP_SET __svc_stack_top, OS_EXC_SVC_STACK_SIZE, R1, R2 @切換到svc棧 
  49. #endif 
  50.     /*BLX 帶鏈接和狀態切換的跳轉*/ 
  51.     BLX     HalIrqHandler /* 調用硬中斷處理程序,無參 ,說明HalIrqHandler在svc棧中執行 */ 
  52.  
  53. #ifdef LOSCFG_IRQ_USE_STANDALONE_STACK @是否使用了獨立的IRQ棧 
  54.     MOV     SP, R4  @恢復現場,sp = R4  
  55.     POP     {R4}    @彈出R4 
  56. #endif 
  57.  
  58.     /* process pending signals */   @處理掛起信號 
  59.     BL      OsTaskProcSignal        @跳轉至C代碼  
  60.  
  61.     /* check if needs to schedule */@檢查是否需要調度 
  62.     CMP     R0, #0  @是否需要調度,R0為參數保存值 
  63.     BLNE    OsSchedPreempt @不相等,即R0非0,一般是 1 
  64.  
  65.     MOV     R0,SP   @參數 
  66.     MOV     R1,R7   @參數 
  67.     BL      OsSaveSignalContextIrq @跳轉至C代碼  
  68.  
  69.     /* restore fpu regs */ 
  70.     POP_FPU_REGS    R0 @恢復fpu寄存器值 
  71.  
  72.     ADD     SP, SP, #4 @sp = sp + 4  
  73.  
  74. OsIrqContextRestore:    @恢復硬中斷環境 
  75.     LDR     R0, [SP, #(4 * 7)]  @R0 = sp + 7,目的是跳到恢復中斷現場TaskIrqContext.CPSR位置,剛好是TaskIrqContext倒數第7的位置. 
  76.     MSR     SPSR_cxsf, R0       @恢復spsr 即:spsr = TaskIrqContext.CPSR 
  77.     AND     R0, R0, #CPSR_MASK_MODE @掩碼找出當前工作模式 
  78.     CMP     R0, #CPSR_USER_MODE @是否為用戶模式? 
  79.     @TaskIrqContext 開始恢復中斷現場 ......  
  80.     LDMFD   SP!, {R0-R3, R12}   @從SP位置依次出棧 對應 TaskIrqContext.R0~R3,R12 
  81.                                 @此時已經恢復了5個寄存器,接來下是TaskIrqContext.USP,TaskIrqContext.ULR 
  82.     BNE     OsIrqContextRestoreToKernel @看非用戶模式,怎么恢復中斷現場. 
  83.  
  84.     /* load user sp and lr, and jump cpsr */ 
  85.     LDMFD   SP, {R13, R14}^ @出棧,恢復用戶模式sp和lr值 即:TaskIrqContext.USP,TaskIrqContext.ULR 
  86.     ADD     SP, SP, #(3 * 4) @跳3個位置,跳過 CPSR ,因為上一句不是 SP!,所以跳3個位置,剛好到了保存TaskIrqContext.PC的位置 
  87.  
  88.     /* return to user mode */ 
  89.     LDMFD   SP!, {PC}^ @回到用戶模式,整個中斷過程完成 
  90.     @TaskIrqContext 結束恢復中斷現場(用戶模式下) ......   
  91.  
  92. OsIrqContextRestoreToKernel:@從內核恢復中斷 
  93.     /* svc mode not load sp */ 
  94.     ADD     SP, SP, #4 @其實是跳過TaskIrqContext.USP,因為在內核模式下并沒有保存這個值,翻看 287行 
  95.     LDMFD   SP!, {LR} @彈出LR 
  96.     /* jump cpsr and return to svc mode */ 
  97.     ADD     SP, SP, #4 @跳過cpsr 
  98.     LDMFD   SP!, {PC}^ @回到svc模式,整個中斷過程完成 
  99.     @TaskIrqContext 結束恢復中斷現場(內核模式下) ...... 

逐句解讀

● 跳轉到 OsIrqFromKernel硬件會自動切換到__irq_stack執行

● 1句:SUB LR, LR, #4 在arm執行過程中一般分為取指,譯碼,執行階段,而PC是指向取指,正在執行的指令為 PC-8 ,譯碼指令為PC-4.當中斷發生時硬件自動執行 mov lr pc, 中間的PC-4譯碼指令因為沒有寄存器去記錄它,就會被丟失掉.所以SUB LR, LR, #4 的結果是lr = PC -4 ,定位到了被中斷時譯碼指令,將在棧中保存這個位置,確保回來后能繼續執行.

● 2句:STMFD SP, {R0-R3} 當前4個寄存器入__irq_stack保存

● 3句:SUB R0, SP, #(4 * 4) 因為SP沒有自增,R0跳到保存R0內容地址

● 4,5句:讀取SPSR,LR寄存器內容,目的是為了后面在SVC棧中保存TaskIrqContext

● 6句:CPSID i, #0x13禁止中斷和切換SVC模式,執行完這條指令后工作模式將切到 SVC模式

● @TaskIrqContext 開始保存中斷現場 ......

● 中間代碼需配合TaskIrqContext來看,不然100%懵逼.結合看就秒懂,代碼都已經注釋,不再做解釋,注解中提到的 翻看276行 是指源碼的第276行,請對照注解源碼看理解會更透徹. 進入源碼注解地址查看

● @TaskIrqContext 結束保存中斷現場 ......

● TaskIrqContext保存完現場后就真正的開始處理中斷了.

  1.     /*BLX 帶鏈接和狀態切換的跳轉*/ 
  2.     BLX     HalIrqHandler /* 調用硬中斷處理程序,無參 ,說明HalIrqHandler在svc棧中執行 */ 
  3. #ifdef LOSCFG_IRQ_USE_STANDALONE_STACK @是否使用了獨立的IRQ棧 
  4.     MOV     SP, R4  @恢復現場,sp = R4  
  5.     POP     {R4}    @彈出R4 
  6. #endif 
  7.     /* process pending signals */   @處理掛起信號 
  8.     BL      OsTaskProcSignal        @跳轉至C代碼  
  9.     /* check if needs to schedule */@檢查是否需要調度 
  10.     CMP     R0, #0  @是否需要調度,R0為參數保存值 
  11.     BLNE    OsSchedPreempt @不相等,即R0非0,一般是 1 
  12.     MOV     R0,SP   @參數 
  13.     MOV     R1,R7   @參數 
  14.     BL      OsSaveSignalContextIrq @跳轉至C代碼  
  15.     /* restore fpu regs */ 
  16.     POP_FPU_REGS    R0 @恢復fpu寄存器值 
  17.     ADD     SP, SP, #4 @sp = sp + 4  

● 這段代碼都是跳轉到C語言去執行,分別是 HalIrqHandler OsTaskProcSignal OsSchedPreempt OsSaveSignalContextIrq C語言部分內容很多,將在中斷管理篇中說明.

@TaskIrqContext 開始恢復中斷現場 ......

● 同樣的中間代碼需配合TaskIrqContext來看,不然100%懵逼.結合看就秒懂,代碼都已經注釋,不再做解釋,注解中提到的 翻看287行 是指源碼的第287行,請對照注解源碼看理解會更透徹.進入源碼注解地址查看

● @TaskIrqContext 結束恢復中斷現場 ......

參與貢獻

訪問注解倉庫地址

Fork 本倉庫 >> 新建 Feat_xxx 分支 >> 提交代碼注解 >> 新建 Pull Request

● 新建 Issue

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

 

責任編輯:jianghua 來源: 鴻蒙社區
相關推薦

2021-03-30 15:30:44

鴻蒙HarmonyOS應用開發

2025-07-30 09:48:25

服務中斷網絡安全安全管理

2021-03-11 11:14:39

鴻蒙HarmonyOS應用

2021-04-01 09:38:02

鴻蒙HarmonyOS應用

2012-11-06 10:19:18

Java自定義加載Java類

2011-02-22 10:46:02

Samba配置

2021-03-11 16:07:40

鴻蒙HarmonyOS應用開發

2021-05-11 09:54:55

鴻蒙HarmonyOS應用

2009-12-08 17:56:16

WCF配置

2011-04-18 15:56:10

軟件測試

2011-09-06 15:38:20

QT安裝

2009-04-13 12:37:18

2011-01-21 17:51:52

2022-08-22 08:45:57

Kafka網絡層源碼實現

2009-06-10 16:55:42

cygwin netb安裝

2010-03-01 17:01:03

Python編程技巧

2010-03-10 13:24:45

Zend Debugg

2010-06-17 13:10:09

Linux Grub修

2010-11-19 10:11:49

Oracle物化視圖

2011-03-11 10:39:02

YUM安裝LAMP
點贊
收藏

51CTO技術棧公眾號

成人手机视频在线| 国产精国产精品| 亚洲午夜久久久久久久久| www在线观看黄色| 久久久电影一区二区三区| 国产成人综合av| 欧美 日韩 国产 一区二区三区| 4438全国亚洲精品观看视频| 欧美性猛交xxxx免费看久久久| 污视频在线免费观看一区二区三区| 国产精品福利电影| 亚洲一级电影| 中文字幕视频一区二区在线有码| 九九久久久久久| 在线免费日韩片| 亚洲欧美福利一区二区| 久久伊人资源站| 精品国产伦一区二区三区| 麻豆精品91| 欧美极品在线播放| 黄色一级片一级片| 香蕉久久夜色精品国产更新时间| 4hu四虎永久在线影院成人| 国产一区二区三区精彩视频| 伦xxxx在线| 久久久精品天堂| 国产91色在线|亚洲| 中文字幕日日夜夜| 噜噜噜在线观看免费视频日韩 | 91免费视频国产| 天堂а√在线中文在线新版| 欧美日本国产| www国产精品视频| 99久久久无码国产精品性| www.豆豆成人网.com| 在线成人高清不卡| 国产理论在线播放| 成人片免费看| 天天免费综合色| 2019日韩中文字幕mv| 国产精品实拍| 一区在线播放视频| 亚洲精品美女久久7777777| 精品亚洲综合| 久久久国产精品麻豆| 久久久久久久久久码影片| 高清毛片aaaaaaaaa片| 国产美女一区二区| 成人黄色av播放免费| 中文字幕视频一区二区| 蜜臀av性久久久久蜜臀aⅴ四虎| 国产成人97精品免费看片| 好看的av在线| 免费亚洲网站| 日韩av免费在线| 无码视频在线观看| 日日摸夜夜添夜夜添国产精品| 97久久久久久| 亚洲日本韩国在线| 久久国产一二区| 国产成人免费av| 中文字幕激情视频| 久久精品国产一区二区三区免费看| 国产成人精品午夜| 国产精品xxxxxx| 蜜臀久久99精品久久久画质超高清| 国产精品久久久久久久久久ktv | 少妇高潮惨叫久久久久| 欧美高清视频手机在在线| 日韩视频免费大全中文字幕| 国产激情无码一区二区三区 | 国产婷婷一区二区三区| 麻豆mv在线看| 日韩欧美aⅴ综合网站发布| 欧美成人免费高清视频| 日韩成人高清| 69久久夜色精品国产69蝌蚪网| 天堂在线精品视频| 成人午夜大片| 亚洲人高潮女人毛茸茸| 人人艹在线视频| 欧美精品成人| 日本国产欧美一区二区三区| 曰批又黄又爽免费视频| 国产精品一区免费视频| 久久久久久久久一区二区| 岛国在线大片| 一区二区三区在线观看国产| 女性女同性aⅴ免费观女性恋| 国产一区二区三区朝在线观看| 欧美精品乱码久久久久久按摩| 少妇精品无码一区二区| 女人丝袜激情亚洲| 久色乳综合思思在线视频| 日本少妇激情视频| 日本欧美一区二区在线观看| 亚洲影视九九影院在线观看| 欧美在线观看在线观看| 亚洲视频免费观看| 国产午夜伦鲁鲁| 91久久青草| 亚洲男人天堂2024| 永久免费未视频| 亚洲无线一线二线三线区别av| 日韩av大片免费看| aaa一区二区三区| 白白色 亚洲乱淫| 在线看无码的免费网站| 国产在线天堂www网在线观看| 欧美日韩一区在线| 亚洲一级av无码毛片精品| 欧美3p在线观看| 青青草一区二区| 亚洲av综合色区无码一二三区| 欧美激情一区二区三区全黄| 可以看毛片的网址| 亚洲色图综合| 亚洲一级免费视频| 日本天堂网在线观看| 激情都市一区二区| 日韩高清专区| 性欧美18xxxhd| 精品久久一区二区三区| 日本 欧美 国产| 日韩激情视频网站| 久久久一本精品99久久精品66 | 激情婷婷综合| 91极品视频在线| 亚洲AV无码成人片在线观看| 国产精品乱码人人做人人爱| 国产福利影院在线观看| 日韩三级av| 国语自产精品视频在线看抢先版图片 | 黄色一级视频在线播放| 亚洲国产伊人| 丝袜亚洲另类欧美重口| 国产黄色免费视频| 久久免费视频色| 九色在线视频观看| 精品国产午夜肉伦伦影院| 久久99青青精品免费观看| 7777久久亚洲中文字幕| 中文av一区特黄| 9久久婷婷国产综合精品性色| 妖精一区二区三区精品视频 | 国产一级片毛片| 91在线观看下载| 欧美精品自拍视频| 美女网站色精品尤物极品姐弟| 欧美激情亚洲精品| 欧美一区二区三区激情| 亚洲愉拍自拍另类高清精品| 深夜视频在线观看| 亚洲第一区色| 久久伊人一区| 成人在线黄色| 久久国产一区二区三区| 97精品人妻一区二区三区香蕉| 国产精品不卡视频| 亚洲在线观看网站| 综合久久亚洲| 国产一区二区视频在线免费观看| 91白丝在线| 亚洲伦理中文字幕| 最新国产中文字幕| 亚洲色大成网站www久久九九| 男女视频在线观看网站| 欧美日韩亚洲一区| 国产一区免费| 日韩网站中文字幕| 日韩在线不卡视频| 亚洲av无码一区二区三区dv| 精品久久久国产精品999| 亚洲永久无码7777kkk| 久久久人人人| 五月天色婷婷综合| 国产精品宾馆| 国产精品成久久久久三级| 黄色av免费在线| 亚洲第一视频网站| 波多野结衣高清视频| 亚洲色图在线播放| 中文字幕a在线观看| 日韩国产在线观看| 污污污污污污www网站免费| 欧美成人基地| 成人h视频在线| av中文字幕在线看| 中日韩美女免费视频网址在线观看 | 日本一区二区高清视频| 国产高清亚洲| 欧美中文在线观看| 黄色在线播放网站| 亚洲免费成人av电影| 国产精品人人妻人人爽| 精品毛片三在线观看| 免费成人深夜夜行网站| 91免费国产在线观看| 国产传媒免费观看| 西西人体一区二区| 伊人网在线免费| 国产免费久久| 国产乱码精品一区二区三区卡| 亚洲精品一区三区三区在线观看| 欧美国产日韩一区二区在线观看| 国产美女视频一区二区三区| 欧美成人精品1314www| 丰满熟女人妻一区二区三| 亚洲国产精品久久一线不卡| 欧美激情视频二区| 99久久婷婷国产综合精品电影 | 蜜桃精品一区二区三区| 国产mv久久久| aa视频在线观看| 久久国产视频网站| 在线观看av黄网站永久| 精品五月天久久| 成人乱码一区二区三区| 欧美福利视频导航| 中文字幕一区二区人妻电影| 亚洲午夜国产一区99re久久| h色网站在线观看| 国产拍欧美日韩视频二区| 污污内射在线观看一区二区少妇| 国产伦理精品不卡| 亚洲国产成人va在线观看麻豆| 麻豆亚洲精品| 国产亚洲精品网站| 1024成人| 激情小视频网站| 国产伊人精品| 成人在线观看毛片| 欧美91福利在线观看| 一区二区不卡在线观看| 欧美三级美国一级| 日本午夜精品一区二区三区| 视频一区中文| 日韩欧美精品一区二区| 蜜桃一区二区| 欧美一区1区三区3区公司| 婷婷精品在线观看| 欧美极品色图| 久久不见久久见免费视频7| 免费精品视频一区二区三区| 欧美美女在线直播| 精品无人区一区二区三区| 另类春色校园亚洲| 精品欧美国产| 一本色道久久综合狠狠躁的番外| 欧美久久电影| 国产一区二区三区电影在线观看| 欧美欧美一区二区| 黄色不卡一区| 亚洲一区二区三区欧美| 久久精品影视| 成年丰满熟妇午夜免费视频| 亚洲私拍自拍| 国产aaa一级片| 日韩精品三区四区| 亚洲综合av在线播放| 精品无人区卡一卡二卡三乱码免费卡 | 日韩乱码人妻无码中文字幕| 岛国av一区二区在线在线观看| 免费av网站在线| 欧美三级一区二区| 国产视频第二页| 亚洲精品白浆高清久久久久久| 亚洲aaaaaaa| 伊人久久男人天堂| 精品176二区| 国产69精品久久久久9| 中文字幕这里只有精品| 国产精品一区久久久| 久久免费精品| 久久偷看各类wc女厕嘘嘘偷窃| 欧美色就是色| 国产xxxx振车| 日本中文字幕一区| 在线观看免费看片| 97久久精品人人爽人人爽蜜臀| 国产成人一区二区在线观看| 亚洲伦理在线精品| av大片免费观看| 欧美久久久久久久久久| 欧美一级片免费| 中文字幕av一区中文字幕天堂| 亚洲资源一区| 国产精品91久久久| 天堂久久av| 日韩高清dvd| 亚洲韩日在线| 九九热99视频| 99国产精品久久久久久久久久久 | 97精品国产福利一区二区三区| 日韩激情视频一区二区| 日韩电影在线看| 亚洲精品第二页| 国产精品嫩草影院com| 动漫精品一区一码二码三码四码| 在线观看一区二区视频| 午夜精品久久久久久久99热黄桃 | 538精品视频| 亚洲一区二区偷拍精品| 在线观看国产一区二区三区| 亚洲激情第一页| 国产91在线视频蝌蚪| 欧美在线观看视频| 欧美激情精品| 亚洲日本精品| 久久精品导航| 男女一区二区三区| 亚洲色图欧美在线| 中文字幕在线观看第二页| 亚洲黄色有码视频| 3d玉蒲团在线观看| 国产精品美女主播| 免费视频国产一区| 岛国大片在线播放| 国产在线精品视频| 九九热久久免费视频| 日韩欧美成人区| 高清毛片aaaaaaaaa片| 久久综合色88| 亚洲国产天堂| 亚洲视频在线二区| 欧美aaa在线| 无码少妇一区二区| 大荫蒂欧美视频另类xxxx| 风流少妇一区二区三区91| 久国内精品在线| 9999精品免费视频| 亚洲欧美国产不卡| 日韩成人一级片| 实拍女处破www免费看| 图片区小说区国产精品视频| 亚洲精品97久久中文字幕无码| 久久亚洲国产精品| 少妇高潮一区二区三区99| 亚洲免费在线精品一区| 日韩av网站免费在线| 精品人伦一区二区三电影| 日韩欧美中文第一页| 美国成人毛片| 欧美中文字幕精品| 免费久久精品| 久久婷婷国产91天堂综合精品| 国产性天天综合网| 日韩电影在线观看一区二区| 亚洲欧美国产精品专区久久| 欧洲av不卡| 偷拍视频一区二区| 精品在线观看视频| 成熟的女同志hd| 亚洲精品一区二区三区香蕉| 1区2区3区在线| 欧美理论一区二区| 日韩高清在线不卡| 开心激情五月网| 日韩亚洲欧美成人一区| 成人在线高清免费| 蜜桃臀一区二区三区| 日韩电影在线观看一区| 中文字幕精品亚洲| 日韩免费在线观看| 成人bbav| 日本免费高清不卡| 精彩视频一区二区| 黄色一级视频在线观看| 亚洲黄色www| 色猫猫成人app| 蜜桃网站在线观看| 99国内精品久久| 亚洲天堂avav| 欧美黑人xxx| 欧美人与物videos另类xxxxx| 亚洲精品久久久久久宅男| 亚洲一区免费观看| 国产精品一二三区视频| 国产一区玩具在线观看| 亚洲视频精品| 美女脱光内衣内裤| 欧美二区在线观看| 黄视频免费在线看| 亚洲精品视频一二三| 国产成人久久精品77777最新版本| 日韩三级视频在线| 在线观看欧美日韩| 在线视频亚洲欧美中文| 日韩视频在线免费看| 亚洲丝袜另类动漫二区| 日本黄色不卡视频| 国产精品视频一区国模私拍| 欧美日韩视频一区二区三区| 夫妇交换中文字幕| 亚洲精品一区二区精华| 福利一区二区| 秋霞无码一区二区| 综合网在线视频| 牛牛热在线视频| 不卡一卡2卡3卡4卡精品在|