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

Linux驅(qū)動實踐:中斷處理函數(shù)如何【發(fā)送信號】給應(yīng)用層?

系統(tǒng) Linux
如果缺少了這些基礎(chǔ)的環(huán)節(jié),很多深層次的東西,學(xué)起來就有點空中樓閣的感覺。就好比研究Linux內(nèi)核,如果一上來就從Linux 4.x/5.x內(nèi)核版本開始研究,可以看到很多“歷史遺留”代碼。

[[441156]]

別人的經(jīng)驗,我們的階梯!

大家好,我是道哥,今天我為大伙兒解說的技術(shù)知識點是:【中斷程序如何發(fā)送信號給應(yīng)用層】。

最近分享的幾篇文章都比較基礎(chǔ),關(guān)于字符類設(shè)備的驅(qū)動程序,以及中斷處理程序。

也許在現(xiàn)代的項目是用不到這樣的技術(shù),但是萬丈高樓平地起。

只有明白了這些最基礎(chǔ)的知識點之后,再去看那些進(jìn)化出來的高級玩意,才會有一步一個腳印的獲得感。

如果缺少了這些基礎(chǔ)的環(huán)節(jié),很多深層次的東西,學(xué)起來就有點空中樓閣的感覺。

就好比研究Linux內(nèi)核,如果一上來就從Linux 4.x/5.x內(nèi)核版本開始研究,可以看到很多“歷史遺留”代碼。

這些代碼就見證著Linux一步一步的發(fā)展歷史,甚至有些人還會專門去研究 Linux 0.11 版本的內(nèi)核源碼,因為很多基本思想都是一樣的。

今天這篇文章,主要還是以代碼實例為主,把之前的兩個知識點結(jié)合起來:

在中斷處理函數(shù)中,發(fā)送信號給應(yīng)用層,以此來通知應(yīng)用層處理響應(yīng)的中斷業(yè)務(wù)。

驅(qū)動程序

示例代碼全貌

所有的操作都是在 ~/tmp/linux-4.15/drivers 目錄下完成的。

首先創(chuàng)建驅(qū)動模塊目錄:

  1. $ cd ~/tmp/linux-4.15/drivers 
  2. $ mkdir my_driver_interrupt_signal 
  3. $ touch my_driver_interrupt_signal.c 

文件內(nèi)容如下:

  1. #include <linux/module.h> 
  2. #include <linux/kernel.h> 
  3. #include <linux/ctype.h> 
  4. #include <linux/device.h> 
  5. #include <linux/cdev.h> 
  6.  
  7. #include <asm/siginfo.h> 
  8. #include <linux/pid.h> 
  9. #include <linux/uaccess.h> 
  10. #include <linux/sched/signal.h> 
  11. #include <linux/pid_namespace.h> 
  12. #include <linux/interrupt.h> 
  13.  
  14. // 中斷號 
  15. #define IRQ_NUM         1 
  16.  
  17. // 定義驅(qū)動程序的 ID,在中斷處理函數(shù)中用來判斷是否需要處理     
  18. #define IRQ_DRIVER_ID   1234 
  19.  
  20. // 設(shè)備名稱 
  21. #define MYDEV_NAME      "mydev" 
  22.  
  23. // 驅(qū)動程序數(shù)據(jù)結(jié)構(gòu) 
  24. struct myirq 
  25.     int devid; 
  26. }; 
  27.   
  28. struct myirq mydev  ={ IRQ_DRIVER_ID }; 
  29.  
  30. #define KBD_DATA_REG        0x60   
  31. #define KBD_STATUS_REG      0x64 
  32. #define KBD_SCANCODE_MASK   0x7f 
  33. #define KBD_STATUS_MASK     0x80 
  34.  
  35. // 設(shè)備類 
  36. static struct class *my_class; 
  37.  
  38. // 用來保存設(shè)備 
  39. struct cdev my_cdev; 
  40.  
  41. // 用來保存設(shè)備號 
  42. int mydev_major = 0; 
  43. int mydev_minor = 0; 
  44.  
  45. // 用來保存向誰發(fā)送信號,應(yīng)用程序通過 ioctl 把自己的進(jìn)程 ID 設(shè)置進(jìn)來。 
  46. static int g_pid = 0; 
  47.  
  48. // 用來發(fā)送信號給應(yīng)用程序 
  49. static void send_signal(int sig_no) 
  50.     int ret; 
  51.     struct siginfo info; 
  52.     struct task_struct *my_task = NULL
  53.     if (0 == g_pid) 
  54.     { 
  55.         // 說明應(yīng)用程序沒有設(shè)置自己的 PID 
  56.         printk("pid[%d] is not valid! \n", g_pid); 
  57.         return
  58.     } 
  59.  
  60.     printk("send signal %d to pid %d \n", sig_no, g_pid); 
  61.  
  62.     // 構(gòu)造信號結(jié)構(gòu)體 
  63.     memset(&info, 0, sizeof(struct siginfo)); 
  64.     info.si_signo = sig_no; 
  65.     info.si_errno = 100; 
  66.     info.si_code = 200; 
  67.  
  68.     // 獲取自己的任務(wù)信息,使用的是 RCU 鎖 
  69.     rcu_read_lock(); 
  70.     my_task = pid_task(find_vpid(g_pid), PIDTYPE_PID); 
  71.     rcu_read_unlock(); 
  72.  
  73.     if (my_task == NULL
  74.     { 
  75.         printk("get pid_task failed! \n"); 
  76.         return
  77.     } 
  78.  
  79.     // 發(fā)送信號 
  80.     ret = send_sig_info(sig_no, &info, my_task); 
  81.     if (ret < 0)  
  82.     { 
  83.            printk("send signal failed! \n"); 
  84.     } 
  85.  
  86. //中斷處理函數(shù) 
  87. static irqreturn_t myirq_handler(int irq, void * dev) 
  88.     struct myirq mydev; 
  89.     unsigned char key_code; 
  90.     mydev = *(struct myirq*)dev;     
  91.      
  92.     // 檢查設(shè)備 id,只有當(dāng)相等的時候才需要處理 
  93.     if (IRQ_DRIVER_ID == mydev.devid) 
  94.     { 
  95.         // 讀取鍵盤掃描碼 
  96.         key_code = inb(KBD_DATA_REG); 
  97.      
  98.         if (key_code == 0x01) 
  99.         { 
  100.             printk("EXC key is pressed! \n"); 
  101.             send_signal(SIGUSR1); 
  102.         } 
  103.     }    
  104.  
  105.     return IRQ_HANDLED; 
  106.  
  107. // 驅(qū)動模塊初始化函數(shù) 
  108. static void myirq_init(void) 
  109.     printk("myirq_init is called. \n"); 
  110.  
  111.     // 注冊中斷處理函數(shù) 
  112.     if(request_irq(IRQ_NUM, myirq_handler, IRQF_SHARED, MYDEV_NAME, &mydev)!=0) 
  113.     { 
  114.         printk("register irq[%d] handler failed. \n", IRQ_NUM); 
  115.         return -1; 
  116.     } 
  117.  
  118.     printk("register irq[%d] handler success. \n", IRQ_NUM); 
  119.  
  120. // 當(dāng)應(yīng)用程序打開設(shè)備的時候被調(diào)用 
  121. static int mydev_open(struct inode *inode, struct file *file) 
  122.      
  123.     printk("mydev_open is called. \n"); 
  124.     return 0;    
  125.  
  126. static long mydev_ioctl(struct file* file, unsigned int cmd, unsigned long arg) 
  127.     void __user *pArg; 
  128.     printk("mydev_ioctl is called. cmd = %d \n", cmd); 
  129.     if (100 == cmd) 
  130.     { 
  131.         // 說明應(yīng)用程序設(shè)置進(jìn)程的 PID  
  132.         pArg = (void *)arg; 
  133.         if (!access_ok(VERIFY_READ, pArg, sizeof(int))) 
  134.         { 
  135.             printk("access failed! \n"); 
  136.             return -EACCES; 
  137.         } 
  138.  
  139.         // 把用戶空間的數(shù)據(jù)復(fù)制到內(nèi)核空間 
  140.         if (copy_from_user(&g_pid, pArg, sizeof(int))) 
  141.         { 
  142.             printk("copy_from_user failed! \n"); 
  143.             return -EFAULT; 
  144.         } 
  145.     } 
  146.  
  147.     return 0; 
  148.  
  149. static const struct file_operations mydev_ops={ 
  150.     .owner = THIS_MODULE, 
  151.     .open  = mydev_open, 
  152.     .unlocked_ioctl = mydev_ioctl 
  153. }; 
  154.  
  155. static int __init mydev_driver_init(void) 
  156.     int devno; 
  157.     dev_t num_dev; 
  158.  
  159.     printk("mydev_driver_init is called. \n"); 
  160.  
  161.     // 注冊中斷處理函數(shù) 
  162.     if(request_irq(IRQ_NUM, myirq_handler, IRQF_SHARED, MYDEV_NAME, &mydev)!=0) 
  163.     { 
  164.         printk("register irq[%d] handler failed. \n", IRQ_NUM); 
  165.         return -1; 
  166.     } 
  167.  
  168.     // 動態(tài)申請設(shè)備號(嚴(yán)謹(jǐn)點的話,應(yīng)該檢查函數(shù)返回值) 
  169.     alloc_chrdev_region(&num_dev, mydev_minor, 1, MYDEV_NAME); 
  170.  
  171.     // 獲取主設(shè)備號 
  172.     mydev_major = MAJOR(num_dev); 
  173.     printk("mydev_major = %d. \n", mydev_major); 
  174.  
  175.     // 創(chuàng)建設(shè)備類 
  176.     my_class = class_create(THIS_MODULE, MYDEV_NAME); 
  177.  
  178.     // 創(chuàng)建設(shè)備節(jié)點 
  179.     devno = MKDEV(mydev_major, mydev_minor); 
  180.      
  181.     // 初始化cdev結(jié)構(gòu) 
  182.     cdev_init(&my_cdev, &mydev_ops); 
  183.  
  184.     // 注冊字符設(shè)備 
  185.     cdev_add(&my_cdev, devno, 1); 
  186.  
  187.     // 創(chuàng)建設(shè)備節(jié)點 
  188.     device_create(my_class, NULL, devno, NULL, MYDEV_NAME); 
  189.  
  190.     return 0; 
  191.  
  192. static void __exit mydev_driver_exit(void) 
  193. {    
  194.     printk("mydev_driver_exit is called. \n"); 
  195.  
  196.     // 刪除設(shè)備節(jié)點 
  197.     cdev_del(&my_cdev); 
  198.     device_destroy(my_class, MKDEV(mydev_major, mydev_minor)); 
  199.  
  200.     // 釋放設(shè)備類 
  201.     class_destroy(my_class); 
  202.  
  203.     // 注銷設(shè)備號 
  204.     unregister_chrdev_region(MKDEV(mydev_major, mydev_minor), 1); 
  205.  
  206.     // 注銷中斷處理函數(shù) 
  207.     free_irq(IRQ_NUM, &mydev); 
  208.  
  209. MODULE_LICENSE("GPL"); 
  210. module_init(mydev_driver_init); 
  211. module_exit(mydev_driver_exit); 

以上代碼主要做了兩件事情:

  • 注冊中斷號 1 的處理函數(shù):myirq_handler();
  • 創(chuàng)建設(shè)備節(jié)點 /dev/mydev;

這里的中斷號1,是鍵盤中斷。

因為它是共享的中斷,因此當(dāng)鍵盤被按下的時候,操作系統(tǒng)就會依次調(diào)用所有的中斷處理函數(shù),當(dāng)然就包括我們的驅(qū)動程序所注冊的這個函數(shù)。

中斷處理部分相關(guān)的幾處關(guān)鍵代碼如下:

  1. //中斷處理函數(shù) 
  2. static irqreturn_t myirq_handler(int irq, void * dev) 
  3.     ... 
  4.  
  5. // 驅(qū)動模塊初始化函數(shù) 
  6. static void myirq_init(void) 
  7.     ... 
  8.     request_irq(IRQ_NUM, myirq_handler, IRQF_SHARED, MYDEV_NAME, &mydev); 
  9.     ... 

在中斷處理函數(shù)中,目標(biāo)是發(fā)送信號 SIGUSR1 到應(yīng)用層,因此驅(qū)動程序需要知道應(yīng)用程序的進(jìn)程號(PID)。

根據(jù)之前的文章Linux驅(qū)動實踐:驅(qū)動程序如何發(fā)送【信號】給應(yīng)用程序?,應(yīng)用程序必須主動把自己的 PID 告訴驅(qū)動模塊才可以。這可以通過 write 或者ioctl函數(shù)來實現(xiàn),

驅(qū)動程序用來接收 PID 的相關(guān)代碼是:

  1. static long mydev_ioctl(struct file* file, unsigned int cmd, unsigned long arg) 
  2.     ... 
  3.     if (100 == cmd) 
  4.     { 
  5.         pArg = (void *)arg; 
  6.         ... 
  7.         copy_from_user(&g_pid, pArg, sizeof(int)); 
  8.     } 

知道了應(yīng)用程序的 PID,驅(qū)動程序就可以在中斷發(fā)生的時候(按下鍵盤ESC鍵),發(fā)送信號出去了:

  1. static void send_signal(int sig_no) 
  2.     struct siginfo info; 
  3.     ... 
  4.     send_sig_info(...); 
  5.  
  6. static irqreturn_t myirq_handler(int irq, void * dev) 
  7.     ... 
  8.     send_signal(SIGUSR1); 

Makefile 文件

  1. ifneq ($(KERNELRELEASE),) 
  2.     obj-m := my_driver_interrupt_signal.o 
  3. else 
  4.     KERNELDIR ?= /lib/modules/$(shell uname -r)/build 
  5.     PWD := $(shell pwd) 
  6. default
  7.     $(MAKE) -C $(KERNELDIR) M=$(PWD) modules 
  8. clean: 
  9.     rm -rf *.o *.ko *.mod.* modules.* Module.*  
  10.     $(MAKE) -C $(KERNEL_PATH) M=$(PWD) clean 
  11. endif 

編譯、測試

首先查看一下加載驅(qū)動模塊之前,1號中斷的所有驅(qū)動程序:

再看一下設(shè)備號:

  1. $ cat /proc/devices 

因為驅(qū)動注冊在創(chuàng)建設(shè)備節(jié)點的時候,是動態(tài)請求系統(tǒng)分配的。

根據(jù)之前的幾篇文章可以知道,系統(tǒng)一般會分配244這個主設(shè)備號給我們,此刻還不存在這個設(shè)備號。

編譯、加載驅(qū)動模塊:

  1. $ make 
  2. $ sudo insmod my_driver_interrupt_signal.ko 

首先看一下 dmesg 的輸出信息:

然后看一下中斷驅(qū)動程序:

可以看到我們的驅(qū)動程序( mydev )已經(jīng)登記在1號中斷的最右面。

最后看一下設(shè)備節(jié)點情況:

驅(qū)動模塊已經(jīng)準(zhǔn)備妥當(dāng),下面就是應(yīng)用程序了。

應(yīng)用程序

應(yīng)用程序的主要功能就是兩部分:

通過 ioctl 函數(shù)把自己的 PID 告訴驅(qū)動程序;

注冊信號 SIGUSR1 的處理函數(shù);

示例代碼全貌

  1. #include <stdio.h> 
  2. #include <stdlib.h> 
  3. #include <unistd.h> 
  4. #include <assert.h> 
  5. #include <fcntl.h> 
  6. #include <sys/ioctl.h> 
  7. #include <signal.h> 
  8.  
  9.  
  10. char *dev_name = "/dev/mydev"
  11.  
  12. // 信號處理函數(shù) 
  13. static void signal_handler(int signum, siginfo_t *info, void *context) 
  14.     // 打印接收到的信號值 
  15.     printf("signal_handler: signum = %d \n", signum); 
  16.     printf("signo = %d, code = %d, errno = %d \n"
  17.              info->si_signo, 
  18.              info->si_code,  
  19.              info->si_errno); 
  20.  
  21. int main(int argc, char *argv[]) 
  22.     int fd, count = 0; 
  23.     int pid = getpid(); 
  24.  
  25.     // 打開GPIO 
  26.     if((fd = open(dev_name, O_RDWR | O_NDELAY)) < 0){ 
  27.         printf("open dev failed! \n"); 
  28.         return -1; 
  29.     } 
  30.  
  31.     printf("open dev success! \n"); 
  32.      
  33.     // 注冊信號處理函數(shù) 
  34.     struct sigaction sa; 
  35.     sigemptyset(&sa.sa_mask); 
  36.     sa.sa_sigaction = &signal_handler; 
  37.     sa.sa_flags = SA_SIGINFO; 
  38.      
  39.     sigaction(SIGUSR1, &sa, NULL); 
  40.  
  41.     // set PID  
  42.     printf("call ioctl. pid = %d \n", pid); 
  43.     ioctl(fd, 100, &pid); 
  44.  
  45.     // 死循環(huán),等待接收信號 
  46.     while (1) 
  47.         sleep(1); 
  48.  
  49.     // 關(guān)閉設(shè)備 
  50.     close(fd); 

在應(yīng)用程序的最后,是一個 while(1) 死循環(huán)。因為只有在按下鍵盤上的ESC按鍵時,驅(qū)動程序才會發(fā)送信號上來,因此應(yīng)用程序需要一直存活著。

編譯、測試

新開一個中斷窗口,編譯、執(zhí)行應(yīng)用程序:

  1. $ gcc my_interrupt_singal.c -o my_interrupt_singal 
  2. $ sudo ./my_interrupt_singal 
  3. open dev success!  
  4. call ioctl. pid = 12907 
  5.  
  6. // 這里進(jìn)入 while 循環(huán) 

由于應(yīng)用程序調(diào)用了 open 和 ioctl 這兩個函數(shù),因此,驅(qū)動程序中兩個對應(yīng)的函數(shù)就會被執(zhí)行。

這可以通過 dmesg 命令的輸出信息看出來:

這個時候,按下鍵盤上的 ESC 鍵,此時驅(qū)動程序中打印如下信息:

說明:驅(qū)動程序捕獲到了鍵盤上的 ESC 鍵,并且發(fā)送信號給應(yīng)用程序了。

在執(zhí)行應(yīng)用程序的終端窗口中,可以看到如下輸出信息:

 說明:應(yīng)用程序接收到了驅(qū)動程序發(fā)來的信號!

 

責(zé)任編輯:武曉燕 來源: IOT物聯(lián)網(wǎng)小鎮(zhèn)
相關(guān)推薦

2021-12-06 07:47:36

Linux 驅(qū)動程序Linux 系統(tǒng)

2017-01-16 15:05:17

Linux信號機制分析

2017-01-16 14:48:42

Linux信號機制分析

2020-08-17 08:18:51

Java

2011-09-09 16:19:40

Android Web

2016-11-29 15:22:47

協(xié)議應(yīng)用層安全層

2021-12-27 07:55:59

Linux 中斷處理Linux 系統(tǒng)

2020-12-29 09:11:33

LinuxLinux內(nèi)核

2010-06-13 17:51:16

SET應(yīng)用層協(xié)議

2024-01-08 09:08:53

2010-06-25 15:22:16

2011-11-21 09:55:31

2010-06-13 17:46:47

2010-06-09 10:25:18

SET應(yīng)用層協(xié)議

2014-12-15 11:23:00

Docker Comp分布式應(yīng)用容器應(yīng)用

2010-06-21 17:58:06

2012-01-13 10:13:57

軟件定義網(wǎng)絡(luò)SDNOpenFlow

2014-06-27 10:04:55

網(wǎng)絡(luò)協(xié)議ipv4IP

2024-11-27 13:01:22

應(yīng)用層領(lǐng)域?qū)?/a>對接層

2017-05-11 09:10:31

CAN-bus應(yīng)用層協(xié)議
點贊
收藏

51CTO技術(shù)棧公眾號

国产视频在线观看免费| 久久久久久国产免费a片| 2001个疯子在线观看| www激情久久| 国产一区二区丝袜| 久久精品欧美一区二区| 欧洲专线二区三区| 日韩一区二区在线播放| 北条麻妃在线视频观看| 色三级在线观看| 成人午夜激情在线| 国产精品一香蕉国产线看观看| 性欧美videos| 香蕉久久精品日日躁夜夜躁| 91精品国产综合久久精品麻豆| 黄色大片中文字幕| 日本在线免费| 久久久高清一区二区三区| 亚洲精品免费av| 国产精品久久久久久人| 亚洲一级毛片| 一本色道久久88综合日韩精品| 久久久久无码精品| jizz免费一区二区三区| 午夜av一区二区三区| 中文字幕日韩精品一区二区| 亚洲av毛片成人精品| 寂寞少妇一区二区三区| 国产成人97精品免费看片| 久久久久97国产| 欧美aaaa视频| 亚洲视频日韩精品| 香港三日本8a三级少妇三级99| 久久人体av| 色屁屁一区二区| 麻豆tv在线播放| 91三级在线| 国产精品久久久久精k8| 欧美精品在线一区| 天堂国产一区二区三区| 国产精品69毛片高清亚洲| 国产精品免费电影| 久久久久久无码午夜精品直播| 亚洲日韩成人| 欧美极品美女电影一区| 欧美视频www| 四季av一区二区凹凸精品| 伊人伊成久久人综合网小说| mm131美女视频| 秋霞影视一区二区三区| 欧美大片国产精品| 好吊操视频这里只有精品| 国产美女视频一区二区| 欧美日韩国产综合视频在线观看 | 欧美日韩精品在线视频| 精品免费久久久久久久| av在线播放国产| 亚洲激情第一区| 成人在线观看毛片| 污影院在线观看| 亚洲一卡二卡三卡四卡| 999一区二区三区| 激情av在线| 午夜精品久久久久久久久久久 | 岛国片av在线| 亚洲福利电影网| 国产91xxx| 中国色在线日|韩| 一本久久a久久免费精品不卡| 亚洲自偷自拍熟女另类| 亚洲性色av| 欧美综合一区二区| 99九九99九九九99九他书对| 国产成人免费av一区二区午夜 | 天堂91在线| 国产亚洲精品资源在线26u| 欧美区高清在线| 午夜不卡视频| 亚洲精选在线视频| 给我免费播放片在线观看| 欧洲一区精品| 欧美日韩在线播放三区四区| 五月六月丁香婷婷| 国产精品xxxav免费视频| 亚洲免费av网址| 刘亦菲国产毛片bd| 国产一区日韩一区| 欧美一区二区三区精品电影| 中文字幕在线观看精品| 国产成人在线视频播放| 你懂的视频在线一区二区| 77777影视视频在线观看| 亚洲精品第1页| 久久久久久久久久久视频| 影音成人av| 日韩欧美国产高清| 尤物视频最新网址| 一个色综合网| 奇米一区二区三区四区久久| 国产伦精品一区二区三区视频痴汉 | 东京干手机福利视频| 91色porny在线视频| 亚洲一区二区三区精品动漫| 国产丝袜在线播放| 欧美日韩国产综合草草| 国产又黄又粗又猛又爽的视频| 成人在线亚洲| 高清欧美一区二区三区| 国产99久久久久久免费看| 国产成人精品三级| 热re99久久精品国产99热| 香蕉成人app免费看片| 一本大道久久a久久精二百| www.cao超碰| 色综合中文网| 久久久久久久国产| 亚洲无码久久久久久久| 99精品一区二区| 激情五月五月婷婷| 99re66热这里只有精品4| 精品黑人一区二区三区久久| 波兰性xxxxx极品hd| 欧美一级一区| 国产在线一区二区三区播放| 黄色一级大片在线免费看产| 色吊一区二区三区| 国产一级伦理片| 综合一区在线| 国产欧美精品在线播放| 色视频在线看| 亚洲成av人片www| 波多野结衣免费观看| 日韩大片在线播放| 国产精品黄页免费高清在线观看| 无码国产精品96久久久久| 一区二区三区 在线观看视频| 毛片毛片毛片毛| 日韩精品中文字幕第1页| 国产999精品久久久影片官网| 特黄aaaaaaaaa真人毛片| 亚洲理伦在线| 97国产精品视频| 亚洲精品中文字幕成人片| 国产精品午夜在线观看| 99在线免费观看视频| 午夜成人免费影院| 午夜视频一区二区| 国产中文字幕乱人伦在线观看| 538在线精品| 亚洲精品720p| 中文字幕成人在线视频| 欧美91在线|欧美| 亚洲午夜免费电影| 激情伦成人综合小说| 成人影院免费观看| 97精品国产97久久久久久久久久久久| 欧美中文在线字幕| 色婷婷在线视频观看| aiai久久| 中文字幕在线看视频国产欧美在线看完整 | 国产精品一区二区入口九绯色| 欧美日韩久久| 丁香婷婷久久久综合精品国产| 色呦呦在线视频| 欧美v日韩v国产v| 亚洲激情视频一区| 91视频www| 在线观看高清免费视频| 99精品在线免费在线观看| 成人伊人精品色xxxx视频| 性欧美videos高清hd4k| 精品福利在线导航| 欧美一级特黄视频| 欧美国产精品v| 日韩精品视频网址| 在线免费高清一区二区三区| 另类小说综合网| 欧美日韩国产网站| 久久久国产视频| 高h放荡受浪受bl| 色偷偷成人一区二区三区91| 91av手机在线| 丰满亚洲少妇av| 欧美私人情侣网站| 四季av一区二区三区免费观看| 99热在线国产| 日韩大尺度黄色| 久久久精品中文字幕| 老牛影视av牛牛影视av| 在线视频欧美区| 超碰手机在线观看| 99热99精品| 中文av一区二区三区| 国产一区亚洲| 日韩在线电影一区| av日韩精品| 国产成人精品一区二区| 羞羞电影在线观看www| 日韩女同互慰一区二区| japanese国产在线观看| 夜夜精品视频一区二区| 日本爱爱爱视频| 成人av一区二区三区| 日本中文字幕精品—区二区| 亚洲高清在线| 国产日韩视频在线播放| 美女久久久久| 成人免费在线一区二区三区| av免费在线一区| 午夜精品视频在线| av中文字幕在线播放| 亚洲深夜福利在线| 黄色三级网站在线观看| 91精品国产福利| 中文字幕人妻互换av久久 | 中文字幕精品在线视频| 日本高清视频免费看| 91精品国产欧美一区二区成人| 天码人妻一区二区三区在线看| 一区二区三区丝袜| 娇小11一12╳yⅹ╳毛片| 91亚洲资源网| 性折磨bdsm欧美激情另类| 麻豆成人91精品二区三区| 日韩少妇内射免费播放18禁裸乳| 在线中文一区| 伊人狠狠色丁香综合尤物| 国产免费播放一区二区| 国产一区二区三区色淫影院| 久久视频社区| 成人做爽爽免费视频| 嫩草伊人久久精品少妇av杨幂| 国内精品小视频在线观看| 午夜av在线免费观看| 久久久国产精品x99av | 久操精品在线| 久久精品日韩精品| 2023国产精华国产精品| 亚洲aaa激情| 国产精品一区二区三区av| 国产日产欧美a一级在线| 精品176极品一区| 国产欧美va欧美va香蕉在| 麻豆久久久久| 成人亲热视频网站| 国产精品一区二区三区av| 91理论片午午论夜理片久久| 欧美网站免费| 成人欧美在线视频| 久久国际精品| 波多野结衣成人在线| 日韩在线成人| 国产伦精品一区二区三区四区视频 | 男人天堂资源网| 国产欧美日韩一区二区三区在线观看| 亚洲熟妇无码av| 国产欧美一二三区| 天天色影综合网| 亚洲精品成a人| 日韩av电影网| 色婷婷综合中文久久一本| 国产女主播喷水视频在线观看 | 亚洲欧美激情网| 麻豆精品视频在线观看免费| 国产乱码一区二区三区四区| 国产99精品视频| 91精品小视频| 国产午夜精品一区二区三区嫩草 | 亚洲福利视频一区| 久久亚洲精品国产| 欧洲色大大久久| 国产女人高潮的av毛片| 欧美tk—视频vk| 婷婷丁香花五月天| 夜夜躁日日躁狠狠久久88av| 国产三区视频在线观看| 久久久久中文字幕2018| 欧美成人免费电影| 国产在线久久久| 久久久久久毛片免费看| 日本一区二区免费看| 婷婷激情综合| 亚洲人精品午夜射精日韩| 日韩精品成人一区二区在线| 中文字幕国产高清| 99国产精品久久久| 东京热无码av男人的天堂| 亚洲美女在线一区| 国产精品第5页| 欧美一区二区三区男人的天堂 | 最近2019免费中文字幕视频三| a视频在线播放| 欧洲中文字幕国产精品| 精品精品视频| 欧美日韩中文国产一区发布| 亚洲深深色噜噜狠狠爱网站| 国产成人无码精品久久久性色| 久久精品国产精品亚洲精品| av av在线| 中文字幕在线观看一区二区| 精品在线播放视频| 7777精品伊人久久久大香线蕉的| 亚洲欧美日韩综合在线| 另类少妇人与禽zozz0性伦| 黑人巨大精品| 懂色一区二区三区av片| 日韩精品二区| 欧美爱爱视频免费看| 国产麻豆日韩欧美久久| 久久久久久久毛片| 黄色一区二区在线| av中文字幕免费| 中文字幕精品av| 国产日韩电影| 国产一区二区在线网站| 欧美99久久| 中文字幕成人在线视频| 国产亚洲女人久久久久毛片| 国产无套内射又大又猛又粗又爽| 欧美精品久久久久久久多人混战 | 日韩一区欧美一区| 日韩 国产 欧美| 亚洲激情小视频| 久草在线视频福利| 91九色国产社区在线观看| 欧美一二区在线观看| 欧美aⅴ在线观看| eeuss鲁片一区二区三区在线观看| 欧美成人777| 欧美日韩视频第一区| 国产在线超碰| 青青草原一区二区| 天堂网av成人| 97国产在线播放| 波多野结衣中文字幕一区| 久久精品99久久久久久| 日韩一区和二区| www国产在线观看| 亚洲精品日韩av| 天天影视综合| 日本77777| 亚洲蜜臀av乱码久久精品| 国产视频在线免费观看| 欧美猛男性生活免费| 国产一区二区三区| 国产人妻互换一区二区| 国产乱码精品1区2区3区| 国产这里有精品| 日韩欧美一区二区三区在线| 在线三级中文| 国产精品推荐精品| 最新国产乱人伦偷精品免费网站| 国产av一区二区三区传媒| 亚洲一区二区三区视频在线播放 | 日韩一区二区三免费高清在线观看| 天堂精品视频| 久久er精品视频| 一区视频免费观看| 日韩精品中文字幕一区二区三区| 日本在线视频网址| 国产一级特黄a大片99| 亚久久调教视频| 色噜噜噜噜噜噜| 欧美老女人第四色| 性网站在线观看| 久久99精品久久久久久水蜜桃| 久久国产精品99国产| 国产aaaaaaaaa| 日韩一区二区三区视频在线| 国精一区二区三区| 久久久久久亚洲精品不卡4k岛国| 三级成人在线视频| 在线看的片片片免费| 亚洲精品一区二区三区影院 | 在线区一区二视频| 蜜芽在线免费观看| 国产福利一区二区三区在线观看| 99国产精品久久久久久久| 韩国三级hd中文字幕| 欧美一区二区三区人| 麻豆mv在线看| 最新欧美日韩亚洲| 成人午夜电影久久影院| 无码人妻一区二区三区免费| www.久久色.com| 加勒比色综合久久久久久久久| 黄色国产精品视频| 亚洲免费电影在线| 青青草在线免费视频| 国产精品亚洲欧美导航| 国内视频精品| 国产精品久久久视频| 精品久久国产字幕高潮| 国产精品亚洲d| 天堂…中文在线最新版在线| 国产精品人人做人人爽人人添| 日本波多野结衣在线| 成人久久久久久| 久久av在线| 免费在线观看国产精品|