精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国内精品伊人久久久| 涩涩视频在线| 成人丝袜高跟foot| 91国内精品久久| 熟女俱乐部一区二区| 成人午夜毛片| 亚洲自拍偷拍网站| 欧美13一14另类| 国产精品欧美亚洲| 亚洲免费激情| 日韩亚洲精品电影| 粉嫩av懂色av蜜臀av分享| 456亚洲精品成人影院| 国产精品进线69影院| 国产精品亚洲综合| 国产午夜麻豆影院在线观看| 伊人久久大香线蕉精品组织观看| 亚洲女人天堂视频| 操人视频免费看| 综合在线影院| 亚洲电影第三页| 成年人免费观看的视频| 国产又爽又黄网站亚洲视频123| 免费久久99精品国产| 久久久久久91| 午夜成人亚洲理伦片在线观看| 免费萌白酱国产一区二区三区| 欧美日韩亚洲综合在线 | 97超碰成人在线| 国产伦久视频在线观看| 亚洲欧洲一区二区在线播放| 欧洲亚洲一区二区三区四区五区| 亚洲免费视频网| 国产在线不卡一卡二卡三卡四卡| 国产999在线观看| 欧美成人精品欧美一级乱黄| 欧美在线三区| 日韩在线观看你懂的| 免费观看av网站| 国产另类在线| 精品播放一区二区| 黑人巨大猛交丰满少妇| 日韩一级特黄| 欧美日韩精品是欧美日韩精品| 成年人视频网站免费观看| 日本欧美电影在线观看| 亚洲精品乱码久久久久久| 在线观看国产一区| 日本美女在线中文版| 国产日产欧美一区| 日韩成人av网站| 国产在线资源| 国产亚洲综合av| 欧美亚洲爱爱另类综合| 日本福利片在线| 26uuu成人网一区二区三区| 狠狠干一区二区| 午夜在线视频免费| 99re成人精品视频| 好吊色欧美一区二区三区 | www.色综合.com| 国内成+人亚洲| 天天综合网在线| 久久午夜色播影院免费高清 | japan高清日本乱xxxxx| 国产中文欧美日韩在线| 欧美一级理论性理论a| 麻豆精品国产传媒| 久久97久久97精品免视看秋霞| 亚洲精品在线观| 少妇特黄一区二区三区| 无码日韩精品一区二区免费| 亚洲区中文字幕| 永久免费观看片现看| 欧美oldwomenvideos| 欧美成人午夜激情| 日韩精品一区二区在线播放 | 国产suv精品一区二区| 亚洲自拍一区在线观看| 日本aⅴ免费视频一区二区三区 | 成人在线观看黄| 久久电影天堂| 欧美成人激情免费网| 黄色免费看视频| 欧美一区2区| 欧美成人一区在线| 中日韩黄色大片| 免费高清成人在线| 成人资源视频网站免费| 女人天堂在线| 一区二区三区波多野结衣在线观看| 免费av手机在线观看| 国产一区二区三区影视| 日韩免费性生活视频播放| 亚洲永久无码7777kkk| 日韩成人激情| 美女福利精品视频| 亚洲婷婷综合网| 国产一区二区三区香蕉| 鲁片一区二区三区| av中文字幕在线播放| 欧美性xxxx极品hd满灌| 伊人网在线综合| 国产精品传媒| 精品国产拍在线观看| 欧美成人精品欧美一级私黄| 久久在线精品| 国产精品伊人日日| 99reav在线| 婷婷亚洲久悠悠色悠在线播放| 五月天av在线播放| 欧美aaaaa级| 欧美成人午夜视频| 欧美高清69hd| 99久久久久久99| 日本丰满少妇黄大片在线观看| 成人影院大全| 精品国产免费人成在线观看| 人人干在线观看| 日日夜夜免费精品| 精品视频高清无人区区二区三区| 免费黄色电影在线观看| 日韩人体视频一二区| 亚洲精品一区二区18漫画| 成人同人动漫免费观看| 欧美亚洲视频在线看网址| 国产福利免费视频| 成人欧美一区二区三区1314| 中文字幕国内自拍| 免费成人网www| 91成人天堂久久成人| 亚洲第九十九页| 一区二区三区在线观看国产| 日本美女视频一区| 欧美少妇xxxx| 国产精品劲爆视频| 国产天堂在线| 91久久精品日日躁夜夜躁欧美| 亚洲精品视频大全| 99国产精品久久久久久久成人热| 999在线观看免费大全电视剧| 理论片午午伦夜理片在线播放| 日韩欧美在线视频观看| 亚洲国产精品成人综合久久久| 亚洲每日更新| 成人在线免费网站| 久久香蕉av| 亚洲黄色在线看| 久久久国产高清| 26uuu亚洲| 日韩一级在线免费观看| 欧美日韩123| 国产成人一区二区三区电影| 阿v免费在线观看| 欧美色综合久久| 91久久久久久久久久久久久久| 精品一区二区三区免费观看 | 99精品欧美| 精品欧美一区二区久久久伦| 中文字幕成在线观看| 日韩精品欧美国产精品忘忧草| 成人午夜视频在线播放| av中文一区二区三区| 东京热加勒比无码少妇| 国产精品嫩模av在线| 国产精品ⅴa在线观看h| 91精品国产综合久久久久久豆腐| 欧美日韩久久一区| 男人操女人的视频网站| 成人在线一区二区三区| 欧美老熟妇喷水| 久久精品不卡| 91视频网页| 一区二区精品伦理...| 国产亚洲福利一区| 国产女人爽到高潮a毛片| 亚洲一级二级三级| av黄色免费网站| 久久99久久精品| 搞av.com| 日韩av在线播放网址| 96sao精品视频在线观看| 国产ktv在线视频| 日韩在线视频网站| 亚洲免费国产视频| 欧洲精品视频在线观看| 精品国产视频在线观看| 成人黄色大片在线观看 | 国产精品成人aaaa在线| 91毛片在线观看| 日本高清久久久| 一本一本久久| 午夜在线视频免费观看| 老司机精品在线| 成人高清视频观看www| 超级碰碰不卡在线视频| 一本色道久久综合亚洲精品小说| 精品久久久无码中文字幕| 欧美午夜影院在线视频| 三级全黄做爰视频| 91看片淫黄大片一级在线观看| 一本一道久久a久久综合蜜桃| 国产视频一区免费看| 一区二区三区四区不卡| 亚洲区小说区图片区qvod| 91gao视频| 日本美女久久| 性色av一区二区三区| 日本综合在线| 亚洲欧美日韩在线高清直播| www.xxx国产| 欧美色爱综合网| 天天操天天摸天天干| 亚洲人精品午夜| 嘿嘿视频在线观看| 99国产精品国产精品毛片| 中文字幕第22页| 麻豆精品久久久| 国产天堂在线播放| 99精品国产在热久久| 日本天堂免费a| 97视频精品| 先锋影音日韩| 美女久久久久| 久久综合九色99| www.成人网| 亚洲一区精品电影| 香蕉久久一区| 国产综合福利在线| 蜜桃视频成人m3u8| 欧美一区二区三区精品电影| 成人福利影视| 欧美激情视频网| √天堂8在线网| 久久伊人精品视频| 欧美精品日韩少妇| 日韩亚洲第一页| 日本三级在线视频| 日韩中文字幕欧美| 麻豆tv入口在线看| 久久精品国产一区二区电影| 日韩伦理在线电影| 色婷婷av一区二区三区久久| av片在线免费观看| 中文字幕av一区中文字幕天堂 | 久久久久成人网| 9lporm自拍视频区在线| 国模吧一区二区| av在线中出| 欧美一级淫片丝袜脚交| 伊人久久综合一区二区| 日本中文字幕成人| 视频在线日韩| 国产美女久久久| 99精品在线免费观看| 91成人免费观看| 99re8这里有精品热视频8在线| 国产98在线|日韩| 欧美日韩一区二区三区四区不卡| 久久国产精品亚洲va麻豆| 特黄特色欧美大片| 天天爽天天狠久久久| 色135综合网| 久久久天堂国产精品| 在线欧美福利| 免费日韩视频在线观看| 日韩av网站免费在线| 亚洲一级免费在线观看| 国产美女精品在线| 国产麻豆剧传媒精品国产av| 91毛片在线观看| 免费成人美女女在线观看| 一区二区三区中文字幕精品精品| 国产精品16p| 色婷婷亚洲精品| 91在线你懂的| 亚洲精品一区二区三区蜜桃下载| 桃花色综合影院| 最近2019中文字幕大全第二页| 2024最新电影免费在线观看| 5252色成人免费视频| 97精品国产99久久久久久免费| 91在线中文字幕| 婷婷综合福利| 一区二区三区视频在线播放| 亚洲毛片av| 日本肉体xxxx裸体xxx免费| 国产电影一区二区三区| 黄色工厂在线观看| 亚洲六月丁香色婷婷综合久久| 国产69精品久久久久久久久久| 欧美视频完全免费看| 亚洲AV无码乱码国产精品牛牛 | 国产亚洲毛片| 午夜精品中文字幕| 91色九色蝌蚪| 久久精品黄色片| 懂色av中文一区二区三区天美| 最新中文字幕在线观看视频| 精品99久久久久久| av中文在线| 久久久久久久久中文字幕| 素人一区二区三区| 久久久精品有限公司| 性欧美69xoxoxoxo| 国产黄色特级片| 成人avav影音| 玖玖爱这里只有精品| 在线观看免费一区| 蜜桃av噜噜一区二区三区麻豆| 国产一区二区三区在线视频| av资源在线播放| 91在线看www| 成人在线免费小视频| 69sex久久精品国产麻豆| 久久成人精品无人区| 国产jjizz一区二区三区视频| 亚洲va韩国va欧美va| 99精品国产99久久久久久97| 亚洲日韩中文字幕| 理论不卡电影大全神| 97人人干人人| 久久久久国产| 欧美美女一级片| 国产亚洲综合色| 日韩av男人天堂| 精品久久久久久久久久久久包黑料| 免费av在线播放| 国产精品视频免费在线| 天天久久夜夜| 尤物av无码色av无码| 波多野结衣亚洲一区| 欧美国产精品一二三| 欧美一区二区三区白人| 成人免费网址| 亚洲va电影大全| 欧美69wwwcom| 在线观看网站黄| 国产精品久久久久影视| 成人一级免费视频| 亚洲社区在线观看| 成人欧美一区二区三区的电影| 精品久久精品久久| 亚洲深夜影院| 黄色a一级视频| 欧美性猛交xxxxx免费看| 人成免费电影一二三区在线观看| 5566日本婷婷色中文字幕97| 羞羞色国产精品网站| 人妻少妇被粗大爽9797pw| 26uuu久久天堂性欧美| 亚洲 欧美 日韩 在线| 一本一道久久a久久精品逆3p | 精品一区二区日本| 一区二区动漫| 亚洲一区二区三区蜜桃| 在线视频国内自拍亚洲视频| caoporn国产精品免费视频| 国产精品免费看久久久香蕉| 欧美电影一区| 在线免费观看av网| 亚洲综合色视频| 香港三日本三级少妇66| 国产99久久精品一区二区永久免费| 欧美日中文字幕| 中文字幕55页| 精品成人国产在线观看男人呻吟| 日本成人一区二区三区| 国产成人av在线| 午夜片欧美伦| 日本不卡视频一区| 色婷婷综合久久久久中文一区二区 | 国产一级在线观看视频| 亚洲国产精品人人爽夜夜爽| 中文日产幕无线码一区二区| 亚洲欧美久久久久一区二区三区| 国模大尺度一区二区三区| 国产一级视频在线播放| 亚洲精品一区二区网址| 另类一区二区三区| 国产成人一区二区三区别| 久久午夜羞羞影院免费观看| 一本到在线视频| 国内久久久精品| 日韩精品首页| 久久久久久婷婷| 欧美体内she精视频| 午夜在线激情影院| 欧美亚洲丝袜| 国产精品一区在线观看乱码 | 亚洲夜夜综合| 欧美日韩一区二区三区免费| 国产伦精品一区二区三区视频青涩| 日韩三级一区二区三区| 中文字幕亚洲二区| 猫咪成人在线观看| 亚洲黄色片免费| 在线免费视频一区二区| 国产蜜臀一区二区打屁股调教| 手机成人在线|