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

鴻蒙內核源碼分析(系統調用篇) | 圖解系統調用全貌

系統
本篇通過一張圖和七段代碼詳細說明系統調用的整個過程,代碼一捅到底,直到匯編層再也捅不下去. 先看圖,這里的模式可以理解為空間,因為模式不同運行的棧空間就不一樣。

[[387734]]

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

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

https://harmonyos.51cto.com

本篇說清楚系統調用

讀本篇之前建議先讀鴻蒙內核源碼分析(總目錄)工作模式篇.

本篇通過一張圖和七段代碼詳細說明系統調用的整個過程,代碼一捅到底,直到匯編層再也捅不下去. 先看圖,這里的模式可以理解為空間,因為模式不同運行的棧空間就不一樣.

過程解讀

● 在應用層main中使用系統調用mq_open(posix標準接口)

● mq_open被封裝在庫中,這里直接看庫里的代碼.

● mq_open中調用syscall,將參數傳給寄出器 R7,R0~R6

● SVC 0 完成用戶模式到內核模式(SVC)的切換

● _osExceptSwiHdl運行在svc模式下.

● PC寄存器直接指向_osExceptSwiHdl處取指令.

● _osExceptSwiHdl是匯編代碼,先保存用戶模式現場(R0~R12寄存器),并調用OsArmA32SyscallHandle完成系統調用

● OsArmA32SyscallHandle中通過系統調用號(保存在R7寄存器)查詢對應的注冊函數SYS_mq_open

● SYS_mq_open是本次系統調用的實現函數,完成后return回到OsArmA32SyscallHandle

● OsArmA32SyscallHandle再return回到_osExceptSwiHdl

● _osExceptSwiHdl恢復用戶模式現場(R0~R12寄存器)

● 從內核模式(SVC)切回到用戶模式,PC寄存器也切回用戶現場.

● 由此完成整個系統調用全過程

七段追蹤代碼,逐個分析

1.應用程序 main

  1. int main(void) 
  2.     char mqname[NAMESIZE], msgrv1[BUFFER], msgrv2[BUFFER]; 
  3.     const char *msgptr1 = "test message1"
  4.     const char *msgptr2 = "test message2 with differnet length"
  5.     mqd_t mqdes; 
  6.     int prio1 = 1, prio2 = 2; 
  7.     struct timespec ts; 
  8.     struct mq_attr attr; 
  9.     int unresolved = 0, failure = 0; 
  10.     sprintf(mqname, "/" FUNCTION "_" TEST "_%d", getpid()); 
  11.     attr.mq_msgsize = BUFFER; 
  12.     attr.mq_maxmsg = BUFFER; 
  13.     mqdes = mq_open(mqname, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR, &attr); 
  14.     if (mqdes == (mqd_t)-1) { 
  15.         perror(ERROR_PREFIX "mq_open"); 
  16.         unresolved = 1; 
  17.     } 
  18.     if (mq_send(mqdes, msgptr1, strlen(msgptr1), prio1) != 0) { 
  19.         perror(ERROR_PREFIX "mq_send"); 
  20.         unresolved = 1; 
  21.     } 
  22.     printf("Test PASSED\n"); 
  23.     return PTS_PASS; 

2. mq_open 發起系統調用

  1. mqd_t mq_open(const char *nameint flags, ...) 
  2.     mode_t mode = 0; 
  3.     struct mq_attr *attr = 0; 
  4.     if (*name == '/'name++; 
  5.     if (flags & O_CREAT) { 
  6.         va_list ap; 
  7.         va_start(ap, flags); 
  8.         mode = va_arg(ap, mode_t); 
  9.         attr = va_arg(ap, struct mq_attr *); 
  10.         va_end(ap); 
  11.     } 
  12.     return syscall(SYS_mq_open, name, flags, mode, attr); 

解讀

● SYS_mq_open 是真正的系統調用函數,對應一個系統調用號__NR_mq_open,通過宏SYSCALL_HAND_DEF將SysMqOpen注冊到g_syscallHandle中.

  1. static UINTPTR g_syscallHandle[SYS_CALL_NUM] = {0}; //系統調用入口函數注冊 
  2. static UINT8 g_syscallNArgs[(SYS_CALL_NUM + 1) / NARG_PER_BYTE] = {0};//保存系統調用對應的參數數量 
  3. #define SYSCALL_HAND_DEF(id, fun, rType, nArg)                                             \ 
  4.     if ((id) < SYS_CALL_NUM) {                                                             \ 
  5.         g_syscallHandle[(id)] = (UINTPTR)(fun);                                            \ 
  6.         g_syscallNArgs[(id) / NARG_PER_BYTE] |= ((id) & 1) ? (nArg) << NARG_BITS : (nArg); \ 
  7.     }                                                                                      \ 
  8.  
  9.     #include "syscall_lookup.h" 
  10. #undef SYSCALL_HAND_DEF 
  11.  
  12. SYSCALL_HAND_DEF(__NR_mq_open, SysMqOpen, mqd_t, ARG_NUM_4)   

● g_syscallNArgs為注冊函數的參數個數,也會一塊記錄下來.

● 四個參數為 SYS_mq_open的四個參數,將保存在R0~R3寄存器中

3. syscall

  1. long syscall(long n, ...) 
  2.     va_list ap; 
  3.     syscall_arg_t a,b,c,d,e,f; 
  4.     va_start(ap, n); 
  5.     a=va_arg(ap, syscall_arg_t); 
  6.     b=va_arg(ap, syscall_arg_t); 
  7.     c=va_arg(ap, syscall_arg_t); 
  8.     d=va_arg(ap, syscall_arg_t); 
  9.     e=va_arg(ap, syscall_arg_t); 
  10.     f=va_arg(ap, syscall_arg_t);//最多6個參數 
  11.     va_end(ap); 
  12.     return __syscall_ret(__syscall(n,a,b,c,d,e,f)); 
  13. static inline long __syscall4(long n, long a, long b, long c, long d) 
  14.     register long a7 __asm__("a7") = n; //系統調用號 R7寄存器 
  15.     register long a0 __asm__("a0") = a; //R0 
  16.     register long a1 __asm__("a1") = b; //R1 
  17.     register long a2 __asm__("a2") = c; //R2 
  18.     register long a3 __asm__("a3") = d; //R3 
  19.     __asm_syscall("r"(a7), "0"(a0), "r"(a1), "r"(a2), "r"(a3)) 

解讀

● 可變參數實現所有系統調用的參數的管理,可以看出,在鴻蒙內核中系統調用的參數最多不能大于6個

● R7寄存器保存了系統調用號,R0~R5保存具體每個參數

● 可變參數的具體實現后續有其余篇幅詳細介紹,敬請關注.

4. svc 0

  1. //切到SVC模式 
  2. #define __asm_syscall(...) do { \ 
  3.     __asm__ __volatile__ ( "svc 0" \ 
  4.     : "=r"(x0) : __VA_ARGS__ : "memory""cc"); \ 
  5.     return x0; \ 
  6.     } while (0) 

  1. b   reset_vector            @開機代碼 
  2.  b   _osExceptUndefInstrHdl     @異常處理之CPU碰到不認識的指令 
  3.  b   _osExceptSwiHdl            @異常處理之:軟中斷 
  4.  b   _osExceptPrefetchAbortHdl  @異常處理之:取指異常 
  5.  b   _osExceptDataAbortHdl      @異常處理之:數據異常 
  6.  b   _osExceptAddrAbortHdl      @異常處理之:地址異常 
  7.  b   OsIrqHandler               @異常處理之:硬中斷 
  8.  b   _osExceptFiqHdl                @異常處理之:快中斷 

解讀

● svc 全稱是 SuperVisor Call,完成工作模式的切換.不管之前是7個模式中的哪個模式,統一都切到SVC管理模式

● 而軟中斷對應的處理函數為 _osExceptSwiHdl,即PC寄存器將跳到_osExceptSwiHdl執行

5. _osExceptSwiHdl

  1. @ Description: Software interrupt exception handler 
  2. _osExceptSwiHdl: @軟中斷異常處理 
  3.     SUB     SP, SP, #(4 * 16)   @先申請16個棧空間用于處理本次軟中斷 
  4.     STMIA   SP, {R0-R12}        @保存R0-R12寄存器值 
  5.     MRS     R3, SPSR            @讀取本模式下的SPSR值 
  6.     MOV     R4, LR              @保存回跳寄存器LR 
  7.  
  8.     AND     R1, R3, #CPSR_MASK_MODE                          @ Interrupted mode 獲取中斷模式 
  9.     CMP     R1, #CPSR_USER_MODE                              @ User mode    是否為用戶模式 
  10.     BNE     OsKernelSVCHandler                               @ Branch if not user mode 非用戶模式下跳轉 
  11.     @ 當為用戶模式時,獲取SP和LR寄出去值 
  12.     @ we enter from user mode, we need get the values of  USER mode r13(sp) and r14(lr). 
  13.     @ stmia with ^ will return the user mode registers (provided that r15 is not in the register list). 
  14.     MOV     R0, SP                                           @獲取SP值,R0將作為OsArmA32SyscallHandle的參數 
  15.     STMFD   SP!, {R3}                                        @ Save the CPSR 入棧保存CPSR值 
  16.     ADD     R3, SP, #(4 * 17)                                @ Offset to pc/cpsr storage 跳到PC/CPSR存儲位置 
  17.     STMFD   R3!, {R4}                                        @ Save the CPSR and r15(pc) 保存LR寄存器 
  18.     STMFD   R3, {R13, R14}^                                  @ Save user mode r13(sp) and r14(lr) 保存用戶模式下的SP和LR寄存器 
  19.     SUB     SP, SP, #4 
  20.     PUSH_FPU_REGS R1    @保存中斷模式(用戶模式模式)                                          
  21.     MOV     FP, #0                                           @ Init frame pointer 
  22.     CPSIE   I   @開中斷,表明在系統調用期間可響應中斷 
  23.     BLX     OsArmA32SyscallHandle   /*交給C語言處理系統調用*/ 
  24.     CPSID   I   @執行后續指令前必須先關中斷 
  25.  
  26.     POP_FPU_REGS R1                                          @彈出FP值給R1 
  27.     ADD     SP, SP,#4                                        @ 定位到保存舊SPSR值的位置 
  28.     LDMFD   SP!, {R3}                                        @ Fetch the return SPSR 彈出舊SPSR值 
  29.     MSR     SPSR_cxsf, R3                                    @ Set the return mode SPSR 恢復該模式下的SPSR值 
  30.  
  31.     @ we are leaving to user mode, we need to restore the values of USER mode r13(sp) and r14(lr). 
  32.     @ ldmia with ^ will return the user mode registers (provided that r15 is not in the register list) 
  33.  
  34.     LDMFD   SP!, {R0-R12}                                    @恢復R0-R12寄存器 
  35.     LDMFD   SP, {R13, R14}^                                  @ Restore user mode R13/R14 恢復用戶模式的R13/R14寄存器 
  36.     ADD     SP, SP, #(2 * 4)                                 @定位到保存舊PC值的位置 
  37.     LDMFD   SP!, {PC}^                                       @ Return to user 切回用戶模式運行 

解讀

● 運行到此處,已經切到SVC的棧運行,所以先保存上一個模式的現場

● 獲取中斷模式,軟中斷的來源可不一定是用戶模式,完全有可能是SVC本身,比如系統調用中又發生系統調用.就變成了從SVC模式切到SVC的模式

● MOV R0, SP ;sp將作為參數傳遞給OsArmA32SyscallHandle

● 調用 OsArmA32SyscallHandle 這是所有系統調用的統一入口

● 注意看OsArmA32SyscallHandle的參數 UINT32 *regs

6. OsArmA32SyscallHandle

  1. LITE_OS_SEC_TEXT UINT32 *OsArmA32SyscallHandle(UINT32 *regs) 
  2.     UINT32 ret; 
  3.     UINT8 nArgs; 
  4.     UINTPTR handle; 
  5.     UINT32 cmd = regs[REG_R7];// R7寄存器記錄了系統調用號 
  6.      
  7.     if (cmd >= SYS_CALL_NUM) {//系統調用的總數 
  8.         PRINT_ERR("Syscall ID: error %d !!!\n", cmd); 
  9.         return regs; 
  10.     } 
  11.  
  12.     if (cmd == __NR_sigreturn) {//此時運行在內核棧,程序返回的調用,從內核態返回用戶態時觸發 
  13.         OsRestorSignalContext(regs);//恢復信號上下文,執行完函數后,切到了用戶棧 
  14.         return regs; 
  15.     } 
  16.  
  17.     handle = g_syscallHandle[cmd];//拿到系統調用的注冊函數,即 SYS_mq_open  
  18.     nArgs = g_syscallNArgs[cmd / NARG_PER_BYTE]; /* 4bit per nargs */ 
  19.     nArgs = (cmd & 1) ? (nArgs >> NARG_BITS) : (nArgs & NARG_MASK);//獲取參數個數 
  20.     if ((handle == 0) || (nArgs > ARG_NUM_7)) {//系統調用必須有參數且參數不能大于8個 
  21.         PRINT_ERR("Unsupport syscall ID: %d nArgs: %d\n", cmd, nArgs); 
  22.         regs[REG_R0] = -ENOSYS; 
  23.         return regs; 
  24.     } 
  25.     //regs[0-6] 記錄系統調用的參數,這也是由 R7 寄存器保存系統調用號的原因 
  26.     switch (nArgs) {//參數的個數  
  27.         case ARG_NUM_0: 
  28.         case ARG_NUM_1: 
  29.             ret = (*(SyscallFun1)handle)(regs[REG_R0]);//執行系統調用,類似 SysUnlink(pathname); 
  30.             break; 
  31.         case ARG_NUM_2://@note_thinking 如何是兩個參數的系統調用,這里傳的確是三個參數,任務棧中會出現怎樣的情況呢? 
  32.         case ARG_NUM_3: 
  33.             ret = (*(SyscallFun3)handle)(regs[REG_R0], regs[REG_R1], regs[REG_R2]);//類似 SysExecve(fileName, argv, envp); 
  34.             break; 
  35.         case ARG_NUM_4: 
  36.         case ARG_NUM_5: 
  37.             ret = (*(SyscallFun5)handle)(regs[REG_R0], regs[REG_R1], regs[REG_R2], regs[REG_R3], 
  38.                                          regs[REG_R4]); 
  39.             break; 
  40.         default:    //7個參數的情況 
  41.             ret = (*(SyscallFun7)handle)(regs[REG_R0], regs[REG_R1], regs[REG_R2], regs[REG_R3], 
  42.                                          regs[REG_R4], regs[REG_R5], regs[REG_R6]); 
  43.     } 
  44.  
  45.     regs[REG_R0] = ret;//R0保存系統調用返回值 
  46.     OsSaveSignalContext(regs);//保存用戶棧現場 
  47.  
  48.     /* Return the last value of curent_regs.  This supports context switches on return from the exception. 
  49.      * That capability is only used with theSYS_context_switch system call. 
  50.      */ 
  51.     return regs;//返回寄存器的值 

解讀

● 參數是regs對應的就是R0~Rn

● R7保存的是系統調用號,R0~R3保存的是 SysMqOpen的四個參數

● g_syscallHandle[cmd]就能查詢到 SYSCALL_HAND_DEF(__NR_mq_open, SysMqOpen, mqd_t, ARG_NUM_4)注冊時對應的 SysMqOpen函數

● *(SyscallFun5)handle此時就是SysMqOpen

● 注意看 SysMqOpen 的參數是最開始的 main函數中的 mqdes = mq_open(mqname, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR, &attr); 由此完成了真正系統調用的過程

7. SysMqOpen

  1. mqd_t SysMqOpen(const char *mqName, int openFlag, mode_t mode, struct mq_attr *attr) 
  2.     mqd_t ret; 
  3.     int retValue; 
  4.     char kMqName[PATH_MAX + 1] = { 0 }; 
  5.  
  6.     retValue = LOS_StrncpyFromUser(kMqName, mqName, PATH_MAX); 
  7.     if (retValue < 0) { 
  8.         return retValue; 
  9.     } 
  10.     ret = mq_open(kMqName, openFlag, mode, attr);//一個消息隊列可以有多個進程向它讀寫消息 
  11.     if (ret == -1) { 
  12.         return (mqd_t)-get_errno(); 
  13.     } 
  14.     return ret; 

解讀

● 此處的mq_open和main函數的mq_open其實是兩個函數體實現.一個是給應用層的調用,一個是內核層使用,只是名字一樣而已.

● SysMqOpen是返回到 OsArmA32SyscallHandle regs[REG_R0] = ret;

● OsArmA32SyscallHandle再返回到 _osExceptSwiHdl

● _osExceptSwiHdl后面的代碼是用于恢復用戶模式現場和SPSR,PC 等寄存器.

以上為鴻蒙系統調用的整個過程.

關于寄存器(R0~R15)在每種模式下的使用方式,寄存器篇中已詳細說明,請前往查看.

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

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

https://harmonyos.51cto.com

 

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

2021-03-11 11:14:39

鴻蒙HarmonyOS應用

2021-06-03 08:03:13

網絡

2025-10-09 11:10:00

開發操作系統Linux

2021-04-08 09:32:17

鴻蒙HarmonyOS應用

2021-10-25 09:53:52

鴻蒙HarmonyOS應用

2021-04-02 09:42:54

鴻蒙HarmonyOS應用

2025-07-28 02:11:00

2025-07-28 03:00:00

2025-11-03 04:00:00

2021-01-22 09:47:22

鴻蒙HarmonyOS應用開發

2025-10-28 03:00:00

2024-11-28 10:35:47

2021-04-09 16:39:41

鴻蒙HarmonyOS應用

2023-02-01 08:11:40

系統調用函數

2010-04-29 10:15:01

Unix系統

2024-09-13 08:18:10

2022-01-14 08:39:47

鴻蒙HarmonyOS應用

2016-11-01 13:11:28

2021-03-11 16:07:40

鴻蒙HarmonyOS應用開發

2023-11-17 08:02:34

系統調用linux
點贊
收藏

51CTO技術棧公眾號

国内精品久久久久| 亚洲а∨天堂久久精品9966| 亚洲国产精品视频一区| 国产女优在线播放| 亚洲成av人电影| 欧美va在线播放| av动漫免费看| 久久99精品久久| 成人激情黄色小说| 国产精品国产福利国产秒拍| 国精品人伦一区二区三区蜜桃| 精品一区二区三区中文字幕在线| 亚洲福利视频一区二区| 日韩三级电影| 亚洲精品18p| 久久一区激情| 九九热视频这里只有精品| 国产又粗又猛又色| 欧美美女福利视频| 五月激情综合网| 亚洲一区三区电影在线观看| 亚洲国产精品成人久久蜜臀| 日韩高清在线不卡| 欧美激情视频网站| 欧美自拍偷拍网| 久久人人爽人人爽人人片av不| 在线观看视频一区二区欧美日韩| 激情五月六月婷婷| а天堂8中文最新版在线官网| 国产精品白丝jk黑袜喷水| 日韩av毛片网| 国产精品2020| 亚洲最大黄网| 最好看的2019年中文视频| 日韩www视频| av资源免费观看| 久久91精品| 成人激情视频| 日韩精品一区二区三区中文不卡 | 欧美变态tickling挠脚心| 成年人免费在线播放| 三级资源在线| 亚洲天堂av一区| 日韩av在线电影观看| 欧美特级特黄aaaaaa在线看| 国内国产精品久久| 国产精品美乳在线观看| 久久亚洲天堂网| 亚洲激情社区| 久久久免费av| 久草成人在线视频| 国产精品国产一区| 社区色欧美激情 | 免费视频91蜜桃| 亚洲宅男网av| 日韩激情av在线播放| 亚洲少妇中文字幕| 91成人精品在线| 日韩免费一区二区| 伊人av在线播放| 午夜日韩影院| 日韩欧美成人一区| 蜜桃色一区二区三区| 日韩中文一区二区| 日韩欧美国产电影| 国产大学生视频| 久久婷婷国产| 亚洲精品一区二三区不卡| 国产精品一级黄片| 亚洲制服一区| 一区二区三区回区在观看免费视频| 99久久人妻无码精品系列| 九热爱视频精品视频| 亚洲三级 欧美三级| 久久久久久成人网| 久久久久久久久久久妇女| 久久精品国产一区二区电影| 欧美成欧美va| 日韩午夜免费视频| 欧美在线视频网站| 一区二区视频免费观看| 黄色资源网久久资源365| 91精品黄色| 黄色片一区二区| 91丨porny丨国产| 日韩福利在线| 美女国产在线| 亚洲精品视频一区二区| 青草青青在线视频| 一区二区视频免费完整版观看| 欧美色偷偷大香| 中文字幕一区二区在线观看视频 | 日韩a在线观看| 国产欧美精品一区二区色综合朱莉 | 亚洲最大福利网| 亚洲精品久久久久久无码色欲四季| 成人免费毛片a| 欧美最大成人综合网| 日本高清在线观看wwwww色| 一区二区成人在线视频| 91免费视频网站在线观看| 欧美大片1688网站| 日韩欧美美女一区二区三区| 亚洲最大免费视频| 久久精品国产www456c0m| 欧美国产日本在线| 乱子伦一区二区三区| 国产成a人亚洲精品| 欧洲视频一区二区三区| 在线观看av免费| 色婷婷激情久久| 美女流白浆视频| 精品国产一区二区三区| 欧美黑人狂野猛交老妇| 免费av中文字幕| 国产激情一区二区三区四区 | 久久精品福利视频| 在线能看的av| 国产毛片精品视频| 奇米888一区二区三区| 日本大片在线播放| 欧美日韩一二区| 亚洲第九十七页| 91tv官网精品成人亚洲| 国产99在线|中文| 日本人妻丰满熟妇久久久久久| 中文字幕一区二区三区四区 | 蘑菇福利视频一区播放| 99久久无色码| 黄色网在线看| 欧美综合一区二区| 一区二区三区免费在线观看视频| 一区二区三区四区在线观看国产日韩| 日韩**中文字幕毛片| 亚洲黄色片视频| 亚洲天堂福利av| 国产精品久久a| 要久久电视剧全集免费| 国内精品久久久久影院优| 国产99对白在线播放| 国产精品久久久久久久浪潮网站| 日韩av片在线看| 久久夜色电影| 97热精品视频官网| 日韩在线视频观看免费| 亚洲一二三区在线观看| 精品无码av一区二区三区不卡| 97国产精品| 国产欧美在线视频| 日本中文字幕在线视频| 欧美日韩中文字幕精品| 免费一级黄色录像| 秋霞av亚洲一区二区三| 色综合电影网| 日本午夜精品久久久久| 日韩在线视频网| 91亚洲精品国偷拍自产在线观看| 国产精品丝袜久久久久久app| 国产无套粉嫩白浆内谢的出处| 午夜日韩影院| 午夜欧美大片免费观看| 少妇精品高潮欲妇又嫩中文字幕 | 欧美亚洲国产免费| 粉嫩一区二区三区| 国产亚洲欧美日韩一区二区| 中文字幕一区二区人妻视频| 国产亚洲精品aa午夜观看| 成人性做爰aaa片免费看不忠| 欧美三级情趣内衣| 国产精品自产拍在线观看| 日韩免费网站| 91精品国产综合久久香蕉的特点| 岛国毛片在线观看| 成人免费高清在线观看| 久久国产亚洲精品无码| 国产日产精品一区二区三区四区的观看方式 | 黑人糟蹋人妻hd中文字幕 | 日韩三级在线播放| 成人久久精品| 欧美精品激情blacked18| 少妇喷水在线观看| 欧美吞精做爰啪啪高潮| 国产成人综合在线视频| 成人国产在线观看| 能在线观看的av网站| 91影院成人| 国产美女精品在线观看| 欧美成人ⅴideosxxxxx| 精品国偷自产在线| 天天干,夜夜爽| 欧美伊人久久久久久午夜久久久久| 中文字幕资源站| 成人不卡免费av| 男人的天堂日韩| 中文字幕一区二区av| 精品视频免费观看| 日韩免费大片| 91国产视频在线| 在线视频婷婷| 亚洲成人亚洲激情| 中文字幕欧美人妻精品| 亚洲国产精品视频| 国产三级短视频| 豆国产96在线|亚洲| 国产精品乱码久久久久| 一区二区三区小说| 亚洲欧洲日本精品| 欧美日韩三级| 日本视频一区在线观看| 国产精品99久久免费| 97精品国产97久久久久久春色| 黄色视屏网站在线免费观看| 91麻豆精品国产无毒不卡在线观看| 国产一级二级三级视频| 国产亚洲欧美激情| 秘密基地免费观看完整版中文 | 路边理发店露脸熟妇泻火| 欧美日韩导航| 成人做爰www免费看视频网站| 是的av在线| 欧美人与物videos| 欧美三级电影一区二区三区| 亚洲毛片在线免费观看| www天堂在线| 欧美日韩在线观看一区二区| 欧美精品二区三区| 一级日本不卡的影视| 精品伦精品一区二区三区视频密桃| 成人精品一区二区三区四区| 国产无遮挡猛进猛出免费软件| 久久精品人人做人人爽电影蜜月| 久久久99精品视频| 1024精品久久久久久久久| 日本成人看片网址| 神马午夜久久| 国产偷国产偷亚洲高清97cao| 欧美大片91| 成人高h视频在线| 欧美日韩视频免费观看| 青草成人免费视频| 碰碰在线视频| 久久久久久伊人| 91极品在线| 久青草国产97香蕉在线视频| 日本黄色片在线观看| 在线日韩中文字幕| 国产黄色片在线播放| 亚洲乱码国产乱码精品精| 男人天堂一区二区| 亚洲精品一区二区三区影院 | 亚洲欧美日本视频在线观看| www.日本在线播放| 99在线|亚洲一区二区| 黄色一级片在线看| 亚洲人人精品| 婷婷无套内射影院| 国产人成精品一区二区三| 日韩av高清在线看片| 夜久久久久久| 99999精品视频| 久久婷婷久久| 蜜桃免费在线视频| 另类欧美日韩国产在线| 免费成年人高清视频| 激情久久五月天| 亚洲国产日韩在线一区| 丁香啪啪综合成人亚洲小说| 天堂www中文在线资源| 26uuu精品一区二区| xxx在线播放| 国产精品久久久久影院亚瑟| www.av成人| 亚洲午夜一区二区三区| 91蜜桃视频在线观看| 日本久久电影网| 亚洲天堂男人网| 欧美一区二区三区男人的天堂| 亚洲经典一区二区三区| 国产视频在线观看一区二区| 大片免费播放在线视频| 俺去亚洲欧洲欧美日韩| 色女人在线视频| 26uuu国产精品视频| 六九午夜精品视频| 亚洲伊人久久大香线蕉av| 国产成人福利av| 日本一区二区视频| 性xxxx欧美老肥妇牲乱| 国产高清av在线播放| 肉色丝袜一区二区| 91香蕉视频在线观看视频| 本田岬高潮一区二区三区| 90岁老太婆乱淫| 亚洲视频一区二区免费在线观看| 国产精品999久久久| 欧美丝袜丝交足nylons| 成人午夜福利视频| 一区二区三区久久精品| 黄页在线观看免费| 国产精品第1页| 一区二区三区四区高清视频| 欧美区高清在线| 亚洲欧美综合国产精品一区| 青青草原av在线播放| 国产一区视频导航| 蜜桃传媒一区二区亚洲av| 亚洲日穴在线视频| 无码任你躁久久久久久久| 欧美大片顶级少妇| 国产www.大片在线| 国模叶桐国产精品一区| 深夜日韩欧美| 欧美日韩系列| 国产综合色产| wwwwwxxxx日本| 久久综合资源网| 欧美日韩国产精品一区二区三区| 欧美丝袜自拍制服另类| 天堂av在线7| 欧美国产日本在线| 综合欧美精品| 色综合久久久久久久久五月| 国产一级一区二区| 日本久久久久久久久久| 亚洲欧洲综合另类| 中文字幕日产av| 亚洲毛片在线免费观看| h片在线观看视频免费| 亚洲综合在线小说| 国产精品99久久精品| 天天爽天天爽夜夜爽| 久久夜色精品一区| 国产区在线观看视频| 亚洲第一区第二区| 青草av在线| 亚洲free性xxxx护士hd| 色一区二区三区四区| 91淫黄看大片| 2020国产精品自拍| 特一级黄色大片| 亚洲第一区第一页| jizz一区二区三区| 国产精品久久久久久久久婷婷| 在线看片不卡| 午夜免费一级片| 亚洲视频一区二区免费在线观看| 一级二级三级视频| 色偷偷av一区二区三区乱| 成人四虎影院| 午夜一区二区三区| 男女激情视频一区| av永久免费观看| 欧美系列在线观看| 日韩在线免费电影| 91沈先生在线观看| 91精品综合| 亚洲精品久久久久久| 一区二区三区在线不卡| 亚洲精品久久久久久无码色欲四季| 久久99国产综合精品女同| 99国产精品免费网站| 欧美精品久久久久久久自慰| www.欧美日韩国产在线| 国产精品xxxx喷水欧美| 精品调教chinesegay| 亚洲天堂资源| 日本不卡久久| 精品一区二区三区久久| 国内偷拍精品视频| 亚洲精品一区二区三区香蕉| 99色在线观看| 久久综合给合久久狠狠色| 老色鬼久久亚洲一区二区| 卡一卡二卡三在线观看| 欧美欧美欧美欧美首页| 性欧美video高清bbw| 国产自产精品| 久久亚洲欧美| 男人av资源站| 精品国产一区二区三区久久影院 | 一区二区三区黄| 久久视频国产精品免费视频在线| 日本精品在线观看| 久久久亚洲精品无码| 国产欧美日韩久久| 国产xxxxxx| 欧美一级淫片丝袜脚交| 日本电影一区二区| 亚洲成人激情小说| 欧美性xxxx极品高清hd直播| 在线免费黄色| 国产激情一区二区三区在线观看| 美女诱惑黄网站一区| 男人操女人的视频网站| 亚洲级视频在线观看免费1级| abab456成人免费网址| 国产高清不卡无码视频| 久久蜜臀精品av| 精品国自产拍在线观看| 日韩美女视频免费看|