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

Linux內核中的proc文件系統

系統 Linux
procfs文件系統是內核中的一個特殊文件系統。它是一個虛擬文件系統: 它不是實際的存儲設備中的文件,而是存在于內存中。procfs中的文件是用來允許用戶空間的程序訪問內核中的某些信息(比如進程信息在 /proc/[0-9]+/中),或者用來做調試用途(/proc/ksyms,這個文件列出了已經登記的內核符號,這些符號給出了變量或函數的地址。每行給出一個符號的地址,符號名稱以及登記這個符號的模塊。

Linux內核中的proc文件系統

簡介

procfs文件系統是內核中的一個特殊文件系統。它是一個虛擬文件系統: 它不是實際的存儲設備中的文件,而是存在于內存中。procfs中的文件是用來允許用戶空間的程序訪問內核中的某些信息(比如進程信息在 /proc/[0-9]+/中),或者用來做調試用途(/proc/ksyms,這個文件列出了已經登記的內核符號,這些符號給出了變量或函數的地址。每行給出一個符號的地址,符號名稱以及登記這個符號的模塊。程序ksyms、insmod和kmod使用這個文件。它還列出了正在運行的任務數,總任務數和***分配的PID。)

這個文檔描述了內核中procfs文件系統的使用。它以介紹所有和管理文件系統相關的函數開始。在函數介紹后,它還展示了怎么和用戶空間通信,和一些小技巧。在文檔的***,還給出了一個完整的例子。

注意/proc/sys中的文件屬于sysctl文件,它們不屬于procfs文件系統,被另外一套完全不同的api管理。

seq_file

procfs在處理大文件時有點笨拙。為了清理procfs文件系統并且使內核編程簡單些,引入了seq_file機制。seq_file機制提供了大量簡單的接口去實現大內核虛擬文件。

seq_file機制適用于你利用結構序列去創建一個返回給用戶空間的虛擬文件。要使用seq_file機制,你必須創建一個”iterator”對象,這個對象指向這個序列,并且能逐個指向這個序列中的對象,此外還要能輸出這個序列中的任一個對象。它聽起來復雜,實際上,操作過程相當簡單。接下來將用實際的例子展示到底怎么做。

首先,你必須包含頭文件<Linux/seq_file.h>。接下來,你必須創建迭代器方法:start, next, stop, and show。

start方法通常被首先調用。這個方法的函數原型是:

  1. void *start(struct seq_file *sfile, loff_t *pos); 

sfile沒什么作用,通常被忽略。pos參數是一個整型,表示從哪個位置開始讀。關于位置的定義完全取決于函數實現;它不一定要是結果文件中的一個字節位置。 由于seq_file機制通常是利用一個特定的結構序列實現的,所以位置通常是一個指向序列中下一個結構體的指針。在wing驅動中,每一個設備表示序列中的一個結構,所以,入參pos代表g_pstWingDevices數組的索引。因此,在wing驅動中start方法的實現為:

  1. static void *wing_seq_start(struct seq_file *s, loff_t *pos) 
  2.     if (*pos >= g_iWingDevicesNum) 
  3.         return NULL; /* No more to read */ 
  4.     return g_pstWingDevices + *pos; 

 

返回值如果不為NULL,代表一個可以被迭代器使用的私有數據。

next函數應該移動迭代器到下一個位置,如果序列中沒有數據,返回NULL。這個方法的函數原型為:

  1. void *next(struct seq_file *sfile, void *v, loff_t *pos); 

這里,參數v代表上一個函數調用(可能是start函數,或者是next函數)返回的迭代器,, 參數pos是文件中的當前位置。next函數應該改變pos的指向,具體是逐步改變還是跳躍改變取決于迭代器的工作機制。next函數在wing驅動中的實現為:

  1. static void* wing_seq_next(struct seq_file *s, void *v, loff_t *pos) 
  2.     (*pos)++; 
  3.     if (*pos >= g_iWingDevicesNum) 
  4.         return NULL
  5.     return g_pstWingDevices + *pos; 

 

當內核停止了迭代器的工作,它調用stop函數清理現場:

  1. void stop(struct seq_file *sfile, void *v); 

wing驅動沒有清理工作要做,所以stop函數為空。

  1. void wing_seq_stop(struct seq_file *sfile, void *v) 

 

要是seq_file代碼在調用start和stop時不執行睡眠或是非原子的操作,那么這種機制將毫無意義。你要保證從start函數調用到stop函數調用是很短暫的。因此,在開始函數中獲得一個信號量或者自旋鎖是比較安全的做法。要是seq_file其他方法是原子的,整個調用鏈必須是原子的。

在這些函數調用中,內核調用call函數向內核空間輸出特性的信息。這個函數的函數原型是:

  1. int show(struct seq_file *sfile, void *v); 

這個方法應該創建序列中由指示器v指定項的輸出。不能使用printk,而是使用以下這些特定函數:

  1. int seq_printf(struct seq_file *sfile, const char *fmt, ...) 

這個函數是seq_file機制中類似于printf的實現;它使用通常的格式字符串和參數組成輸出字符串。你必須把show函數中的seq_file結構體傳給這個函數。如果它返回一個非零的值,表示buffer已經填充好,輸出被丟出去了。在大多數實現中,都選擇忽略返回值。

  1. int seq_putc(struct seq_file *sfile, char c); 
  2.  
  3. int seq_puts(struct seq_file *sfile, const char *s); 

 

這兩個函數相當于用戶層的putc和puts。

  1. int seq_escape(struct seq_file *m, const char *s, const char *esc); 

這個函數是 seq_puts 的對等體, 除了 s 中的任何也在 esc 中出現的字符以八進制格式打印. esc 的一個通用值是”\t\n\”, 它使內嵌的空格不會搞亂輸出和可能搞亂 shell 腳本.

  1. int seq_path(struct seq_file *sfile, struct vfsmount *m, struct dentry *dentry, char *esc); 

這個函數能夠用來輸出和給定命令項關聯的文件名子. 它在設備驅動中不可能有用;我們是為了完整在此包含它.

wing設備中的show函數例子:

  1. static int wing_seq_show(struct seq_file *s, void *v) 
  2.  
  3.  
  4.     ST_Wing_Dev_Type* pDev = (ST_Wing_Dev_Type* ) v; 
  5.  
  6.     seq_printf(s, "\nThis Device is %i\n", pDev->iData); 
  7.  
  8.     return 0; 
  9.  

 

在我的例子中,我將一個ST_Wing_Dev_Type結構體表示為迭代器。

上面就是完整的迭代器操作,wing驅動必須將它們打包到一起好連接到procfs文件系統。首先要做的就是利用它們組成一個seq_operations結構體:

  1. static struct seq_operations s_stWingSeqOps = { 
  2.  
  3.     .start = wing_seq_start, 
  4.  
  5.     .next = wing_seq_next, 
  6.  
  7.     .stop = wing_seq_stop, 
  8.  
  9.     .show = wing_seq_show 
  10.  
  11. }; 

 

有了這個結構,我們必須創建一個內核能理解的文件實現。我們不使用前面說過的read_proc方法;在使用seq_file時, ***在一個稍低的級別上連接到procfs。這意味著創建一個file_operations(和字符設備一樣的結構),這個結構實現了內核對文件的reads和seeks操作。幸運的是,這個操做很簡單。首先創建一個把文件和seq_file方法聯接起來的open方法:

  1. static int wing_proc_open(struct inode *inode, struct file *file) 
  2.     return seq_open(file, &s_stWingSeqOps); 

 

調用seq_open函數的時候將文件和上面定義的序列操作關聯到一起。open是唯一要我們實現的函數接口,所以我們的file_operations結構體是:

  1. static struct file_operations s_stWingProcFops = { 
  2.     .owner = THIS_MODULE, 
  3.     .open = wing_proc_open, 
  4.     .read = seq_read, 
  5.     .llseek = seq_lseek, 
  6.     .release = seq_release 
  7. }; 

 

***我們要在procfs文件系統中創建文件:

  1. proc_create("wingdevices", 0644, NULL, &s_stWingProcFops); 

關鍵結構體

struct proc_dir_entry代表的是/proc目錄下的一個目錄或者文件,他是procfs文件系統的主要結構體,它的定義在/fs/internal.h中:

  1. /* 
  2.  * This is not completely implemented yet. The idea is to 
  3.  * create an in-memory tree (like the actual /proc filesystem 
  4.  * tree) of these proc_dir_entries, so that we can dynamically 
  5.  * add new files to /proc. 
  6.  * 
  7.  * The "next" pointer creates a linked list of one /proc directory, 
  8.  * while parent/subdir create the directory structure (every 
  9.  * /proc file has a parent, but "subdir" is NULL for all 
  10.  * non-directory entries). 
  11.  */ 
  12. struct proc_dir_entry { 
  13.     unsigned int low_ino; 
  14.     umode_t mode; 
  15.     nlink_t nlink; 
  16.     kuid_t uid; 
  17.     kgid_t gid; 
  18.     loff_t size
  19.     const struct inode_operations *proc_iops; 
  20.     const struct file_operations *proc_fops; 
  21.     struct proc_dir_entry *next, *parent, *subdir; 
  22.     void *data; 
  23.     atomic_t count;     /* use count */ 
  24.     atomic_t in_use;    /* number of callers into module in progress; */ 
  25.             /* negative -> it's going away RSN */ 
  26.     struct completion *pde_unload_completion; 
  27.     struct list_head pde_openers;   /* who did ->open, but not ->release */ 
  28.     spinlock_t pde_unload_lock; /* proc_fops checks and pde_users bumps */ 
  29.     u8 namelen; 
  30.     char name[]; 
  31. }; 

 

主要接口

procfs應該包含的頭文件<linux/proc_fs.h>。

在3.x內核中procfs主要接口有:

  • proc_symlink
  • proc_mkdir
  • proc_mkdir_data
  • proc_mkdir_mode
  • proc_create_data
  • proc_create
  • proc_set_size
  • proc_set_user
  • PDE_DATA
  • proc_get_parent_data
  • proc_remove
  • remove_proc_entry
  • remove_proc_subtree

proc_mkdir

說明:在/proc下創建目錄

函數原型:

  1. struct proc_dir_entry *proc_mkdir(const char *name, struct proc_dir_entry *parent) 

參數:

  • name

要創建的目錄名稱

  • parent

父目錄,如果為NULL,表示直接在/proc下面創建目錄。

proc_mkdir_data

說明:在/proc下創建目錄

函數原型:

  1. struct proc_dir_entry *proc_mkdir_data(const char *name, umode_t mode, struct proc_dir_entry *parent, void *data) 

參數:

  • name

要創建的目錄名稱

  • mode

指定要創建目錄的權限

  • parent

父目錄,如果為NULL,表示直接在/proc下面創建目錄。

  • data

proc_create_data

說明:創建proc虛擬文件系統文件

函數原型:

 

  1. struct proc_dir_entry *proc_create_data(const char *name, umode_t mode, struct proc_dir_entry *parent, const struct file_operations *proc_fops, void *data) 

 

參數:

  • name

你要創建的文件名。

  • mode

為創建的文件指定權限

  • parent

為你要在哪個文件夾下建立名字為name的文件,如:init_net.proc_net是要在/proc/net/下建立文件。

  • proc_fops

為struct file_operations

  • data

保存私有數據的指針,如不要為NULL。

例子:

  1. ////////////////////////test.c//////////////////////////////////////// 
  2. #include <linux/init.h>   
  3. #include <linux/module.h>   
  4. #include <linux/types.h>   
  5. #include <linux/slab.h>   
  6. #include <linux/fs.h>   
  7. #include <linux/proc_fs.h>   
  8. #include <linux/seq_file.h>   
  9. #include <net/net_namespace.h>   
  10. #include <linux/mm.h>   
  11.  
  12. MODULE_LICENSE("GPL");   
  13.  
  14. typedef struct {       
  15.     int data1;       
  16.     int data2;   
  17. }ST_Data_Info_Type;   
  18.  
  19.  
  20. static ST_Data_Info_Type g_astDataInfo[2];   
  21.  
  22.  
  23.  
  24. static int test_proc_show(struct seq_file *m, void *v) 
  25.     ST_Data_Info_Type* pInfo = (ST_Data_Info_Type*)m->private; 
  26.     if(pInfo != NULL
  27.     { 
  28.         seq_printf(m, "%d----%d\n", pInfo->data1, pInfo->data2); 
  29.     } 
  30.     return 0; 
  31.  
  32.  
  33. static int test_proc_open(struct inode *inode, struct file *file)  
  34. {   
  35.     return single_open(file, test_proc_show, PDE_DATA(inode)); 
  36. }   
  37.  
  38.  
  39. static const struct file_operations dl_file_ops = {       
  40.     .owner = THIS_MODULE,       
  41.     .open    = test_proc_open, 
  42.     .read    = seq_read, 
  43.     .llseek  = seq_lseek, 
  44.     .release = single_release, 
  45. };   
  46.  
  47. static struct proc_dir_entry *s_pstRootTestDir; 
  48.  
  49.  
  50. void init_mem(void)   
  51. {      
  52.     /* create /proc/test */ 
  53.     s_pstRootTestDir = proc_mkdir("test"NULL); 
  54.     if (!s_pstRootTestDir) 
  55.         return
  56.  
  57.     g_astDataInfo[0].data1=1;       
  58.     g_astDataInfo[0].data2=2;   
  59.     proc_create_data("proc_test1", 0644, s_pstRootTestDir, &dl_file_ops, &g_astDataInfo[0]); 
  60.  
  61.     g_astDataInfo[1].data1=3;      
  62.     g_astDataInfo[1].data2=4;   
  63.     proc_create_data("proc_test2", 0644, s_pstRootTestDir, &dl_file_ops, &g_astDataInfo[1]);   
  64. }  
  65.  
  66. static int __init test_module_init(void)   
  67. {   
  68.     printk("[test]: module init\n"); 
  69.     init_mem();       
  70.     return 0;   
  71. }   
  72.  
  73. static void __exit test_module_exit(void)   
  74. {   
  75.     printk("[test]: module exit\n"); 
  76.     remove_proc_entry("proc_test1", s_pstRootTestDir);      
  77.     remove_proc_entry("proc_test2", s_pstRootTestDir); 
  78.     remove_proc_entry("test"NULL); 
  79. }   
  80. module_init(test_module_init);   
  81. module_exit(test_module_exit); 

 

proc_create

說明:創建proc虛擬文件系統文件

函數原型:

  1. struct proc_dir_entry *proc_create(const char *name, umode_t mode, struct proc_dir_entry *parent, const struct file_operations *proc_fops) 

參數:

  • name

你要創建的文件名。

  • mode

為創建的文件指定權限

  • parent

為你要在哪個文件夾下建立名字為name的文件,如:init_net.proc_net是要在/proc/net/下建立文件。

  • proc_fops

為struct file_operations

注意:這個接口和proc_create_data的區別在于他不能保存私有數據指針。

PDE_DATA

獲取proc_create_data傳入的私有數據。

proc_symlink

說明:這個函數在procfs目錄下創建一個從name指向dest的符號鏈接. 它在用戶空間等效為ln -s dest name。

函數原型:

  1. struct proc_dir_entry *proc_symlink(const char *name, struct proc_dir_entry *parent, const char *dest) 

參數:

  • name

原始符號。

  • parent

符號所在的目錄。

  • dest

所要創建的符號鏈接名字。

remove_proc_entry

說明:刪除procfs文件系統中的文件或者目錄。

函數原型:

  1. void remove_proc_entry(const char *name, struct proc_dir_entry *parent) 

參數:

  • name

要刪除的文件或者目錄名。

  • parent

符號所在的目錄,如果為NULL,表示在/proc目錄下。 

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

2009-12-22 11:30:38

Linux操作系統

2010-03-11 17:25:17

Linux系統使用率proc文件系統

2009-12-18 15:54:44

Fedora proc

2009-12-18 16:18:15

Fedora proc

2014-05-19 09:51:35

Tux3文件系統Linux 內核

2010-05-19 15:23:51

Linux 2.6.3Ceph分布式文件系統

2011-01-13 14:10:30

Linux文件系統

2019-05-22 09:00:16

Linux虛擬文件系統

2019-05-29 16:33:32

Linux虛擬系統

2022-12-07 15:56:33

procfsLiteOS-A

2020-07-22 14:53:06

Linux系統虛擬文件

2009-07-02 18:16:05

Linux

2009-07-07 09:19:58

Linux

2024-01-10 21:19:09

Linux 內核文件系統

2012-07-05 09:52:06

EFS文件加密

2021-04-12 05:44:44

Linux文件系統

2021-06-06 16:55:22

Linux文件系統

2025-03-28 09:19:11

2020-09-25 07:48:12

Linux系統文件

2012-05-10 13:49:44

Linux文件系統
點贊
收藏

51CTO技術棧公眾號

国产资源中文字幕| 亚洲a∨一区二区三区| 国产一级特黄a高潮片| 国产精品45p| 在线免费视频一区二区| 无码人妻精品一区二区三区99v| www.狠狠干| 久久美女性网| 欧美日韩成人在线观看| 91网站免费视频| 日本精品一区二区三区在线观看视频| 午夜精品久久久久| 亚洲一一在线| 天堂在线中文网| 激情文学综合丁香| 亲子乱一区二区三区电影 | 囯产精品久久久久久| 午夜一级久久| 欧美成人精品不卡视频在线观看| 亚洲天堂网一区二区| 欧美极品在线| 黑丝美女久久久| 中文字幕久久综合| 午夜性色福利视频| 国产a区久久久| 国产精品v日韩精品| 国产一级视频在线| 亚洲午夜精品一区 二区 三区| 亚洲精品白浆高清久久久久久| 小早川怜子一区二区三区| 电影一区二区三| 午夜电影网一区| 国产日韩视频在线播放| 国产视频第一页在线观看| 懂色av一区二区夜夜嗨| 亚洲伊人一本大道中文字幕| 免费视频网站在线观看入口| 中文亚洲免费| 欧美激情亚洲国产| 人人澡人人澡人人看| 国产在视频线精品视频www666| 精品粉嫩超白一线天av| 性生活在线视频| 四虎国产精品成人免费影视| 在线国产电影不卡| 国产亚洲天堂网| 成年女人在线看片| 亚洲午夜久久久久久久久电影院| 综合视频免费看| 在线观看免费版| 久久精品人人做人人综合| 精品无人乱码一区二区三区的优势| www.黄色片| 精品一区二区三区在线视频| 国产在线观看精品| 一级黄色免费看| 美女脱光内衣内裤视频久久网站| 国产精品精品一区二区三区午夜版| 国产又大又黄又粗| 老鸭窝毛片一区二区三区| 91精品国产高清自在线看超| 91九色丨porny丨肉丝| 影音先锋久久| 欧美亚洲国产视频| 国产一区二区视频网站| 日韩激情av在线| 国产精品一二三在线| 这里只有精品国产| 久久er精品视频| 成人综合网网址| 亚洲成人777777| 不卡视频在线观看| 久久国产精品一区二区三区四区| 亚洲 美腿 欧美 偷拍| 91视频你懂的| 先锋在线资源一区二区三区| 黄视频在线观看网站| 亚洲精品成人天堂一二三| 91视频 - 88av| 欧美调教sm| 色94色欧美sute亚洲线路一久| 亚洲欧洲日本精品| 警花av一区二区三区| 精品动漫一区二区三区在线观看| 99久久人妻无码精品系列| 日本欧美国产| 欧美大学生性色视频| 日韩精品在线观看免费| 日本不卡视频在线观看| 亚洲自拍在线观看| 深夜福利视频一区| 国产精品美女久久久久aⅴ国产馆| 在线观看18视频网站| 538在线观看| 欧美视频一区二区三区| www.欧美com| 国产va免费精品观看精品视频| 日韩在线高清视频| 97久久久久久久| 精品制服美女丁香| 精品久久久久久一区二区里番| 国产毛片av在线| 亚洲综合免费观看高清完整版| 日本黄色三级大片| 视频精品国内| 最新的欧美黄色| 免费在线视频观看| 日本美女视频一区二区| 官网99热精品| 免费在线毛片网站| 日韩欧美国产骚| 18禁一区二区三区| 日韩一区亚洲二区| 欧美一区二三区| www.欧美国产| 国产精品久久久久久久午夜片| 欧美 日韩 国产 高清| 色综合视频一区二区三区日韩| 亚洲免费中文字幕| 四虎永久在线精品| 国产一区美女在线| 亚洲成人自拍视频| 性感女国产在线| 精品国产伦一区二区三区免费 | 免费看黄色一级视频| 国产精品美女久久久久久2018| 亚洲午夜精品久久久久久人妖| www.欧美视频| 伊人伊成久久人综合网小说| 日韩免费不卡视频| 国产成人免费视频网站 | 18av在线视频| 欧美日韩一级黄| 日韩乱码人妻无码中文字幕久久 | 免费在线观看日韩视频| 一区二区网站| 深夜福利91大全| 中文在线字幕av| 久久伊人蜜桃av一区二区| 日韩国产成人无码av毛片| 国产麻豆一区二区三区| 色噜噜国产精品视频一区二区| 少妇太紧太爽又黄又硬又爽| 成人精品电影在线观看| 99在线免费视频观看| av综合网站| 欧美激情精品久久久久久黑人| 国产三级精品在线观看| 日韩一区在线免费观看| 日韩高清第一页| 久久久久久美女精品| 国产中文字幕亚洲| 黄色网址在线免费| 欧美一区二区三区在线观看视频| 麻豆网址在线观看| 韩国一区二区视频| 日韩不卡一二区| 日本成人手机在线| 久久久久久美女| 天天综合天天综合| 一本大道久久a久久精二百| 亚洲一区二区在线免费| 国产欧美精品久久| 欧洲精品码一区二区三区免费看| 欧美成人精品三级网站| 在线播放日韩欧美| 国产精品久久无码一三区| 一区二区三区在线不卡| 在线观看成人动漫| 久久精品主播| 亚洲午夜高清视频| 日韩欧美高清一区二区三区| 国色天香2019中文字幕在线观看| 少妇无码一区二区三区| 日本高清免费不卡视频| 成人性视频免费看| 国产精品一区二区你懂的| 欧美深夜福利视频| 精品理论电影| 亚洲精品欧美日韩专区| 2019中文字幕在线电影免费| 亚洲乱码av中文一区二区| 久草热在线观看| 亚洲男人的天堂av| free性中国hd国语露脸| 毛片av一区二区| 成人精品视频在线播放| 国产综合久久久| 3d动漫啪啪精品一区二区免费| 精精国产xxx在线视频app| 一区二区三区回区在观看免费视频| 97超碰人人模人人人爽人人爱| 亚洲一区二区三区四区五区中文| 免费a级黄色片| 激情欧美一区二区三区在线观看| 黄页网站在线观看视频| 狠狠操综合网| 国产传媒一区二区| 精品176极品一区| 97精品国产97久久久久久免费| 国产福利在线视频| 亚洲成色777777女色窝| 91禁在线观看| 色综合久久久久综合体| 欧美卡一卡二卡三| 国产欧美中文在线| 亚洲自拍偷拍精品| 精品一区二区三区在线视频| 男人操女人免费软件| 中文字幕一区二区三区欧美日韩| 欧美亚洲免费高清在线观看 | 日韩免费三级| 精品三级在线观看视频| 91热精品视频| jizz亚洲女人高潮大叫| 8x海外华人永久免费日韩内陆视频| 免费在线看a| 亚洲一区第一页| 人妻精品一区一区三区蜜桃91| 欧美色综合网站| 国产成人精品a视频一区| 亚洲少妇最新在线视频| www成人啪啪18软件| 久久在线观看免费| 亚洲最大的黄色网| 国产成人在线视频免费播放| 潘金莲激情呻吟欲求不满视频| 久久亚洲美女| 欧美黄网站在线观看| 在线亚洲自拍| avav在线播放| 欧美国产91| 超碰97免费观看| 久久久久久久久丰满| 亚洲一区二区三区色| 精品福利久久久| 欧美日韩在线精品| 国产毛片精品| 狠狠色综合网站久久久久久久| 日韩三级av高清片| wwwxx欧美| 亚洲国产一区二区三区网站| 亚洲a一级视频| 国产一区二区三区精品在线观看| 国产精品自拍网| 亚州欧美在线| 91视频免费在线| 蜜桃精品一区二区三区| 97超碰人人看人人| 午夜视频一区二区在线观看| 99热在线国产| 成人av激情人伦小说| 国产一级精品aaaaa看| 极品束缚调教一区二区网站| 国产精品视频入口| 欧美成人一区在线观看| 精品欧美一区二区三区久久久 | 亚洲乱码国产乱码精品| 色哟哟国产精品免费观看| 在线观看黄网站| 在线亚洲+欧美+日本专区| 中文字幕精品一区二| 欧美日韩一区视频| 国产黄色片免费观看| 亚洲国产精品久久精品怡红院| 人妻夜夜爽天天爽| 日韩精品中文字幕在线播放| 欧美另类自拍| 日韩在线精品视频| 伊人222成人综合网| 97色在线观看| 中文字幕系列一区| 91系列在线播放| 极品束缚调教一区二区网站 | 一道本成人在线| 亚洲一区在线观| 欧美精品一区二区久久久| 久热av在线| 九九精品在线视频| 午夜欧美激情| 国产人妖伪娘一区91| 亚洲日本va午夜在线电影| 久久偷窥视频| 999久久久免费精品国产| www.国产亚洲| 久久综合导航| 欧美性猛交xx| 久久久久久久网| 国产人妻精品一区二区三区不卡 | 中文字幕在线观看1| 日韩欧美中文字幕精品| 深夜福利在线视频| 久久久999国产精品| 欧美在线极品| 91在线视频九色| 免费观看久久av| 中文字幕の友人北条麻妃| 日韩专区中文字幕一区二区| 亚洲精品乱码久久久久久9色| 国产欧美一区二区在线观看| 九九九在线视频| 欧美日韩电影在线播放| 欧美天堂在线视频| 日韩中文字幕视频| 亚洲妇女成熟| 福利视频一区二区三区| 日韩亚洲一区在线| 人妻av中文系列| 国产麻豆精品95视频| 久久婷婷五月综合| 婷婷久久综合九色综合绿巨人| 91麻豆国产在线| 亚洲人成亚洲人成在线观看| 精灵使的剑舞无删减版在线观看| 国产精品一二三视频| 免费看成人吃奶视频在线| 日韩免费在线观看av| 极品少妇xxxx精品少妇| 欧美老熟妇乱大交xxxxx| 亚洲国产精品久久人人爱| 国产免费不卡av| www.日韩欧美| 成人黄色免费网站| 欧美在线播放一区| 亚洲一区二区三区高清不卡| 亚洲精品成人无码毛片| 中文字幕亚洲综合久久菠萝蜜| 亚洲图片欧美日韩| 亚洲色图校园春色| 老司机2019福利精品视频导航| 国产一区二区三区奇米久涩| 亚洲综合五月| 最新av免费在线观看| 国产精品素人视频| 最新黄色网址在线观看| 亚洲日韩欧美视频一区| 女生影院久久| 欧美高清视频一区二区三区在线观看| 亚洲茄子视频| 中文字幕在线永久| 五月婷婷激情综合| 国产91免费在线观看| 欧美激情中文网| 精品视频高潮| www一区二区www免费| 91色九色蝌蚪| 日韩精品在线免费视频| 亚洲欧美日本精品| 欧美男女交配| 色一情一乱一伦一区二区三区 | www.亚洲视频| 国产精品视频不卡| 天天综合一区| 亚洲av无码久久精品色欲| 一区二区三区在线高清| 亚洲精品97久久中文字幕| 午夜精品视频网站| 台湾佬综合网| 亚洲精品视频导航| 国产精品全国免费观看高清 | 国产精品亚洲四区在线观看| 糖心vlog在线免费观看| 成人aa视频在线观看| 啦啦啦免费高清视频在线观看| 国产亚洲福利一区| 亚洲精品无播放器在线播放| 欧美做暖暖视频| 91视频一区二区三区| 怡红院成永久免费人全部视频| 久久精品国产精品亚洲| 中文字幕av一区二区三区四区| 精品国产一区三区| 亚洲国产精品ⅴa在线观看| 国产手机av在线| 91国在线精品国内播放| av伊人久久| 天天干天天曰天天操| 亚洲成年人影院| 搞黄视频在线观看| 91丝袜脚交足在线播放| 国产精品久久国产愉拍| 黄大色黄女片18免费| 日韩视频一区二区三区| 亚洲黄色网址| 亚洲精品无人区| 成人性生交大片免费看中文| 男人天堂视频在线| 欧美黑人巨大xxx极品| 欧美精美视频| 成年人看片网站| 欧美在线观看视频一区二区 | 亚洲色图插插| 国产精品jizz| 日韩精品一区二区三区四区| 中文字幕成在线观看| 国产手机视频在线观看| 久久久无码精品亚洲日韩按摩| 国产jzjzjz丝袜老师水多| 国产成人一区二| 伊人久久大香线蕉综合热线|