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

Linux操作系統內核和設備文件對話

系統 Linux
設備文件是用來代表物理設備的。多數物理設備是用來進行輸出或輸入的,所以必須由某種機制使得內核中的設備驅動從進程中得到輸出送給設備。

設備文件是用來代表物理設備的。多數物理設備是用來進行輸出或輸入的,所以必須由某種機制使得內核中的設備驅動從進程中得到輸出送給設備。這可以通過打開輸出設備文件并且寫入做到,就想寫入一個普通文件。在下面的例子里,這由device_write實現。

這不是總能奏效的。設想你與一個連向modem的串口(技是你有一個內貓,從CPU看來它也是作為一個串口實現,所以你不需要認為這個設想太困難)。最自然要做的事情就是使用設備文件把內容寫到modem上(無論用modem命令還是電話線)或者從modem讀信息(同樣可以從modem命令回答或者通過電話線)。但是這留下的問題是當你需要和串口本身對話的時候需要怎樣做?比如發送數據發送和接收的速率。

回答是Unix使用一個叫做ioctl(input output control的簡寫)的特殊函數。每個設備都有自己的ioctl命令,這個命令可以是ioctl讀的,也可以是寫的,也可以是兩者都是或都不是。Ioctl函數由三個參數調用:適當設備的描述子,ioctl數,和一個長整型參數,可以賦予一個角色用來傳遞任何東西。

Ioctl數對設備主碼、ioctl類型、編碼、和參數的類型進行編碼。Ioctl數通常在頭文件由一個宏調用(_IO,_IOR,_IOW或_IOWR——決定于類型)。這個頭文件必須包含在使用ioctl(所以它們可以產生正確的ioctl's)程序和內核模塊(所以它可以理解)中。在下面的例子里,這個頭文件是chardev.h,使用它的程序是ioctl.c。

如果你希望在你自己的內核模塊中使用ioctl's,最好去接受一分正式的ioctl職位,這樣你就可以得到別人的ioctl's,或者他們得到你,你就可以知道哪里出了錯誤。如果想得到更多的信息,到'documentation/ioctl-number.txt'中查看內核源文件樹。

ex chardev.c

/* chardev.c

*

* Create an input/output character device

*/

/* Copyright (C) 1998-99 by Ori Pomerantz */

/* The necessary header files */

/* Standard in kernel modules */

#include /* Were doing kernel work */

#include /* Specifically, a module */

/* Deal with CONFIG_MODVERSIONS */

#if CONFIG_MODVERSIONS==1

#define MODVERSIONS

#include

#endif

/* For character devices */

/* The character device definitions are here */

#include

/* A wrapper which does next to nothing at

* at present, but may help for compatibility

* with future versions of Linux */

#include

/* Our own ioctl numbers */

#include "chardev.h"

/* In 2.2.3 /usr/include/linux/version.h includes a

* macro for this, but 2.0.35 doesnt - so I add it

* here if necessary. */

#ifndef KERNEL_VERSION

#define KERNEL_VERSION(a,b,c) ((a)*65536+(b)*256+(c))

#endif

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

#include /* for get_user and put_user */

#endif

#define SUCCESS 0

#p#

/* Device Declarations ******************************** */

/* The name for our device, as it will appear in

* /proc/devices */

#define DEVICE_NAME "char_dev"

/* The maximum length of the message for the device */

#define BUF_LEN 80

/* Is the device open right now? Used to prevent

* concurent access into the same device */

static int Device_Open = 0;

/* The message the device will give when asked */

static char Message[BUF_LEN];

/* How far did the process reading the message get?

* Useful if the message is larger than the size of the

* buffer we get to fill in device_read. */

static char *Message_Ptr;

/* This function is called whenever a process attempts

* to open the device file */

static int device_open(struct inode *inode,

struct file *file)

{

#ifdef DEBUG

printk ("device_open(%p)\n", file);

#endif

/* We dont want to talk to two processes at the

* same time */

if (Device_Open)

return -EBUSY;

/* If this was a process, we would have had to be

* more careful here, because one process might have

* checked Device_Open right before the other one

* tried to increment it. However, were in the

* kernel, so were protected against context switches.

*

* This is NOT the right attitude to take, because we

* might be running on an SMP box, but well deal with

* SMP in a later chapter.

*/

Device_Open++;

/* Initialize the message */

Message_Ptr = Message;

MOD_INC_USE_COUNT;

return SUCCESS;

}

/* This function is called when a process closes the

* device file. It doesnt have a return value because

* it cannot fail. Regardless of what else happens, you

* should always be able to close a device (in 2.0, a 2.2

* device file could be impossible to close). */

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

static int device_release(struct inode *inode,

struct file *file)

#else

static void device_release(struct inode *inode,

struct file *file)

#endif

{

#ifdef DEBUG

printk ("device_release(%p,%p)\n", inode, file);

#endif

/* Were now ready for our next caller */

Device_Open --;

MOD_DEC_USE_COUNT;

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

return 0;

#endif

}

/* This function is called whenever a process which

* has already opened the device file attempts to

* read from it. */

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

static ssize_t device_read(

struct file *file,

char *buffer, /* The buffer to fill with the data */

size_t length, /* The length of the buffer */

loff_t *offset) /* offset to the file */

#else

static int device_read(

struct inode *inode,

struct file *file,

char *buffer, /* The buffer to fill with the data */

int length) /* The length of the buffer

* (mustnt write beyond that!) */

#endif

#p#{

/* Number of bytes actually written to the buffer */

int bytes_read = 0;

#ifdef DEBUG

printk("device_read(%p,%p,%d)\n",

file, buffer, length);

#endif

/* If were at the end of the message, return 0

* (which signifies end of file) */

if (*Message_Ptr == 0)

return 0;

/* Actually put the data into the buffer */

while (length && *Message_Ptr) {

/* Because the buffer is in the user data segment,

* not the kernel data segment, assignment wouldnt

* work. Instead, we have to use put_user which

* copies data from the kernel data segment to the

* user data segment. */

put_user(*(Message_Ptr++), buffer++);

length --;

bytes_read ++;

}

#ifdef DEBUG

printk ("Read %d bytes, %d left\n",

bytes_read, length);

#endif

/* Read functions are supposed to return the number

* of bytes actually inserted into the buffer */

return bytes_read;

}

/* This function is called when somebody tries to

* write into our device file. */

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

static ssize_t device_write(struct file *file,

const char *buffer,

size_t length,

loff_t *offset)

#else

static int device_write(struct inode *inode,

struct file *file,

const char *buffer,

int length)

#endif

{

int i;

#ifdef DEBUG

printk ("device_write(%p,%s,%d)",

file, buffer, length);

#endif

for(i=0; i

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

get_user(Message, buffer+i);

#else

Message = get_user(buffer+i);

#endif

Message_Ptr = Message;

/* Again, return the number of input characters used */

return i;

}

/* This function is called whenever a process tries to

* do an ioctl on our device file. We get two extra

* parameters (additional to the inode and file

* structures, which all device functions get): the number

* of the ioctl called and the parameter given to the

* ioctl function.

*

* If the ioctl is write or read/write (meaning output

* is returned to the calling process), the ioctl call

* returns the output of this function.

*/

int device_ioctl(

struct inode *inode,

struct file *file,

unsigned int ioctl_num,/* The number of the ioctl */

unsigned long ioctl_param) /* The parameter to it */

#p#{

int i;

char *temp;

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

char ch;

#endif

/* Switch according to the ioctl called */

switch (ioctl_num) {

case IOCTL_SET_MSG:

/* Receive a pointer to a message (in user space)

* and set that to be the devices message. */

/* Get the parameter given to ioctl by the process */

temp = (char *) ioctl_param;

/* Find the length of the message */

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

get_user(ch, temp);

for (i=0; ch && ibr temp++) i++,> get_user(ch, temp);

#else

for (i=0; get_user(temp) && ibr temp++) i++,> ;

#endif

/* Dont reinvent the wheel - call device_write */

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

device_write(file, (char *) ioctl_param, i, 0);

#else

device_write(inode, file, (char *) ioctl_param, i);

#endif

break;

case IOCTL_GET_MSG:

/* Give the current message to the calling

* process - the parameter we got is a pointer,

* fill it. */

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

i = device_read(file, (char *) ioctl_param, 99, 0);

#else

i = device_read(inode, file, (char *) ioctl_param,

99);

#endif

/* Warning - we assume here the buffer length is

* 100. If its less than that we might overflow

* the buffer, causing the process to core dump.

*

* The reason we only allow up to 99 characters is

* that the NULL which terminates the string also

* needs room. */

/* Put a zero at the end of the buffer, so it

* will be properly terminated */

put_user(\, (char *) ioctl_param+i);

break;

case IOCTL_GET_NTH_BYTE:

/* This ioctl is both input (ioctl_param) and

* output (the return value of this function) */

return Message[ioctl_param];

break;

}

return SUCCESS;

}

#p#/* Module Declarations *************************** */

/* This structure will hold the functions to be called

* when a process does something to the device we

* created. Since a pointer to this structure is kept in

* the devices table, it cant be local to

* init_module. NULL is for unimplemented functions. */

struct file_operations Fops = {

NULL, /* seek */

device_read,

device_write,

NULL, /* readdir */

NULL, /* select */

device_ioctl, /* ioctl */

NULL, /* mmap */

device_open,

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)

NULL, /* flush */

#endif

device_release /* a.k.a. close */

};

/* Initialize the module - Register the character device */

int init_module()

{

int ret_val;

/* Register the character device (atleast try) */

ret_val = module_register_chrdev(MAJOR_NUM,

DEVICE_NAME,

&Fops);

/* Negative values signify an error */

if (ret_val < 0) {

printk ("%s failed with %d\n",

"Sorry, registering the character device ",

ret_val);

return ret_val;

}

printk ("%s The major device number is %d.\n",

"Registeration is a success",

MAJOR_NUM);

printk ("If you want to talk to the device driver,\n");

printk ("youll have to create a device file. \n");

printk ("We suggest you use:\n");

printk ("mknod %s c %d 0\n", DEVICE_FILE_NAME,

MAJOR_NUM);

printk ("The device file name is important, because\n");

printk ("the ioctl program assumes thats the\n");

printk ("file youll use.\n");

return 0;

}

/* Cleanup - unregister the appropriate file from /proc */

void cleanup_module()

{

int ret;

/* Unregister the device */

ret = module_unregister_chrdev(MAJOR_NUM, DEVICE_NAME);

/* If theres an error, report it */

if (ret < 0)

printk("Error in module_unregister_chrdev: %d\n", ret);

}

ex chardev.h

/* chardev.h - the header file with the ioctl definitions.

*

* The declarations here have to be in a header file,

* because they need to be known both to the kernel

* module (in chardev.c) and the process calling ioctl

* (ioctl.c)

*/

#ifndef CHARDEV_H

#define CHARDEV_H

#include

/* The major device number. We cant rely on dynamic

* registration any more, because ioctls need to know

* it. */

#define MAJOR_NUM 100

/* Set the message of the device driver */

#define IOCTL_SET_MSG _IOR(MAJOR_NUM, 0, char *)

/* _IOR means that were creating an ioctl command

* number for passing information from a user process

* to the kernel module.

#p#*

* The first arguments, MAJOR_NUM, is the major device

* number were using.

*

* The second argument is the number of the command

* (there could be several with different meanings).

*

* The third argument is the type we want to get from

* the process to the kernel.

*/

/* Get the message of the device driver */

#define IOCTL_GET_MSG _IOR(MAJOR_NUM, 1, char *)

/* This IOCTL is used for output, to get the message

* of the device driver. However, we still need the

* buffer to place the message in to be input,

* as it is allocated by the process.

*/

/* Get the nth byte of the message */

#define IOCTL_GET_NTH_BYTE _IOWR(MAJOR_NUM, 2, int)

/* The IOCTL is used for both input and output. It

* receives from the user a number, n, and returns

* Message[n]. */

/* The name of the device file */

#define DEVICE_FILE_NAME "char_dev"

#endif

ex ioctl.c

/* ioctl.c - the process to use ioctls to control the

* kernel module

*

* Until now we could have used cat for input and

* output. But now we need to do ioctls, which require

* writing our own process.

*/

/* Copyright (C) 1998 by Ori Pomerantz */

/* device specifics, such as ioctl numbers and the

* major device file. */

#include "chardev.h"

#include /* open */

#include /* exit */

#include /* ioctl */

/* Functions for the ioctl calls */

ioctl_set_msg(int file_desc, char *message)

{

int ret_val;

ret_val = ioctl(file_desc, IOCTL_SET_MSG, message);

if (ret_val < 0) {

printf ("ioctl_set_msg failed:%d\n", ret_val);

exit(-1);

}

}

ioctl_get_msg(int file_desc)

{

int ret_val;

char message[100];

/* Warning - this is dangerous because we dont tell

* the kernel how far its allowed to write, so it

* might overflow the buffer. In a real production

* program, we would have used two ioctls - one to tell

* the kernel the buffer length and another to give

* it the buffer to fill

*/

ret_val = ioctl(file_desc, IOCTL_GET_MSG, message);

if (ret_val < 0) {

printf ("ioctl_get_msg failed:%d\n", ret_val);

exit(-1);

}

printf("get_msg message:%s\n", message);

}

ioctl_get_nth_byte(int file_desc)

{

int i;

char c;

printf("get_nth_byte message:");

i = 0;

while (c != 0) {

c = ioctl(file_desc, IOCTL_GET_NTH_BYTE, i++);

if (c < 0) {

printf(

"ioctl_get_nth_byte failed at the %dth byte:\n", i);

exit(-1);

}

putchar(c);

}

putchar(\n);

}

/* Main - Call the ioctl functions */

main()

{

int file_desc, ret_val;

char *msg = "Message passed by ioctl\n";

file_desc = open(DEVICE_FILE_NAME, 0);

if (file_desc < 0) {

printf ("Cant open device file: %s\n",

DEVICE_FILE_NAME);

exit(-1);

}

ioctl_get_nth_byte(file_desc);

ioctl_get_msg(file_desc);

ioctl_set_msg(file_desc, msg);

close(file_desc);

}

【編輯推薦】

  1. 黑客再爆Linux內核高危漏洞 可以攻擊所有Linux系統
  2. Linux內核完全剖析---數學協處理器
  3. Linux內核完全剖析---math_emulate.c程序
責任編輯:趙寧寧 來源: chinaitlab
相關推薦

2011-01-14 16:23:46

Linux內核

2009-06-19 20:32:00

Linux

2009-12-22 12:14:11

Linux內核

2009-12-17 18:19:12

Linux操作系統

2011-01-04 18:15:21

2020-12-28 08:51:06

操作系統微內核Dubbo

2009-02-17 16:07:29

Linux操作系統內核啟動參數

2017-08-24 11:00:56

Linux用戶空間內核空間

2010-04-29 14:08:38

Unix操作系統

2019-06-14 08:24:16

塊設備Linux操作系統

2009-09-01 09:20:24

Linux操作系統聲音設備編程實例

2010-04-22 15:27:40

Aix操作系統

2009-12-09 17:25:19

Linux操作系統

2009-12-10 14:27:07

Linux操作系統

2020-05-08 16:39:01

內存系統架構Linux

2011-01-14 16:01:27

2009-06-21 13:50:03

Linux隱藏文件

2011-01-14 16:51:44

Linux內核

2009-12-02 14:50:28

操作系統

2010-04-22 15:53:46

Aix操作系統設備
點贊
收藏

51CTO技術棧公眾號

亚洲国产精品久久久久久6q| 无码h肉动漫在线观看| 日本aa在线| 91日韩在线专区| 国产91色在线|| 国精产品视频一二二区| youjizz亚洲| 91传媒视频在线播放| 99re8这里只有精品| 香蕉视频911| 极品少妇xxxx精品少妇偷拍| 97婷婷大伊香蕉精品视频| 男人天堂资源网| 国产精品视屏| 欧美日本乱大交xxxxx| 狠狠干 狠狠操| 九七电影韩国女主播在线观看| 成人app下载| 成人精品一区二区三区电影黑人| 久草视频精品在线| 亚洲a一区二区三区| 国产视频精品va久久久久久| 亚洲一区二区中文字幕在线观看| 波多野结衣亚洲| 亚洲最色的网站| 亚洲人久久久| 国产无套粉嫩白浆在线2022年 | 欧美俄罗斯性视频| 亚洲av成人无码久久精品| 99久久人爽人人添人人澡| 欧美日韩国产综合草草| 欧美日韩第二页| xxxcom在线观看| 亚洲精品日韩一| 亚洲精品成人自拍| 九色在线视频| 久久婷婷综合激情| 国产区一区二区三区| 成 人片 黄 色 大 片| 捆绑调教美女网站视频一区| 国产精品扒开腿做| 亚洲自拍一区在线观看| 亚洲麻豆视频| 97人人做人人爱| 麻豆一区产品精品蜜桃的特点| 久久视频国产| 色yeye香蕉凹凸一区二区av| 亚洲自拍偷拍图| 久久91麻豆精品一区| 亚洲精品成人av| 国产精品扒开腿做爽爽爽a片唱戏| 日韩精品成人在线观看| 日韩网站在线看片你懂的| 成人不卡免费视频| 成人免费91| 欧美一区二区日韩一区二区| 一区二区三区四区毛片| 亚洲天堂网站| 日韩精品中文字幕一区二区三区| 欧美熟妇另类久久久久久多毛| 成人网av.com/| 日韩一区二区三区电影在线观看| 国产精品探花在线播放| 久久久久久久久成人| 日韩三级高清在线| 国产十八熟妇av成人一区| 老司机精品在线| 日韩精品视频免费专区在线播放 | 中文在线免费一区三区高中清不卡| 久久资源av| 阿v免费在线观看| 亚洲婷婷综合久久一本伊一区| 91视频成人免费| sqte在线播放| 日韩欧美在线播放| 成人免费在线观看视频网站| 亚洲一区二区三区久久久| 91精品国产麻豆| www.555国产精品免费| 日本午夜精品| 色噜噜久久综合伊人一本| 国产老头老太做爰视频| 国产综合欧美| 国产成人精品在线视频| 国产精品呻吟久久| 99麻豆久久久国产精品免费优播| 欧美日韩无遮挡| 日韩精品黄色| 精品成人av一区| 一级在线免费视频| 99ri日韩精品视频| 亚洲色图17p| 欧美日韩人妻精品一区二区三区| 国产欧美激情| 国产在线精品成人一区二区三区| 黄色小视频免费观看| 久久精品夜色噜噜亚洲a∨| 亚洲第一精品区| 天堂av在线网| 日韩免费福利电影在线观看| 中文字幕在线看高清电影| 中文av一区| 日韩免费中文字幕| 丰满岳乱妇国产精品一区| 中日韩av电影| 乱妇乱女熟妇熟女网站| 国产95亚洲| 国产亚洲精品va在线观看| 男女免费视频网站| 蜜臀av一区二区| 九九热久久66| 欧美人与动牲性行为| 欧美日韩一卡二卡| 蜜桃传媒一区二区亚洲av| 欧美日本三区| 国产日韩欧美夫妻视频在线观看| 日韩av成人| 亚洲黄色性网站| 国产精品视频中文字幕| 亚洲人成网亚洲欧洲无码| 色综合久久悠悠| 中文字幕日韩国产| 久久久久久久电影| 欧美色图色综合| 成人自拍在线| 久久91亚洲人成电影网站| 亚洲视屏在线观看| 久久久91精品国产一区二区三区| 国产91在线亚洲| 精品中文在线| 久久久999国产| 亚洲午夜精品久久久| 国产午夜一区二区三区| 国产视频九色蝌蚪| 福利电影一区| 欧美激情精品久久久久久| 99热这里只有精品在线| 中文字幕日韩一区| 国产成人美女视频| 忘忧草精品久久久久久久高清| 国产精品美女久久久免费| 国产福利在线| 91久久奴性调教| 尤物视频最新网址| 水蜜桃久久夜色精品一区的特点| 欧美精品123| 美女100%一区| 亚洲天堂第一页| 欧美成人一区二区视频| 国产精品人妖ts系列视频| 欧美第一页浮力影院| 成人免费在线观看av| 国产综合在线观看视频| 很黄的网站在线观看| 91精品国产综合久久久久久 | 国产精品激情av电影在线观看| 日韩a在线观看| 精品福利在线看| 欧美色图亚洲激情| 日本麻豆一区二区三区视频| 日韩亚洲视频在线| 成人精品视频在线观看| 欧美高跟鞋交xxxxxhd| 天堂在线观看视频| 色综合亚洲欧洲| 国产精品久久久视频| 久久精品国产一区二区三| 男女激烈动态图| 国产欧美三级电影| 日本精品久久久久影院| www亚洲人| 日韩一区二区三区av| 日本一区二区网站| 久久久.com| 中文字幕欧美视频| 99国产精品视频免费观看一公开| 欧美主播一区二区三区美女 久久精品人 | 在线看的黄色网址| 亚洲欧美综合| 久久亚裔精品欧美| 曰本一区二区| 国内精品400部情侣激情| 神马电影在线观看| 欧美日韩一区高清| 精品小视频在线观看| 国产日韩欧美制服另类| 亚洲AV无码久久精品国产一区| 日韩午夜免费| 亚洲制服中文| 成人爽a毛片免费啪啪红桃视频| 日韩美女在线播放| 女囚岛在线观看| 亚洲午夜国产成人av电影男同| 国产精品亚洲lv粉色| 精品日韩视频在线观看| 成人信息集中地| 26uuu国产日韩综合| 污免费在线观看| 久久久国产精品一区二区中文| 中文字幕一区二区三区5566| 清纯唯美亚洲经典中文字幕| 成人免费直播live| 国产欧美一区二区三区精品酒店| 美女视频黄免费的亚洲男人天堂| 欧美日韩激情视频一区二区三区| 91精品国产综合久久蜜臀 | 在线播放日韩导航| 中文字幕在线看人| 亚洲va欧美va人人爽午夜| 免费一级suv好看的国产网站 | 日韩一区二区在线看| 久久久久久无码精品大片| 亚洲一二三区视频在线观看| 成人午夜免费影院| 久久久精品黄色| 中文字幕天堂av| 激情综合五月天| 超碰在线97免费| 欧美专区在线| 亚洲精品蜜桃久久久久久| 99久久99久久精品国产片桃花| 免费亚洲一区二区| 玖玖玖免费嫩草在线影院一区| 亚洲一区二区久久久久久| 亚洲国产尤物| 日本韩国在线不卡| 小h片在线观看| 午夜欧美不卡精品aaaaa| 免费av不卡在线观看| 久久视频中文字幕| 夜级特黄日本大片_在线| 国产亚洲精品综合一区91| 日本大片在线观看| 日韩成人av网| 少妇高潮一区二区三区99小说| 欧美成人性战久久| 国产又粗又猛又爽又黄的视频一| 欧美在线观看视频在线| 69xxxx国产| 在线观看视频一区二区欧美日韩| 国产91国语对白在线| 色综合天天综合网天天狠天天| 99精品视频99| 欧美日韩免费观看中文| 中国一级特黄毛片| 欧美日韩黄色大片| 午夜婷婷在线观看| 欧美性猛交视频| 国产成人在线视频观看| 激情av一区二区| 中文字幕在线看人| 在线观看三级视频欧美| 成人黄色激情视频| 欧美日韩综合在线| 国产又粗又大又黄| 日韩精品一区在线| 天堂中文在线资源| 亚洲精品午夜精品| av在线之家电影网站| 深夜福利91大全| caopon在线免费视频| 欧美成人精品在线播放| av资源在线| 国产va免费精品高清在线观看| 视频在线日韩| 91免费在线视频网站| 久久99国产精品久久99大师| 欧美久久综合性欧美| 成人羞羞视频播放网站| 黑人巨大国产9丨视频| 激情另类综合| 波多野结衣作品集| 国产一区二区在线电影| 成人性生活免费看| 欧美激情中文不卡| 538精品在线观看| 精品人伦一区二区三区蜜桃网站| 337p粉嫩色噜噜噜大肥臀| 911精品产国品一二三产区| www.色呦呦| 亚洲人成免费电影| 黄色在线观看网站| 91国产视频在线| 久久亚洲国产精品尤物| 俄罗斯精品一区二区| 深夜福利久久| 小泽玛利亚av在线| 日韩精品一二三区| 又色又爽又黄18网站| 国产色产综合产在线视频| 69av.com| 欧洲av在线精品| 粉嫩小泬无遮挡久久久久久| 一本色道久久88综合日韩精品 | 欧美国产日韩在线视频| 91在线视频免费观看| 色哟哟一一国产精品| 天天操天天综合网| 国产精品无码免费播放| 国产视频精品自拍| 性欧美videos高清hd4k| 国产精品第二页| 久久人人爽人人爽人人片av不| 亚洲国产日韩综合一区| 国产免费成人| 自拍偷拍激情视频| 国产精品美女一区二区在线观看| 日韩少妇高潮抽搐| 日韩一区二区影院| 91伦理视频在线观看| 91精品国产精品| 一区二区三区在线免费看| 亚洲福利av在线| 亚洲欧美久久久| 亚洲精品激情视频| 日韩美女久久久| 中文字幕一二三四| 亚洲欧美国产另类| 538在线视频| 91视频在线免费观看| 欧美大片aaaa| 国产小视频精品| 久久久精品免费观看| 国产毛片aaa| 亚洲精品国产综合区久久久久久久| a毛片在线播放| 91在线观看免费网站| 欧美hd在线| 亚洲精品久久久中文字幕| 国产午夜精品久久| 福利网址在线观看| 日韩禁在线播放| 末成年女av片一区二区下载| 国产精品免费一区二区三区| 综合在线一区| 久久综合在线观看| 亚洲欧美区自拍先锋| 国产精品无码在线播放| 久久成人亚洲精品| 麻豆一二三区精品蜜桃| 大桥未久一区二区| 国产一区二区电影| 国产成人无码aa精品一区| 91精品国产综合久久精品性色| 超碰人人在线| 成人免费在线看片| 亚洲电影成人| 91黄色免费视频| 狠狠爱在线视频一区| 日韩a在线观看| 国产精品流白浆视频| 日韩欧美视频专区| www激情五月| 亚洲一二三级电影| 天堂在线中文字幕| 国产精品va在线播放| 久久美女视频| 天天操精品视频| 亚洲国产一区二区在线播放| 天天摸夜夜添狠狠添婷婷| 欧洲亚洲免费在线| 999成人精品视频线3| 国产探花在线观看视频| 亚洲国产精品一区二区久久 | 自拍偷拍亚洲欧美| gogo大尺度成人免费视频| 精品免费久久久久久久| 北条麻妃一区二区三区| 亚洲va在线观看| 日韩在线免费视频| jizz久久精品永久免费| 黄色免费观看视频网站| 国产欧美日韩精品在线| 91精品视频免费在线观看| 欧美日韩国产va另类| 偷拍自拍一区| 中日韩av在线播放| 亚洲午夜精品网| 国产女主播在线直播| 成人亚洲欧美一区二区三区| 亚洲电影在线| 99自拍偷拍视频| 欧美精品一区男女天堂| 日韩另类视频| 黄色激情在线视频| 日本一区二区三区在线不卡| 国产伦理一区二区| 欧美亚洲国产视频| 91精品天堂福利在线观看| 一起草在线视频| 欧美精品vⅰdeose4hd| 老色鬼在线视频| 在线免费一区| 久久免费视频色| 性一交一乱一透一a级| 国产精品成久久久久三级| 亚洲午夜91| 999精品视频在线观看播放| 日韩av在线精品| 欧美电影院免费观看|