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

Linux設備驅動中的并發控制

系統 Linux
并發指的是多個執行單元同時、并行被執行,而并發的執行單元對共享資源的訪問則很容易導致競態。

[[208856]]

并發指的是多個執行單元同時、并行被執行,而并發的執行單元對共享資源的訪問則很容易導致競態。

linux內核中主要競態

1.多對稱處理器的多個CPU

2.單CPU內進程與搶占它的進程

3.中斷(硬中斷、軟中斷、Tasklet、下半部)與進程之間

訪問共享內存資源的代碼區稱為“臨界區”,臨界區需要被以某種互斥機制加以保護,中斷屏蔽、原子操作、自旋鎖和信號量等,是linux設備驅動中可采用的互斥途徑。

這幾個互斥的介紹:

1.中斷屏蔽,這個主要用于單CPU,中斷屏蔽將使得中斷和進程之間的并發不再發生。

使用方法:

  1. local_irq_disable();//屏蔽中斷 
  2. ... 
  3. ... 
  4. 臨界區 
  5. ... 
  6. local_irq_enable();//開中斷 

 

由于linux的異步IO、進程調度等很多重要的操作都依賴于中斷,中斷對于內核的運行非常重要,在屏蔽中斷期間所有的中斷都無法處理,因此長時間的屏蔽中斷很危險,有可能導致數據丟失甚至系統崩潰。所以這個不作為重點討論。

**********************************************************************************************************************************************************

2.原子操作,原子操作是一系列的不能被打斷的操作

linux內核提供了一系列的函數來實現內核中的原子操作,這些函數分為2類,分別針對位和整型變量進行原子操作。

實現原子操作的步驟:

1).定義原子變量并設置變量值

  1. void atomic_set(atomic_t *v , int i); //設置原子變量值為i 
  2.  
  3. atomic_t v = ATOMIC_INIT(0); //定義原子變量v,初始化為0 

 

2).獲取原子變量的值

  1. atomic_read(atomic_t *v); 

3).原子變量加減操作

  1. void atomic_add(int i,atomic_t *v);//原子變量加i 
  2.  
  3. void atomic_sub(int i ,atomic_t *v);//原子變量減i 

 

4).原子變量自增/自減

  1. void atomic_inc(atomic_t *v);//自增1 
  2.  
  3. void atomic_dec(atomic_t *v);//自減1 

 

5).操作并測試:對原子變量執行自增、自減后(沒有加)測試其是否為0,如果為0返回true,否則返回false。

  1. int atomic_inc_and_test(atomic_t *v); 
  2.  
  3. int atomic_dec_and_test(atomic_t *v); 
  4.  
  5. int atomic_sub_and_test(int i ,atomic_t *v); 

 

6).操作并返回

  1. int atomic_add_return(int i , atomic_t *v); 
  2.  
  3. int atomic_sub_return(int i , atomic_t *v); 
  4.  
  5. int atomic_inc_return(atomic_t * v); 
  6.  
  7. int atomic_dec_return(atomic_t * v); 

 

**********************************************************************************************************************************************************

3.自旋鎖

自旋鎖是一個忙鎖,它在一個小的循環內不斷的重復測試并設置的操作。

自旋鎖保護臨界區的特點:臨界區要小,并且臨界區內不能有導致睡眠的操作,否則可能引起系統崩潰。自旋鎖可能導致系統死鎖,引發這個問題最常見的情況是遞歸使用一個自旋鎖。

自旋鎖的操作步驟:

1).定義自旋鎖

  1. spinlock_t lock; 

2).初始化自旋鎖

  1. spin_lock_init(lock); //這是個宏,它用于動態初始化自旋鎖lock; 

3).獲得自旋鎖

  1. spin_lock(lock);//該宏用于加鎖,如果能夠立即獲得鎖,它就能馬上返回,否則,他將自旋在那里,直到該自旋鎖的保持者釋放。 
  2.  
  3. spin_trylock(lock);//能夠獲得,則返回真,否則返回假,實際上是不在原地打轉而已。 

 

4).釋放自旋鎖

  1. spin_unlock(lock); 

與上面的兩個配對使用。

例子:

  1. spinlock_t lock; 
  2.  
  3. spin_lock_init(&lock); 
  4.  
  5. spin_lock(&lock); //獲取自旋鎖,保護臨界區。。。。臨界區 
  6.  
  7. spin_unlock(&lock);//釋放自旋鎖 

 

自旋鎖不關心鎖定的臨界區究竟是如何執行的。不管是讀操作還是寫操作,實際上,對共享資源進行讀取的時候是應該可以允許多個執行單元同時訪問的,那么這樣的話,自旋鎖就有了弊端。于是便衍生出來一個讀寫鎖。

它保留了自旋的特性,但在對操作上面可以允許有多個單元進程同時操作。當然,讀和寫的時候不能同時進行。

現在又有問題了,如果我第一個進程寫共享資源,第二個進程讀的話,一旦寫了,那么就讀不到了,可能寫的東西比較多,但是第二個進程讀很小,那么能不能第一個進程寫的同時,我第二個進程讀呢?

當然可以,那么引出了順序鎖的概念。都是一樣的操作。

**********************************************************************************************************************************************************

4.信號量

是用于保護臨界區的一種常用的方法,它的使用與自旋鎖差不多,但是它不在原地打轉,當獲取不到信號量時候,進程會進入休眠等待狀態。

主要操作:

1).定義sem信號量

  1. struct semaphore sem; 

2).初始化信號量

  1. void sema_init(struct semaphore *sem, int val); 

初始化信號量,并設置sem的值為val

初始化的時候還可以這樣用,init_MUTEX(sem),這是個宏 #define init_MUTEX(sem) sema_init(sem , 1)

init_MUTEX_LOCKED(sem),這是個宏 #define init_MUTEX_LOCKED(sem) sema_init(sem , 0)

3).獲得信號量

  1. void down(struct semaphore * sem); 

該函數用于獲得信號量sem,他會導致睡眠,所以不能在中斷中使用。

  1. int down_interruptible(struct semaphore* sem); 

與上面功能類似,因為down進入睡眠狀態的進程不能被信號打斷,而它能被信號打斷,信號也會導致該函數返回。

  1. int down_trylock(struct semaphore * sem); 

4).釋放信號量

  1. void up(struct semaphore * sem); 

該函數用于釋放信號量,同時喚醒等待者。

信號量一般這樣使用:

  1. DECLARE_MUTEX(sem); 
  2.  
  3. down(&sem); 
  4.  
  5. .....臨界區 
  6.  
  7. up(&sem); 

 

linux自旋鎖和信號量采用的“獲取鎖-訪問臨界區-釋放鎖”的方式。

*************************************************************************************************************************

5.互斥體

互斥體和信號量基本上差不多。不介紹了。

總結:

并發和競態廣泛存在,這幾個機制是解決問題的好方法,中斷屏蔽很少單獨使用,原子操作只能針對整數進行,因此,自旋鎖和信號量應用最為廣泛。

自旋鎖會導致死循環,鎖定期間不允許阻塞,因此要求鎖定的臨界區要小。信號量允許臨界區阻塞,可以適用于臨界區較大的情況。讀寫自旋鎖和讀寫信號量是放寬了條件的自旋鎖和信號量,他們允許多個進程并發的讀取共享空間。

一個fifo的綜合例子

  1. /*====================================================================== 
  2.     A globalfifo driver as an example of char device drivers   
  3.     This example is to introduce poll,blocking and non-blocking access 
  4.        
  5.     The initial developer of the original code is Baohua Song 
  6.     <author@linuxdriver.cn>. All Rights Reserved. 
  7. ======================================================================*/#include <linux/module.h>#include <linux/types.h>#include <linux/fs.h>#include <linux/errno.h>#include <linux/mm.h>#include <linux/sched.h>#include <linux/slab.h>#include <linux/init.h>#include <linux/cdev.h>#include <asm/io.h>#include <asm/system.h>#include <asm/uaccess.h>#include <linux/poll.h>#include <linux/time.h>#include <linux/timer.h>#include <linux/kernel.h>#include <linux/spinlock.h>#include <linux/interrupt.h>#define GLOBALFIFO_SIZE 0x1000 /*全局fifo最大4K字節*/#define FIFO_CLEAR 0x1  /*清0全局內存的長度*/#define GLOBALFIFO_MAJOR 250    /*預設的globalfifo的主設備號*/static int globalfifo_major = GLOBALFIFO_MAJOR;/*globalfifo設備結構體*/struct globalfifo_dev                                      
  8. {                                                         
  9.   struct cdev cdev; /*cdev結構體*/                        
  10.   unsigned int current_len;    /*fifo有效數據長度*/ 
  11.   unsigned char mem[GLOBALFIFO_SIZE]; /*全局內存*/         
  12.   struct semaphore sem; /*并發控制用的信號量*/            
  13.   wait_queue_head_t r_wait; /*阻塞讀用的等待隊列頭*/      
  14.   wait_queue_head_t w_wait; /*阻塞寫用的等待隊列頭*/      
  15.   struct tasklet_struct tlet; 
  16. };struct globalfifo_dev *globalfifo_devp; /*設備結構體指針*//*文件打開函數*/int globalfifo_open(struct inode *inode, struct file *filp) 
  17. {  /*將設備結構體指針賦值給文件私有數據指針*/ 
  18.   filp->private_data = globalfifo_devp;  return 0; 
  19. }/*文件釋放函數*/int globalfifo_release(struct inode *inode, struct file *filp) 
  20. {  return 0; 
  21. }/* ioctl設備控制函數 */static int globalfifo_ioctl(struct inode *inodep, struct file *filp, unsigned  int cmd, unsigned long arg) 
  22. {  struct globalfifo_dev *dev = filp->private_data;/*獲得設備結構體指針*/ 
  23.  
  24.   switch (cmd) 
  25.   {    case FIFO_CLEAR: 
  26.      down(&dev->sem); //獲得信號量      
  27.       dev->current_len = 0; 
  28.       memset(dev->mem,0,GLOBALFIFO_SIZE); 
  29.       up(&dev->sem); //釋放信號量          
  30.       printk(KERN_INFO "globalfifo is set to zero\n");       
  31.       break;    default:      return  - EINVAL; 
  32.   }  return 0; 
  33. }static unsigned int globalfifo_poll(struct file *filp, poll_table *wait) 
  34.   unsigned int mask = 0;  struct globalfifo_dev *dev = filp->private_data; /*獲得設備結構體指針*/ 
  35.    
  36.   down(&dev->sem); 
  37.    
  38.   poll_wait(filp, &dev->r_wait, wait); 
  39.   poll_wait(filp, &dev->w_wait, wait);   
  40.   /*fifo非空*/ 
  41.   if (dev->current_len != 0) 
  42.   { 
  43.     mask |= POLLIN | POLLRDNORM; /*標示數據可獲得*/ 
  44.   }  /*fifo非滿*/ 
  45.   if (dev->current_len != GLOBALFIFO_SIZE) 
  46.   { 
  47.     mask |= POLLOUT | POLLWRNORM; /*標示數據可寫入*/ 
  48.   } 
  49.       
  50.   up(&dev->sem);  return mask; 
  51. }/*globalfifo讀函數*/static ssize_t globalfifo_read(struct file *filp, char __user *buf, size_t count
  52.   loff_t *ppos) 
  53. {  int ret;  struct globalfifo_dev *dev = filp->private_data; //獲得設備結構體指針 
  54.   DECLARE_WAITQUEUE(wait, current); //定義等待隊列 
  55.   down(&dev->sem); //獲得信號量 
  56.   add_wait_queue(&dev->r_wait, &wait); //進入讀等待隊列頭 
  57.  
  58.   /* 等待FIFO非空 */ 
  59.   if (dev->current_len == 0) 
  60.   {    if (filp->f_flags &O_NONBLOCK) 
  61.     { 
  62.       ret =  - EAGAIN;      goto out
  63.     }  
  64.     __set_current_state(TASK_INTERRUPTIBLE); //改變進程狀態為睡眠 
  65.     up(&dev->sem); 
  66.  
  67.     schedule(); //調度其他進程執行 
  68.     if (signal_pending(current))    //如果是因為信號喚醒    { 
  69.       ret =  - ERESTARTSYS;      goto out2; 
  70.     } 
  71.  
  72.     down(&dev->sem); 
  73.   }  /* 拷貝到用戶空間 */ 
  74.   if (count > dev->current_len) 
  75.     count = dev->current_len;  if (copy_to_user(buf, dev->mem, count)) 
  76.   { 
  77.     ret =  - EFAULT;    goto out
  78.   }  else 
  79.   { 
  80.     memcpy(dev->mem, dev->mem + count, dev->current_len - count); //fifo數據前移 
  81.     dev->current_len -= count; //有效數據長度減少 
  82.     printk(KERN_INFO "read %d bytes(s),current_len:%d\n"count, dev->current_len); 
  83.       
  84.     wake_up_interruptible(&dev->w_wait); //喚醒寫等待隊列     
  85.     ret = count
  86.   }  out: up(&dev->sem); //釋放信號量 
  87.   out2:remove_wait_queue(&dev->w_wait, &wait); //從附屬的等待隊列頭移除  set_current_state(TASK_RUNNING);  return ret; 
  88. }/*globalfifo寫操作*/static ssize_t globalfifo_write(struct file *filp, const char __user *buf, 
  89.   size_t count, loff_t *ppos) 
  90. {  struct globalfifo_dev *dev = filp->private_data; //獲得設備結構體指針 
  91.   int ret; 
  92.   DECLARE_WAITQUEUE(wait, current); //定義等待隊列 
  93.   down(&dev->sem); //獲取信號量 
  94.   add_wait_queue(&dev->w_wait, &wait); //進入寫等待隊列頭 
  95.  
  96.   /* 等待FIFO非滿 */ 
  97.   if (dev->current_len == GLOBALFIFO_SIZE) 
  98.   {    if (filp->f_flags &O_NONBLOCK)    //如果是非阻塞訪問    { 
  99.       ret =  - EAGAIN;      goto out
  100.     }  
  101.     __set_current_state(TASK_INTERRUPTIBLE); //改變進程狀態為睡眠 
  102.     up(&dev->sem); 
  103.  
  104.     schedule(); //調度其他進程執行 
  105.     if (signal_pending(current))    //如果是因為信號喚醒    { 
  106.       ret =  - ERESTARTSYS;      goto out2; 
  107.     } 
  108.  
  109.     down(&dev->sem); //獲得信號量  }  /*從用戶空間拷貝到內核空間*/ 
  110.   if (count > GLOBALFIFO_SIZE - dev->current_len) 
  111.     count = GLOBALFIFO_SIZE - dev->current_len;  if (copy_from_user(dev->mem + dev->current_len, buf, count)) 
  112.   { 
  113.     ret =  - EFAULT;    goto out
  114.   }  else 
  115.   { 
  116.     dev->current_len += count
  117.     printk(KERN_INFO "written %d bytes(s),current_len:%d\n"count, dev      ->current_len); 
  118.  
  119.     wake_up_interruptible(&dev->r_wait); //喚醒讀等待隊列     
  120.     ret = count
  121.   } 
  122.  
  123.  
  124. tasklet_schedule(&dev->tlet); 
  125. printk("in write jiffies=%ld\n",jiffies);  out: up(&dev->sem); //釋放信號量 
  126.   out2:remove_wait_queue(&dev->w_wait, &wait); //從附屬的等待隊列頭移除  set_current_state(TASK_RUNNING);  return ret; 
  127. }/*文件操作結構體*/static const struct file_operations globalfifo_fops ={ 
  128.   .owner = THIS_MODULE, 
  129.   .read = globalfifo_read, 
  130.   .write = globalfifo_write, 
  131.   .ioctl = globalfifo_ioctl, 
  132.   .poll = globalfifo_poll, 
  133.   .open = globalfifo_open, 
  134.   .release = globalfifo_release, 
  135. };/*初始化并注冊cdev*/static void globalfifo_setup_cdev(struct globalfifo_dev *dev, int index
  136. {  int err, devno = MKDEV(globalfifo_major, index); 
  137.  
  138.   cdev_init(&dev->cdev, &globalfifo_fops); 
  139.   dev->cdev.owner = THIS_MODULE; 
  140.   dev->cdev.ops = &globalfifo_fops; 
  141.   err = cdev_add(&dev->cdev, devno, 1);  if (err) 
  142.     printk(KERN_NOTICE "Error %d adding LED%d", err, index); 
  143. }void jit_tasklet_fn(unsigned long arg) 
  144.  printk("in jit_tasklet_fn  jiffies=%ld\n",jiffies); 
  145. }/*設備驅動模塊加載函數*/int globalfifo_init(void) 
  146. {  int ret; 
  147.   dev_t devno = MKDEV(globalfifo_major, 0);  /* 申請設備號*/ 
  148.   if (globalfifo_major) 
  149.     ret = register_chrdev_region(devno, 1, "globalfifo");  else  /* 動態申請設備號 */ 
  150.  
  151.   { 
  152.     ret = alloc_chrdev_region(&devno, 0, 1, "globalfifo"); 
  153.     globalfifo_major = MAJOR(devno); 
  154.   }  if (ret < 0)    return ret;  /* 動態申請設備結構體的內存*/ 
  155.   globalfifo_devp = kmalloc(sizeof(struct globalfifo_dev), GFP_KERNEL);  if (!globalfifo_devp)    /*申請失敗*/ 
  156.   { 
  157.     ret =  - ENOMEM;    goto fail_malloc; 
  158.   } 
  159.  
  160.   memset(globalfifo_devp, 0, sizeof(struct globalfifo_dev)); 
  161.  
  162.   globalfifo_setup_cdev(globalfifo_devp, 0); 
  163.  
  164.   init_MUTEX(&globalfifo_devp->sem);   /*初始化信號量*/ 
  165.   init_waitqueue_head(&globalfifo_devp->r_wait); /*初始化讀等待隊列頭*/ 
  166.   init_waitqueue_head(&globalfifo_devp->w_wait); /*初始化寫等待隊列頭*/ 
  167.  /* register the tasklet */ 
  168.  tasklet_init(&globalfifo_devp->tlet, jit_tasklet_fn, (unsigned long)globalfifo_devp);  return 0; 
  169.  
  170.   fail_malloc: unregister_chrdev_region(devno, 1);  return ret; 
  171. }/*模塊卸載函數*/void globalfifo_exit(void) 
  172.   cdev_del(&globalfifo_devp->cdev);   /*注銷cdev*/ 
  173.   kfree(globalfifo_devp);     /*釋放設備結構體內存*/ 
  174.   unregister_chrdev_region(MKDEV(globalfifo_major, 0), 1); /*釋放設備號*/} 
  175.  
  176. MODULE_AUTHOR("Song Baohua"); 
  177. MODULE_LICENSE("Dual BSD/GPL"); 
  178.  
  179. module_param(globalfifo_major, int, S_IRUGO); 
  180.  
  181. module_init(globalfifo_init); 
  182. module_exit(globalfifo_exit); 

 

責任編輯:龐桂玉 來源: 嵌入式Linux中文站
相關推薦

2017-02-28 17:46:15

Linux驅動技術并發控制

2023-05-15 08:58:41

塊設備驅動Linux

2023-05-12 07:27:24

Linux內核網絡設備驅動

2020-12-03 08:59:06

Linux設備驅動

2017-02-10 15:32:47

2021-11-29 07:55:45

Linux GPIO Linux 系統

2017-11-16 14:46:58

Linuxplatform總線驅動設備

2022-05-10 08:49:46

設備驅動Linux

2009-02-09 10:06:03

并發控制Web應用悲觀鎖

2016-12-15 14:55:31

Linux定時延時

2009-12-23 13:17:36

Linux設備驅動

2011-01-10 18:21:38

linux編寫程序

2021-04-07 06:00:18

JavaScript 前端并發控制

2021-04-12 12:00:13

Linux運維Linux系統

2009-12-07 09:39:04

Linux設備驅動硬件通信

2010-05-10 15:53:24

Unix系統

2022-05-26 00:48:55

Linux內核硬件

2010-05-07 10:55:37

Windows 7驅動設備

2022-01-17 11:50:38

Linux CPULinux 系統

2017-08-21 10:56:55

MySQL并發控制
點贊
收藏

51CTO技術棧公眾號

久久久国产精品亚洲一区| 狠狠做深爱婷婷久久综合一区| 91精品啪在线观看麻豆免费| 国产一级大片在线观看| 青青操综合网| 欧美军同video69gay| 日本五级黄色片| 国产一级免费在线观看| 国产精品自拍三区| 日韩av高清不卡| 久久黄色小视频| 成人三级视频| 日韩电影中文字幕在线观看| 四虎国产精品永久免费观看视频| 美女日韩欧美| 成人片在线看| 日韩电影免费在线观看| 精品久久久久久最新网址| 国产成人无码av在线播放dvd| 国产日产一区二区三区| 丁香激情综合五月| 精油按摩中文字幕久久| 久久在线免费观看视频| 熟女俱乐部一区二区| 91在线一区| 欧美高清精品3d| 日韩在线第三页| sm捆绑调教国产免费网站在线观看| 国产精品久久久爽爽爽麻豆色哟哟| 精品国产乱码久久久久久88av| 国产农村老头老太视频| 视频一区欧美精品| 欧美中文字幕在线观看| 日韩xxx高潮hd| 欧美日韩1区| 久久久国产91| 中文字幕第69页| 精品一区二区三| 亚洲天堂av女优| 美女又爽又黄视频毛茸茸| 91夜夜蜜桃臀一区二区三区| 日韩欧美色综合| 夜夜爽久久精品91| 国产高清亚洲| 欧美精品v日韩精品v韩国精品v| 精品免费国产一区二区| 依依综合在线| 日韩欧美亚洲成人| 欧美a一欧美| 欧美电影《睫毛膏》| 亚洲黄在线观看| 亚洲一区和二区| 免费观看在线一区二区三区| 欧美喷水一区二区| 爱爱爱爱免费视频| 24小时成人在线视频| 欧美日韩一区二区在线观看| 538任你躁在线精品免费| 日韩精品三区| 亚洲av熟女高潮一区二区| 国产特黄大片aaaa毛片| 好看的日韩av电影| 久久久久久免费精品| 91精品国产高潮对白| 亚洲人成毛片在线播放女女| 91精品国产一区| 成人免费a视频| 日韩专区中文字幕一区二区| 国产美女高潮久久白浆| 国产suv精品一区二区69| 国产98色在线|日韩| 久久这里有精品视频| 我要看一级黄色录像| 一区二区免费不卡在线| 久久久久成人网| 成人免费a视频| 麻豆精品视频在线观看免费| 99在线观看视频网站| 十九岁完整版在线观看好看云免费| 91香蕉视频污| 亚洲精品一区二区三区四区五区| 黄色大片在线播放| 亚洲一区二区三区国产| 欧美私人情侣网站| 羞羞视频在线观看一区二区| 精品免费日韩av| 瑟瑟视频在线观看| 亚洲成av人片乱码色午夜| 久久理论片午夜琪琪电影网| 99re这里只有精品在线| 国产激情一区二区三区四区| 日本精品视频一区| av观看在线| 一本久久a久久免费精品不卡| 手机视频在线观看| 成人性生交大片免费看96| 亚洲精品资源美女情侣酒店| 男人在线观看视频| 免费欧美日韩| 99在线视频播放| 久久米奇亚洲| 一区二区高清在线| 污版视频在线观看| 欧美久久香蕉| 欧美久久精品午夜青青大伊人| 999这里只有精品| 国产一区二区在线观看视频| 日本a级片久久久| gogo高清午夜人体在线| 欧美日韩三级一区| 一区二区三区四区免费| 国产精品a久久久久| 国产精自产拍久久久久久| 婷婷在线免费观看| 亚洲女同ⅹxx女同tv| 欧美一级片中文字幕| 荡女精品导航| 免费不卡欧美自拍视频| 中国精品一区二区| 久久蜜桃av一区精品变态类天堂| 日本a在线天堂| 亚洲精品69| 这里只有精品视频| 狠狠人妻久久久久久综合| a在线欧美一区| 91视频 - 88av| 成人午夜888| 日韩精品一区二| av之家在线观看| 日本精品视频| 日韩在线免费av| 无码人妻一区二区三区免费| 成人国产电影网| www.激情网| 高清一区二区| 色偷偷噜噜噜亚洲男人| 波多野结衣在线观看视频| 成人综合在线观看| 三上悠亚免费在线观看| 国产精品视频一区二区三区| 精品国产一区久久久| 在线免费a视频| 日本一区二区三区国色天香| 无需播放器的av| 免费成人网www| 日韩美女免费观看| 你懂的在线观看| 欧美综合亚洲图片综合区| 少妇大叫太粗太大爽一区二区| 亚洲综合国产| 欧美一进一出视频| 精品成人免费一区二区在线播放| 亚洲性夜色噜噜噜7777| a片在线免费观看| 国产精品美女一区二区在线观看| 成人一级片网站| 岛国最新视频免费在线观看| 色综合久久久久久久久久久| 日本xxx在线播放| 久久久久久穴| 日韩欧美一区二区视频在线播放| 色成人免费网站| 色系列之999| 99久久国产热无码精品免费| 国产精品久久久久久久久久精爆| 成人网页在线观看| 日韩中字在线观看| 美腿丝袜亚洲图片| 日本在线观看天堂男亚洲| 丁香婷婷在线| 欧美一卡2卡三卡4卡5免费| 欧美成欧美va| 日韩一级片大全| 国产专区欧美精品| 国产手机视频在线观看| jizz国产精品| 日韩av手机在线| 欧美成人视屏| 精品国产sm最大网站免费看 | 国产午夜亚洲精品一级在线| 日韩精品一区二区三区三区免费 | 国产免费黄色录像| 一区二区三区在线不卡| 亚州av综合色区无码一区| 天堂一区二区在线免费观看| 麻豆md0077饥渴少妇| 免费看成人人体视频| 国产精品一区二区久久久| av观看在线| 亚洲图片欧美日产| 国产国语videosex另类| 小泽玛利亚一区二区免费| 国内精品在线播放| 免费一级特黄毛片| 蜜桃tv一区二区三区| 成人啪啪免费看| 高潮在线视频| 久久精品99久久香蕉国产色戒| 免费视频一二三区| 精品视频黄色| 3d精品h动漫啪啪一区二区| 久久青青色综合| 国产亚洲欧洲黄色| 亚洲第一页视频| 欧美性生活一区| 黄色激情视频在线观看| 国产精品国产a| 一级黄色免费视频| 97视频一区| 国产精品久久久久久久久久尿| 成人影欧美片| 国产一区二区黑人欧美xxxx| 精品国产无码一区二区三区| 色综合久久88色综合天天免费| 久久久久久久久久一区二区三区| 日本一二三四高清不卡| 99国精产品一二二线| 国产免费久久久| 色婷婷综合久久久久中文一区二区 | 成人做爰视频www网站小优视频| 久久久久久久久国产| 久久综合之合合综合久久| 国产精品盗摄一区二区三区| 日韩亚洲欧美一区二区| 国产成人ay| 精品婷婷色一区二区三区蜜桃| 国产精品一区二区精品| 国产精品视频资源| 欧美色999| 日韩av免费在线看| 筱崎爱全乳无删减在线观看| av2014天堂网| 国产一区二区三区国产精品| 日本久久久久久久久久久| 精精国产xxxx视频在线中文版| 中文字幕在线成人| 欧洲伦理片一区 二区 三区| 亚洲国产91精品在线观看| 国产成年妇视频| 日韩大片在线播放| 欧美日韩第一页| 欧美成年黄网站色视频| 亚洲乱码国产乱码精品精天堂| 亚洲精品久久久蜜桃动漫| 欧美一级国产精品| 国产精品毛片久久久久久久av| 欧美麻豆精品久久久久久| 伊人网综合在线| 久久99精品视频| 国产精品免费区二区三区观看| www.久久99| 国产欧美一区二区三区视频| julia一区二区三区中文字幕| 国产精品com| av免费在线一区| 国产精品一区二区在线| 精品久久久网| 3d精品h动漫啪啪一区二区| 蜜桃av噜噜一区二区三区| 国产色噜噜噜91在线精品 | 日韩三级av在线| 精品国产乱码久久久久久天美| 国产性猛交╳xxx乱大交| 欧美日韩亚洲高清| 精品国产午夜福利| 日韩精品高清在线观看| 粉嫩av性色av蜜臀av网站| 极品少妇xxxx精品少妇偷拍| 亚洲国产成人精品久久| 国产高清免费av| 欧美精品一区二区三区在线| 青青国产在线| 上原亚衣av一区二区三区| 精品久久sese| 精品视频国产| japanese在线播放| 亚洲乱码视频| 少妇黄色一级片| 国产麻豆精品视频| 偷偷色噜狠狠狠狠的777米奇| 久久精品男人天堂av| 国产suv一区二区三区| 精品magnet| 91精品国自产| 精品伊人久久97| 黄视频在线观看网站| 欧美一级高清免费| 精品视频成人| 茄子视频成人在线观看| 午夜精品av| 国产精品乱码久久久久| 国v精品久久久网| 成人无码av片在线观看| 亚洲一区二区三区免费视频| 中文字幕+乱码+中文乱码91| 欧美精品一区二区在线观看| 老司机在线永久免费观看| 91大神福利视频在线| 成人污版视频| 日本一区二区三区视频在线观看| 伊人激情综合| www.日本久久| 国产女主播一区| 制服.丝袜.亚洲.中文.综合懂色| 555夜色666亚洲国产免| 可以在线观看的黄色| 久久久久亚洲精品国产| 亚洲黑人在线| 婷婷四房综合激情五月| 麻豆九一精品爱看视频在线观看免费| 欧美性猛交xx| 中文字幕欧美一| 日韩电影在线观看一区二区| 日韩精品免费在线视频| 欧美巨大xxxx做受沙滩| 成人国产精品免费视频| 精品少妇av| 欧美日韩怡红院| 久久精品亚洲精品国产欧美| 国产又大又黑又粗免费视频| 欧美日韩国产片| 成人精品在线播放| 欧美精品一二区| 永久免费观看精品视频| 亚洲人成网站在线观看播放| 日本麻豆一区二区三区视频| 日本aaa视频| 欧美日韩亚洲高清| 天堂成人在线视频| 欧美激情一二三| 亚洲视频一起| www.avtt| 成人h动漫精品一区二区| 国产97免费视频| 欧美一区二区大片| 伊人影院蕉久影院在线播放| 91精品中国老女人| 在线看片不卡| xxxxwww一片| 亚洲午夜视频在线| 老牛影视av牛牛影视av| 欧美精品videosex性欧美| 亚洲乱码一区| 亚洲精品无码国产| 成人高清视频在线| 91精品国产乱码在线观看| 亚洲第一精品电影| 在线观看福利电影| 日本在线高清视频一区| 日韩成人精品在线观看| 国产wwwwxxxx| 欧美一区二区三区喷汁尤物| 青春草视频在线观看| 国产在线欧美日韩| 亚洲欧美日韩精品一区二区| 亚洲精品成人无码| 欧美三区免费完整视频在线观看| 麻豆视频在线免费观看| 97久久精品午夜一区二区| 最新国产拍偷乱拍精品| 少妇久久久久久久久久| 欧美欧美午夜aⅴ在线观看| 在线h片观看| 蜜桃999成人看片在线观看| 秋霞午夜av一区二区三区| 97在线观看免费高| 亚洲大胆美女视频| 婷婷综合六月| 中文字幕一区二区三区四区五区人| 国产黄色91视频| 九色综合婷婷综合| 日本在线观看高清完整版| 高清国产一区| 亚洲欧美视频一区二区三区| 亚洲图片第一页| 精品少妇一区二区三区| 日韩电影大全网站| 8x8x华人在线| 久久你懂得1024| 国产男女猛烈无遮挡| 欧洲中文字幕国产精品| 偷拍欧美精品| 久久精品老司机| 欧美一区二区三区不卡| 一个人看的www视频在线免费观看| 伊人av成人| 97久久精品人人爽人人爽蜜臀| 亚洲系列第一页| 午夜伦理精品一区| 99久久夜色精品国产亚洲狼| 五十路六十路七十路熟婆| 欧美日韩国产电影| 久草免费在线视频| 正在播放一区二区三区| 91丝袜美腿高跟国产极品老师 | 国产激情在线播放| 亚洲欧美在线网| 久久综合丝袜日本网| www.97超碰| 国产三级精品网站|