成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > Linux內(nèi)核設備驅(qū)動之字符設備驅(qū)動筆記整理

Linux內(nèi)核設備驅(qū)動之字符設備驅(qū)動筆記整理

熱門標簽:涪陵商都400電話開通辦理 外呼系統(tǒng)不彈窗 外呼系統(tǒng)的經(jīng)營范圍 柳州市機器人外呼系統(tǒng)報價 智能電話機器人坐席 申請400電話價格多少 云會外呼系統(tǒng) 廈門營銷外呼系統(tǒng)平臺 安陽ai電銷機器人軟件
/********************
 * 字符設備驅(qū)動
 ********************/

(1)字符設備驅(qū)動介紹

字符設備是指那些按字節(jié)流訪問的設備,針對字符設備的驅(qū)動稱為字符設備驅(qū)動。

此類驅(qū)動適合于大多數(shù)簡單的硬件設備。比如并口打印機,我們通過在/dev下建立一個設備文件(如/dev/printer)來訪問它。

用戶應用程序用標準的open函數(shù)打開dev/printer,然后用write向文件中寫入數(shù)據(jù),用read從里面讀數(shù)據(jù)。

調(diào)用流程:

  • write(): 用戶空間 -->
  • sys_write(): VFS -->
  • f_op->write: 特定設備的寫方法

所謂驅(qū)動,就是提供最后的write函數(shù),通過訪問打印機硬件的寄存器直接和打印機對話

(2)主設備號和次設備號

a.設備編號介紹

對字符設備的訪問是通過文件系統(tǒng)內(nèi)的設備文件進行的。這些文件位于/dev。用"ls -l"查看。

設備通過設備號來標識。設備號分兩部分,主設備號和次設備號。

通常,主設備號標示設備對應的驅(qū)動程序,linux允許多個驅(qū)動共用一個主設備號;

而次設備號用于確定設備文件所指的設備。

在內(nèi)核中,用dev_t類型<linux/types.h>保存設備編號。

2.4內(nèi)核中采用16位設備號(8位主,8位從),而2.6采用32位,12位主,20位從。

在驅(qū)動中訪問設備號應該用<linux/kdev_t.h>中定義的宏。

獲取設備號:

  • MAJOR(dev_t dev)
  • MINOR(dev_t dev)
  • MKDEV(int major, int minor)

b.分配和釋放設備編號

在建立一個字符設備前,驅(qū)動需要先獲得設備編號。

分配:

#include <linux/fs.h>
int register_chrdev_region(dev_t first, unsigned int count, char *name);
//first:要分配的設備編號范圍的起始值(次設備號常設為0)
//count: 所請求的連續(xù)編號范圍
//name: 和編號關聯(lián)的設備名稱(見/proc/devices)

也可以要求內(nèi)核動態(tài)分配:

int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name);
//firstminor: 通常為0
//*dev: 存放內(nèi)核返回的設備號

釋放:

void unregister_chrdev_region(dev_t first, unsigned int count);
//在模塊的清除函數(shù)中調(diào)用

在Documentation/devices.txt中可以找到內(nèi)核已經(jīng)分配的設備號。

c.建立設備文件

當設備驅(qū)動模塊向系統(tǒng)申請了主設備號和次設備號,并且已經(jīng)通過insmod加載到內(nèi)核中后,我們就可以通過在/dev下創(chuàng)建設備文件來訪問這個設備了。

字符設備的創(chuàng)建:$>mknod /dev/mychar c major minor

我們在驅(qū)動中常常采用動態(tài)分配主次設備號的方法,這樣不會和系統(tǒng)中已有的設備號沖突。

動態(tài)分配時,/dev下的設備文件也需要通過分析/proc/devices動態(tài)建立。

見char_load和char_unload腳本。

(3)字符設備的基本數(shù)據(jù)結構

和字符設備驅(qū)動關系最緊密的3個基本的數(shù)據(jù)結構是:file, file_oepeations和inode

a.file_operations數(shù)據(jù)結構

結構中包含了若干函數(shù)指針。這些函數(shù)就是實際和硬件打交道的函數(shù)。

用戶空間調(diào)用的open,write等函數(shù)最終會調(diào)用這里面的指針所指向的函數(shù)。每個打開的文件和一組函數(shù)關聯(lián)。

見<linux/fs.h>和驅(qū)動書的p54

2.6內(nèi)核結構的初始化:

struct file_operations my_fops = {
.owner = THIS_MODULE,
.llseek = my_llseek,
.read = my_read,
.write = my_write,
.ioctl = my_ioctl,
.open = my_open,
.release = my_release,
}

2.4內(nèi)核結構的初始化:

struct file_operations my_fops = {
owner: THIS_MODULE,
llseek: my_llseek,
...
}

b.file結構<linux/fs.h>

file是一個內(nèi)核結構體,實際上和用戶open文件后返回的文件描述符fd對應。

file結構代表一個打開的文件,系統(tǒng)中每個打開的文件在內(nèi)核空間都有一個對應的file結構。

它由內(nèi)核在open時創(chuàng)建,并傳遞給在該文件上進行操作的所有函數(shù),直到最后的close函數(shù),在文件的所有實例都被關閉后,內(nèi)核會釋放這個結構。

用戶空間進程fork一個新進程后,新老進程會共享打開的文件描述符fd,這個操作不會在內(nèi)核空間創(chuàng)建新的file結構,只會增加已創(chuàng)建file結構的計數(shù)。

見<linux/fs.h>

mode_t f_mode;  通過FMODE_READ和FMODE_WRITE標示文件是否可讀或可寫。

loff_t f_pos;  當前的讀寫位置,loff_t為64位

unsigned int f_flags;  文件標志,如O_RDONLY, O_NONBLOCK, O_SYNC。標志都定義在<linux/fcntl.h>

struct file_operations *f_op;  與文件相關的操作。內(nèi)核在執(zhí)行open時對這個指針賦值??梢栽隍?qū)動的open方法中根據(jù)次設備號賦予不同的f_op

void *private;  通常將表示硬件設備的結構體賦給private.

struct dentry *f_dentry;  文件對應的目錄項(dentry)結構??赏ㄟ^filp->f_dentry->d_inode訪問索引節(jié)點。

file中其他的內(nèi)容和驅(qū)動關系不大。

c.inode結構

內(nèi)核用inode結構表示一個實際的文件,可以是一個普通的文件,也可以是一個設備文件。

每個文件只有一個inode結構,而和文件描述符對應的file結構可以有多個(多次進行open調(diào)用)。這些file都指向同一個inode。

inode定義在<linux/fs.h>

dev_t i_rdev;  對于表示設備文件的inode結構,i_rdev里包含了真正的設備編號

struct cdev *i_cdev  cdev是表示字符設備的內(nèi)核的內(nèi)部結構。當inode表示一個字符設備時,i_cdev指向內(nèi)核中的struct cdev.

其他結構和設備驅(qū)動關系不大。

用如下宏從inode獲取設備號:

  • unsigned int iminor(struct inode *inode)
  • unsigned int imajor(struct inode *inode)

(4)字符設備的注冊

內(nèi)核內(nèi)部使用struct cdev結構來表示一個字符設備。

我們的驅(qū)動要把自己的cdev注冊到內(nèi)核中去。見 <linux/cdev.h>

a.通常在設備的結構中加入cdev

struct scull_dev{
...
struct cdev cdev; /* 字符設備結構 */
}

b.初始化

void cdev_init(struct cdev *cdev, struct file_operations *fops)

c.設定cdev中的內(nèi)容

  • dev->cdev.owner = THIS_MODULE;
  • dev->cdev.ops = &scull_fops;

d.向內(nèi)核添加設定好的cdev

int cdev_add(struct cdev *dev, dev_t num, unsigned int count);
//num: 設備對應的第一個編號
//count: 和設備關聯(lián)的設備編號的數(shù)量,常取1
//一旦cdev_add返回,內(nèi)核就認為設備可以使用了,所以要在調(diào)用之前完成設備的硬件初始化。

(5)老式的注冊函數(shù)

2.4中的老式注冊函數(shù)仍然在驅(qū)動函數(shù)中大量存在,但新的代碼不應該使用這些代碼。

注冊:

int register_chrdev(unsigned int major,
  const char *name,
  struct file_operations *fops);
//為給定的主設備號注冊0~255作為次設備號,并為每個設備建立一個對應的默認cdev結構

注銷:

int unregister_chrdev(unsigned int major,
  const char *name);

(6)open和release

a.open

在驅(qū)動的open方法中完成設備的初始化工作,open完成后,硬件就可以使用,用戶程序可以通過write等訪問設備,open的工作有:

  • *檢查設備的特定錯誤
  • *如果設備首次打開,則對其進行初始化(有可能多次調(diào)用open)
  • *如有必要,更新f_op指針
  • *分配并填寫置于filp->private_data中的數(shù)據(jù)

open原型;

int (*open) (struct inode *inode, struct file *filp);
//在open中通過inode獲得dev指針,并將其賦給file->private_data
//struct scull_dev *dev;
//dev = contain_of(inode->i_cdev, struct scull_dev, cdev);
//filp->private_data = dev;
//(如果dev是靜態(tài)分配的,則在open或write等方法中可以直接訪問dev,但如果dev是在module_init時動態(tài)分配的,則只能通過上面的方法獲得其指針)

b.release

并不是每個close調(diào)用都會引起對release方法的調(diào)用,只有當file的計數(shù)器歸零時,才會調(diào)用release,從而釋放dev結構)

(7)read和write

read和write的工作是從用戶空間拷貝數(shù)據(jù)到內(nèi)核,或是將內(nèi)核數(shù)據(jù)拷貝到用戶空間。其原型為:

ssize_t read(struct file *filp, char __user *buff, size_t count, loff_t *offp);
ssize_t write(struct file *filp, const char __user *buff, size_t count, loff_t *offp);
//buff: 用戶空間的緩沖區(qū)指針
//offp: 用戶在文件中進行存取操作的位置
//在read和write中,拷貝完數(shù)據(jù)后,應該更新offp,并將實際完成的拷貝字節(jié)數(shù)返回。

(8)和用戶空間交換數(shù)據(jù)

read和write中的__user *buff 是用戶空間的指針,內(nèi)核不能直接引用其中的內(nèi)容(也就是不能直接對buff進行取值操作),需要通過內(nèi)核提供的函數(shù)進行數(shù)據(jù)拷貝。其原因是:

  • a.在不同架構下,在內(nèi)核模式中運行時,用戶空間的指針可能是無效的。
  • b.用戶空間的內(nèi)存是分頁的,系統(tǒng)調(diào)用執(zhí)行時,buff指向的內(nèi)存可能根本不在RAM中(被交換到磁盤中了)
  • c.這可能是個無效或者惡意指針(比如指向內(nèi)核空間)

內(nèi)核和用戶空間交換數(shù)據(jù)的函數(shù)見<asm/uaccess.h>

如:

1. unsigned long copy_to_user(
      void __user *to, 
      const void *from, 
      unsigned long count);
//向用戶空間拷貝數(shù)據(jù)

2. unsigned long copy_from_user(
      void *to, 
      const void __user *from, 
      unsigned long count);
//從用戶空間獲得數(shù)據(jù)

3. int put_user(datum, ptr)
//向用戶空間拷貝數(shù)據(jù)。字節(jié)數(shù)由sizeof(*ptr)決定
//返回值為0成功,為負錯誤。

4. int get_user(local, ptr);
//從用戶空間獲得數(shù)據(jù)。字節(jié)數(shù)由sizeof(*ptr)決定
//返回值和local都是從用戶空間獲得的數(shù)據(jù)

任何訪問用戶空間的函數(shù)都必須是可睡眠的,這些函數(shù)需要可重入。

copy_to_user等函數(shù)如果返回值不等于0,則read或write應向用戶空間返回-EFAULT

主設備號用來表示設備驅(qū)動, 次設備號表示使用該驅(qū)動的設備

在內(nèi)核dev_t 表示設備號, 設備號由主設備號和次設備號組成

#include <linux/kdev_t.h>
#define MAJOR(dev) ((unsigned int) ((dev) >> MINORBITS)) //根據(jù)設備號獲取主設備號
#define MINOR(dev) ((unsigned int) ((dev) & MINORMASK)) //獲取次設備號
#define MKDEV(ma,mi) (((ma) << MINORBITS) | (mi))     //根據(jù)指定的主設備和次設備號生成設備號
#include <linux/fs.h> 
//靜態(tài):申請指定的設備號, from指設備號, count指使用該驅(qū)動有多少個設備(次設備號), 設備名 
int register_chrdev_region(dev_t from, unsigned count, const char *name);
//name的長度不能超過64字節(jié) 
//動態(tài)申請設備號, 由內(nèi)核分配沒有使用的主設備號, 分配好的設備存在dev, baseminor指次設備號從多少開始, count指設備數(shù), name設備名 
int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count,
const char *name)
//釋放設備號, from指設備號, count指設備數(shù)
void unregister_chrdev_region(dev_t from, unsigned count)
//cat /proc/devices 可查看設備使用情況
在內(nèi)核源碼的documentations/devices.txt可查看設備號的靜態(tài)分配情況
///內(nèi)核里使用struct cdev來描述一個字符設備驅(qū)動 
#include <linux/cdev.h>
struct cdev {
struct kobject kobj;    //內(nèi)核用于管理字符設備驅(qū)動 
struct module *owner;   //通常設為THIS_MODULE, 用于防止驅(qū)動在使用中時卸載驅(qū)動模塊
const struct file_operations *ops; //怎樣操作(vfs)
struct list_head list;   //因多個設備可以使用同一個驅(qū)動, 用鏈表來記錄
dev_t dev;         //設備號
unsigned int count;    //設備數(shù)
};

////////字符設備驅(qū)動//////////

1. 申請設備號

2. 定義一個cdev的設備驅(qū)動對象

struct cdev mycdev; 
//定義一個file_operations的文件操作對象
struct file_operations fops = {
.owner = THIS_MODULE,
.read = 讀函數(shù)
....
};

3. 把fops對象與mycdev關聯(lián)起來

cdev_init(&mycdev, &fops); //mycdev.ops = &fops;
mycdev.owner = THIS_MODULE; 

4. 把設備驅(qū)動加入內(nèi)核里, 并指定該驅(qū)動對應的設備號

cdev_add(&mycdev, 設備號, 次設備號的個數(shù));

5. 卸載模塊時, 要把設備驅(qū)動從內(nèi)核里移除, 并把設備號反注冊

cdev_del(&mycdev);
///////////創(chuàng)建設備文件
mknod /dev/設備文件名 c 主設備號 次設備號
////////inode節(jié)點對象描述一個文件/設備文件, 包括權限,設備號等信息
struct inode {
...
dev_t i_rdev;   //設備文件對應的設備號
struct cdev *i_cdev; //指向?qū)脑O備驅(qū)動對象的地址
...
};
////file對象描述文件描述符, 在文件打開時創(chuàng)建, 關閉時銷毀
struct file {
...
const struct file_operations *f_op; //對應的文件操作對象的地址
unsigned int f_flags; //文件打開的標志
fmode_t f_mode; //權限
loff_t f_pos;  //文件描述符的偏移
struct fown_struct f_owner; //屬于哪個進程
unsigned int f_uid, f_gid; 
void *private_data; //給驅(qū)動程序員使用
...
};

通file里的成員f_path.dentry->d_inode->i_rdev可以獲取到設備文件的設備號

///錯誤碼在<asm/errno.h> ////

/////////struct file_operations ////

inode表示應用程序打開的文件的節(jié)點對象,  file表示打開文件獲取到的文件描述符

成功返回0, 失敗返回錯誤碼

int (*open) (struct inode *, struct file *);

buf指向用戶進程里的緩沖區(qū), len表示buf的大小(由用戶調(diào)用read時傳進來的)

off表示fl文件描述符的操作偏移, 返回值為實際給用戶的數(shù)據(jù)字節(jié)數(shù).

ssize_t (*read) (struct file *fl, char __user *buf, size_t len, loff_t *off);

用戶進程把數(shù)據(jù)給驅(qū)動

ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);

to指用戶進程的緩沖區(qū), from指驅(qū)動里裝數(shù)據(jù)的緩沖區(qū), n多少字節(jié), 返回值是0

extern inline long copy_to_user(void __user *to, const void *from, long n)

to指驅(qū)動的...   from用戶...    n多少字節(jié), ....

static inline unsigned long __must_check copy_to_user(void __user *to, const
void *from, unsigned long n)
{
if (access_ok(VERIFY_WRITE, to, n))
n = __copy_to_user(to, from, n);
return n; //返回值為剩下多少字節(jié)沒拷貝
}
extern inline long copy_from_user(void *to, const void __user *from, long n)
  • 如果與用戶進程交互的數(shù)據(jù)是1,2,4,8字節(jié)的話, 可用put_user(x,p) //x為值, p為地址
  • 如果從用戶進程獲取1,2,4字節(jié)的話, 可用get_user(x,p) 
///////////
///動態(tài)申請內(nèi)存, 并清零. size為申請多大(不要超過128K),
//flags為標志(常為GFP_KERNEL). 成功返回地址, 失敗返回NULL
// GFP_ATOMIC, 使用系統(tǒng)的內(nèi)存緊急池
void *kmalloc(size_t size, gfp_t flags);//申請后要內(nèi)存要清零
void *kzalloc(size_t size, gfp_t flags); //申請出來的內(nèi)存已清零
void kfree(const void *objp); //回收kmalloc/kzalloc的內(nèi)存
void *vmalloc(unsigned long size); //申請大內(nèi)存空間
void vfree(const void *addr); //回收vmalloc的內(nèi)存
// kmalloc申請出來的內(nèi)存是物理地址連續(xù)的, vmalloc不一定是連續(xù)的
///// container_of(ptr, type, member) type包括member成員的結構體,
//ptr是type類型 結構體的member成員的地址.
//此宏根據(jù)結構體成員的地址獲取結構體變量的首地址
#define container_of(ptr, type, member) ({ \

const typeof( ((type *)0)->member ) *__mptr = (ptr); \

(type *)( (char *)__mptr - offsetof(type,member) );})
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
 15 typedef struct led_dev_t {
 16     dev_t mydevid;
 17     unsigned int *rLEDCON;
 18     unsigned int *rLEDDAT;
 19     struct cdev mycdev;
 20 }LED_DEV;
 LED_DEV myled;
 //ind->i_cdev是指向myled.mycdev成員的地址
 //結構體變量myled首地址可由container_of(ind->i_cdev, LED_DEV, mycdev)獲取;

/////// 自動創(chuàng)建設備文件 ////

#include <linux/device.h>

1.  

struct class *cl; 
cl = class_create(owner, name) ; //owner指屬于哪個模塊, name類名
//創(chuàng)建出來后可以查看 /sys/class/類名
void class_destroy(struct class *cls); //用于銷毀創(chuàng)建出來的類

2. 創(chuàng)建設備文件

struct device *device_create(struct class *cls, struct device *parent,
  dev_t devt, void *drvdata,
  const char *fmt, ...)
  __attribute__((format(printf, 5, 6)));
device_create(所屬的類, NULL, 設備號, NULL, "mydev%d", 88); //在/dev/目錄下產(chǎn)生名字為mydev88的設備文件
void device_destroy(struct class *cls, dev_t devt); //用于銷毀創(chuàng)建出來的設備文件
////////
int register_chrdev(unsigned int major, const char *name,
  const struct file_operations *fops) ; //注冊設備號并創(chuàng)建驅(qū)動對象
void unregister_chrdev(unsigned int major, const char *name); //反注冊設備號并刪除驅(qū)動對象
static inline int register_chrdev(unsigned int major, const char *name,
 const struct file_operations *fops)
{
return __register_chrdev(major, 0, 256, name, fops);
}
int __register_chrdev(unsigned int major, unsigned int baseminor,
   unsigned int count, const char *name,
   const struct file_operations *fops)
{
struct char_device_struct *cd;
struct cdev *cdev;
int err = -ENOMEM;
cd = __register_chrdev_region(major, baseminor, count, name);
if (IS_ERR(cd))
return PTR_ERR(cd);
cdev = cdev_alloc();
if (!cdev)
goto out2;
cdev->owner = fops->owner;
cdev->ops = fops;
kobject_set_name(&cdev->kobj, "%s", name);
err = cdev_add(cdev, MKDEV(cd->major, baseminor), count);
if (err)
goto out;
cd->cdev = cdev;
return major ? 0 : cd->major;
out:
kobject_put(&cdev->kobj);
out2:
kfree(__unregister_chrdev_region(cd->major, baseminor, count));
return err;
}

總結

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關內(nèi)容請查看下面相關鏈接

標簽:蕪湖 福州 晉城 巴中 南充 撫順 孝感 綏化

巨人網(wǎng)絡通訊聲明:本文標題《Linux內(nèi)核設備驅(qū)動之字符設備驅(qū)動筆記整理》,本文關鍵詞  Linux,內(nèi)核,設備驅(qū)動,之,;如發(fā)現(xiàn)本文內(nèi)容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Linux內(nèi)核設備驅(qū)動之字符設備驅(qū)動筆記整理》相關的同類信息!
  • 本頁收集關于Linux內(nèi)核設備驅(qū)動之字符設備驅(qū)動筆記整理的相關信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷在线精品视频| 一个人看的www视频免费观看| 久草视频免费看| 婷婷激情五月综合| 久久久青草婷婷精品综合日韩| 色婷婷国产精品| 日本亚洲欧美三级| 久久久精品国产免费观看同学| 成人免费观看网站| 久久综合99re88久久爱| 欧美三电影在线| 伊人影院在线观看| 国产在线精品一区二区中文| 日本精品久久久久久久| 中文字幕免费在线看| 精品不卡在线视频| 日本国产在线视频| 精品一区二区在线观看| 二区三区在线播放| 久久久国产一区二区三区四区小说| 精品99在线视频| 一区二区三区中文在线观看| 国产精品污污网站在线观看| 特色特色大片在线| 亚洲精华液一区二区三区| 黄色免费网站在线| 天天槽夜夜槽| 日韩一级高清毛片| 中文字幕人成人乱码| 天堂成人国产精品一区| 亚洲视频福利| 国产精品久久久久久亚洲影视| 在线中文资源天堂| 亚洲福利国产精品| 亚洲精品一卡二卡三卡四卡| 99re免费视频精品全部| 欧美无人区码suv| 香蕉视频网站在线观看| 波多野结衣黄色| 国产日韩欧美中文在线播放| 色偷偷偷综合中文字幕;dd| 日本一区福利在线| 一区二区三区国产好的精华液| 少妇熟女视频一区二区三区| 亚洲欧洲日韩女同| 欧美黑白配在线| 国产91色在线播放| 亚洲欧美激情视频在线观看一区二区三区| 日韩精品一区二区亚洲av| 亚洲欧美在线观看| 日本视频网站在线观看| 一本色道久久综合亚洲精品小说| 亚洲毛片亚洲毛片亚洲毛片| 国产精品久久久久免费a∨大胸| 奇米色一区二区| www.激情网.com| 性欧美精品xxxx| 欧美白嫩的18sex少妇| www成人在线视频| 一区二区成人国产精品| www.国产成人| 日本不卡一区二区三区高清视频| 好吊一区二区三区| 欧美另类黑人巨大videos| 国产精品剧情一区二区在线观看| 2019年中文字幕| 国产日韩欧美一区二区三区在线观看| 亚洲精品乱码久久久久久金桔影视| 天堂网www在线观看| 亚洲精品在线视频免费观看| av免费在线电影| 日韩小视频在线观看专区| 99riav国产精品视频| www.久久精品.com| 国产一区二区三区黄片| 欧美一级淫片a免费视频| 日本少妇性高潮| 亚洲成a人片在线观看中文| 19禁羞羞电影院在线观看| 久久国产精品亚洲| 青青草国产精品亚洲专区无| 国产在线观看无码免费视频| 麻豆成人91精品二区三区| 日韩免费av一区二区三区| 成人网在线免费视频| 亚洲日本中文字幕| 欧美日韩精品久久| 国产黄色大片在线观看| 综合久久久久久久| 国产精品亚洲第五区在线| 99久久久久久久久| 蜜桃麻豆www久久国产精品| 免费一级在线观看| 嫩草视频免费在线观看| 国产精品初高中害羞小美女文| 欧美成人一区二区三区高清| 国内一区二区三区精品视频| 国产一区二区在线视频你懂的| 国产麻豆精品95视频| 亚洲人av在线影院| 婷婷开心久久网| 成人xxxxx色| 欧美私人网站| 欧美日韩你懂的| 狠狠操在线视频| 国产又粗又长又爽| 日本不卡免费一区| 欧美丰满熟妇bbb久久久| 东京热一区二区三区四区| 欧美a级网站| 久久久综合亚洲91久久98| 色综合天天狠天天透天天伊人| 欧美一级色片| 国产成人手机高清在线观看网站| 无码一区二区精品| 亚洲一卡2卡三卡4卡2021四卡| 色婷婷综合久久久| 国产日韩精品在线播放| 国产精品美女久久久久久久网站| 成人国产一区二区三区精品麻豆| 野花国产精品入口| 五月网丁香网| 亚洲美女视频一区| 天堂av在线播放| 亚洲欧美精品一区二区| 日日夜夜精品视频| h网站视频在线观看| 精品久久久久久无码中文野结衣| 一本色道久久综合亚洲精品婷婷| 中文字幕制服丝袜在线| 亚洲综合久久久久| 日韩成人免费视频| 黄页视频在线91| 奇米888四色在线精品| 又黄又骚的视频| 国产51自产区| 少妇精品久久久一区二区三区| 又大又长粗又爽又黄少妇视频| 欧美另类bbbxxxxx另类| 在线观看日韩毛片| 日韩女在线观看| 日韩精品中文字幕一区二区| 粉嫩av在线播放| 色多多视频网站| 欧美三级乱人伦电影| 亚洲精品免费观看| 欧美福利精品| avtt综合网| 亚洲大片一区二区三区| 午夜精品久久久久久久蜜桃| 欧美日韩精品是欧美日韩精品| 久久69av| 久久久久久久久久久99| 国产精品高颜值在线观看| 春暖花开成人亚洲区| 久久在线免费| 97久久香蕉国产线看观看| 日日草天天干| 狠久久av成人天堂| 91嫩草国产线观看亚洲一区二区| 久久精品在线观看| 大奶一区二区三区| 又色又爽又黄无遮挡的免费视频| 久久久久久黄色| 久久精品日韩欧美| 国产午夜精品久久久久久免费视| 欧美日韩一区国产| 欧美伊久线香蕉线新在线| 久久伦理中文字幕| 91九色蝌蚪91por成人| 麻豆av免费在线| 伊人成人在线视频| 青青草视频导航| ass极品国模人体欣赏| 欧美xxxx老人做受| www国产精品av| 中文字幕精品无码亚| 欧美电影免费观看完整版| 精品亚洲国产成人av制服丝袜| 欧美日韩亚洲第一| 在线国产伦理一区| 成人网址在线观看| 四虎精品成人免费观看| 国产精品综合视频| 成人午夜三级| 男女爱爱福利视频| 国产精品免费人成网站酒店| 久久人人爽人人爽人人av| 亚洲已满18点击进入在线看片| 成人av网址在线观看| 欧美日韩免费不卡视频一区二区三区| 91 视频免费观看| 国产日产精品一区二区三区四区的观看方式| 精品亚洲自拍| 免费精品一区二区| 欧美啪啪免费视频| 欧美日韩在线观看视频| 69精品小视频| 能看的毛片网站| 久久天天躁日日躁| 国产一区二区黑人欧美xxxx| 欧美aaaaa性bbbbb小妇| 亚洲欧美一区二区三区四区| 91捆绑美女网站| 国产伦一区二区| 国产伦精品一区二区三| 无遮挡亚洲一区| 丁香亚洲综合激情啪啪综合| 黄色一级视频免费看| 国产精品欧美风情| 亚洲欧美日产图| 91理论片午午论夜理片久久| 99精品热6080yy久久| 136国产福利精品导航网址应用| 少妇又紧又色又爽又刺激视频| 亚洲狠狠丁香婷婷综合久久久| 日本色护士高潮视频在线观看| 在线免费看黄色| 欧美视频亚洲图片| 苍井空浴缸大战猛男120分钟| 精品处破女学生| 中文字幕精品在线视频| 中文字幕日韩欧美精品高清在线| 久久草av在线| 欧美精品久久99| 91精品国产高清自在线看超| 国产精品麻豆欧美日韩ww| 一菊综合网成人综合网| 日日夜夜综合网| 亚洲精品一区二区在线看| 91香蕉视频在线观看| 亚洲国产精品女人| 国产在线二区| 日本久久91av| 日韩福利电影在线观看| 精品视频高清无人区区二区三区| 韩国福利一区| 国内黄色精品| 国产精品入口免费| 亚洲国产精品va在线| 97涩在线观看视频| 在线电影欧美成精品| 中文av在线全新| 青青草一区二区三区| 日韩国产一区三区| 日本高清不卡码| 免费在线激情视频| 日本熟妇色xxxxx日本免费看| 久久久最新网址| 中文字幕亚洲综合久久筱田步美| 99re精彩视频| 蜜臀av免费在线观看| 可以在线看的av网站| 91久久精品国产性色| 人妻内射一区二区在线视频| 麻豆tv在线观看| 色婷婷成人综合| 国产高清在线精品一区二区三区| 黄色三级视频在线播放| 国产精品一区二区欧美| 亚洲精品国产精品国自产网站| 在线尤物九色自拍| 手机在线视频一区| 久久久视频免费观看| 精品国产一区二区三区在线| 久久女同互慰一区二区三区| 亚洲无码久久久久久久| 成人97精品毛片免费看| 国产女18毛片多18精品| 欧美xxxx在线观看| 色黄久久久久久| 99久久精品国产亚洲| 久久久久99精品成人| 国产免费一区二区三区在线观看| 91成人一区二区三区| 国产精品手机视频| 群体交乱之放荡娇妻一区二区| 深夜日韩欧美| 国产精品日韩无码| www视频免费| www.亚洲自拍| 人九九综合九九宗合| 日本乱码高清不卡字幕| 全球中文成人在线| 伊人中文字幕在线| 亚洲精品自产拍在线观看app| 国产精品186在线观看在线播放| av中文字幕网| 欧美日韩精品系列| 视频一区在线| www亚洲国产| 精品国产av 无码一区二区三区| 久久精品国产亚洲一区二区三区| 综合日韩在线| 久久久久久久久久久久久久久| 日本公妇乱淫免费视频一区三区| 日本韩国在线不卡| 在线免费观看成年人视频| 成人av在线播放网站| 色综合天天天天做夜夜夜夜做| 777精品久无码人妻蜜桃| 国产在线一区不卡| 国产精品久久久久久人| 欧美乱妇20p| 日本欧美久久久久免费播放网| 中文字幕自拍偷拍| 久久精品影视| 成人看片黄a免费看在线| 色噜噜日韩精品欧美一区二区| 五月花成人网| 看黄色一级大片| 久久天堂av| 亚洲色大成网站www久久九九| 午夜精品在线播放| 成人视屏在线观看| 中文字幕一区二区三区人妻四季| 欧美国产精品中文字幕| 亚洲欧美在线观看视频| 最近免费看av| 91福利视频免费观看| 亚洲欧美国产日韩中文字幕| 97av影视网在线观看| 亚洲自偷自拍熟女另类| 日本美女久久久| 亚洲综合av在线播放| 老司机av在线免费看| 免费精品视频最新在线| 国产永久免费网站|