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

淺析Linux的共享內存與tmpfs文件系統

系統 Linux
POSIX共享內存是基于tmpfs來實現的。實際上,更進一步,不僅PSM(POSIX shared memory),而且SSM(System V shared memory)在內核也是基于tmpfs實現的。

[[199907]]

前言

共享內存主要用于進程間通信,Linux有兩種共享內存(Shared Memory)機制:

(1) ** System V shared memory(shmget/shmat/shmdt) **

Original shared memory mechanism, still widely used Sharing between unrelated processes.

(2) ** POSIX shared memory(shm_open/shm_unlink) **

Sharing between unrelated processes, without overhead of filesystem I/O Intended to be simpler and better than older APIs.

另外,在Linux中不得不提一下內存映射(也可用于進程間通信):

** Shared mappings – mmap(2) **

l Shared anonymous mappings:Sharing between related processes only (related via fork())

l Shared file mappings:Sharing between unrelated processes, backed by file in filesystem

System V共享內存歷史悠久,使用也很廣范,很多類Unix系統都支持。一般來說,我們在寫程序時也通常使用***種。這里不再討論如何使用它們,關于POSIX共享內存的詳細介紹可以參考這里1,這里2。

** 講到那么多,那么問題來了,共享內存與tmpfs有什么關系? **

The POSIX shared memory object implementation on Linux 2.4 makes use of a dedicated filesystem, which is normally mounted under /dev/shm.

從這里可以看到,POSIX共享內存是基于tmpfs來實現的。實際上,更進一步,不僅PSM(POSIX shared memory),而且SSM(System V shared memory)在內核也是基于tmpfs實現的。

tmpfs介紹

下面是內核文檔中關于tmpfs的介紹:

tmpfs has the following uses:

1) There is always a kernel internal mount which you will not see at all. This is used for shared anonymous mappings and SYSV shared memory.

This mount does not depend on CONFIG_TMPFS. If CONFIG_TMPFS is not set, the user visible part of tmpfs is not build. But the internal mechanisms are always present.

2) glibc 2.2 and above expects tmpfs to be mounted at /dev/shm for POSIX shared memory (shm_open, shm_unlink). Adding the following line to /etc/fstab should take care of this:

tmpfs /dev/shm tmpfs defaults 0 0

Remember to create the directory that you intend to mount tmpfs on if necessary.

This mount is not needed for SYSV shared memory. The internal mount is used for that. (In the 2.3 kernel versions it was necessary to mount the predecessor of tmpfs (shm fs) to use SYSV shared memory)

從這里可以看到tmpfs主要有兩個作用:

(1)用于SYSV共享內存,還有匿名內存映射;這部分由內核管理,用戶不可見;

(2)用于POSIX共享內存,由用戶負責mount,而且一般mount到/dev/shm;依賴于CONFIG_TMPFS;

到這里,我們可以了解,SSM與PSM之間的區別,也明白了/dev/shm的作用。

下面我們來做一些測試:

測試

我們將/dev/shm的tmpfs設置為64M:

  1. # mount -size=64M -o remount /dev/shm# df -lh 
  2.  
  3. Filesystem Size Used Avail Use% Mounted on 
  4.  
  5. tmpfs 64M 0 64M 0% /dev/shm 

 

SYSV共享內存的***大小為32M:

  1. # cat /proc/sys/kernel/shmmax 
  2.  
  3. 33554432 

 

(1)創建65M的system V共享內存失?。?/p>

  1. # ipcmk -M 68157440 
  2.  
  3. ipcmk: create share memory failed: Invalid argument 

 

這是正常的。

(2)將shmmax調整為65M

  1. # echo 68157440 > /proc/sys/kernel/shmmax# cat /proc/sys/kernel/shmmax 
  2.  
  3. 68157440# ipcmk -M 68157440 
  4.  
  5. Shared memory id: 0# ipcs -m 
  6.  
  7. ------ Shared Memory Segments -------- 
  8.  
  9. key shmid owner perms bytes nattch status 
  10.  
  11. 0xef46b249 0 root 644 68157440 0 

 

可以看到system v共享內存的大小并不受/dev/shm的影響。

(3)創建POSIX共享內存

點擊(此處)折疊或打開

 

  1.     /*gcc -o shmopen shmopen.c -lrt*/#include <unistd.h> 
  2.  
  3.     #include <fcntl.h> 
  4.  
  5.     #include <sys/stat.h> 
  6.  
  7.     #include <sys/types.h> 
  8.  
  9.     #include <sys/mman.h> 
  10.  
  11.     #include <stdio.h> 
  12.  
  13.     #include <stdlib.h> 
  14.  
  15.     #define MAP_SIZE 68157440 
  16.  
  17.     int main(int argc, char *argv[]) 
  18.  
  19.     { 
  20.  
  21.         int fd; 
  22.  
  23.         void* result; 
  24.  
  25.         fd = shm_open("/shm1", O_RDWR|O_CREAT, 0644); 
  26.  
  27.         if(fd < 0){ 
  28.  
  29.             printf("shm_open failed\n"); 
  30.  
  31.             exit(1); 
  32.  
  33.         } 
  34.  
  35.         return 0; 
  36.  
  37.     } 
  38.  
  39.  
  40. # ./shmopen# ls -lh /dev/shm/shm1 
  41.  
  42. -rw-r--r-- 1 root root 65M Mar  3 06:19 /dev/shm/shm1 

 

僅管/dev/shm只有64M,但創建65M的POSIX SM也可以成功。

(4)向POSIX SM寫數據

點擊(此處)折疊或打開

  1.     /*gcc -o shmwrite shmwrite.c -lrt*/#include <unistd.h> 
  2.  
  3.     #include <fcntl.h> 
  4.  
  5.     #include <sys/stat.h> 
  6.  
  7.     #include <sys/types.h> 
  8.  
  9.     #include <sys/mman.h> 
  10.  
  11.     #include <stdio.h> 
  12.  
  13.     #include <stdlib.h> 
  14.  
  15.     #define MAP_SIZE 68157440 
  16.  
  17.     int main(int argc, char *argv[]) 
  18.  
  19.     { 
  20.  
  21.         int fd; 
  22.  
  23.         void* result; 
  24.  
  25.         fd = shm_open("/shm1", O_RDWR|O_CREAT, 0644); 
  26.  
  27.         if(fd < 0){ 
  28.  
  29.              printf("shm_open failed\n"); 
  30.  
  31.              exit(1); 
  32.  
  33.         } 
  34.  
  35.         if (ftruncate(fd, MAP_SIZE) < 0){ 
  36.  
  37.             printf("ftruncate failed\n"); 
  38.  
  39.             exit(1); 
  40.  
  41.         } 
  42.  
  43.         result = mmap(NULL, MAP_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); 
  44.  
  45.         if(result == MAP_FAILED){ 
  46.  
  47.             printf("mapped failed\n"); 
  48.  
  49.             exit(1); 
  50.  
  51.         } 
  52.  
  53.         /* ... operate result pointer */ 
  54.  
  55.         printf("memset\n"); 
  56.  
  57.         memset(result, 0, MAP_SIZE); 
  58.  
  59.         //shm_unlink("/shm1"); 
  60.  
  61.         return 0; 
  62.  
  63.     } 
  64.  
  65.  
  66. # ./shmwrite 
  67.  
  68. memset 
  69.  
  70. Bus error 

 

可以看到,寫65M的數據會報Bus error錯誤。

但是,卻可以在/dev/shm創建新的文件:

  1. # ls -lh /dev/shm/ -lh 
  2.  
  3. 總用量 64M 
  4.  
  5. -rw-r--r-- 1 root root 65M 3月 3 15:23 shm1 
  6.  
  7. -rw-r--r-- 1 root root 65M 3月 3 15:24 shm2 
  8.  
  9. 這很正常,ls顯示的是inode->size。 
  10.  
  11. # stat /dev/shm/shm2 
  12.  
  13. File: "/dev/shm/shm2" 
  14.  
  15. Size: 68157440 Blocks: 0 IO Block: 4096 普通文件 
  16.  
  17. Device: 10h/16d Inode: 217177 Links: 1 
  18.  
  19. Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) 
  20.  
  21. Access: 2015-03-03 15:24:28.025985167 +0800 
  22.  
  23. Modify: 2015-03-03 15:24:28.025985167 +0800 
  24.  
  25. Change: 2015-03-03 15:24:28.025985167 +0800 

 

(5)向SYS V共享內存寫數據

將System V共享內存的***值調整為65M(/dev/shm仍然為64M)。

  1. # cat /proc/sys/kernel/shmmax 
  2.  
  3. 68157440 

 

點擊(此處)折疊或打開

 

  1. /*gcc -o shmv shmv.c*/#include <sys/ipc.h> 
  2.  
  3. #include <sys/shm.h> 
  4.  
  5. #include <sys/types.h> 
  6.  
  7. #include <unistd.h> 
  8.  
  9. #define MAP_SIZE 68157440 
  10.  
  11. int main(int argc, char** argv){ 
  12.  
  13. int shm_id,i; 
  14.  
  15. key_t key
  16.  
  17. char temp
  18.  
  19. char *p_map; 
  20.  
  21. charname = "/dev/shm/shm3"
  22.  
  23. key = ftok(name,0); 
  24.  
  25. if(key==-1) 
  26.  
  27. perror("ftok error"); 
  28.  
  29. shm_id=shmget(key,MAP_SIZE,IPC_CREAT); 
  30.  
  31. if(shm_id==-1) 
  32.  
  33.  
  34. perror("shmget error"); 
  35.  
  36. return
  37.  
  38.  
  39. p_map=(char*)shmat(shm_id,NULL,0); 
  40.  
  41. memset(p_map, 0, MAP_SIZE); 
  42.  
  43. if(shmdt(p_map)==-1) 
  44.  
  45. perror(" detach error "); 
  46.  
  47.  
  48. #./shmv 

 

卻可以正常執行。

(7)結論

雖然System V與POSIX共享內存都是通過tmpfs實現,但是受的限制卻不相同。也就是說/proc/sys/kernel/shmmax只會影響SYS V共享內存,/dev/shm只會影響Posix共享內存。實際上,System V與Posix共享內存本來就是使用的兩個不同的tmpfs實例(instance)。

內核分析

內核在初始化時,會自動mount一個tmpfs文件系統,掛載為shm_mnt:

點擊(此處)折疊或打開

  1. //mm/shmem.cstatic struct file_system_type  
  2.  
  3. shmem_fs_type = { 
  4.  
  5.     .owner = THIS_MODULE, 
  6.  
  7.    .name = "tmpfs"
  8.  
  9.     .get_sb = shmem_get_sb, 
  10.  
  11.     .kill_sb = kill_litter_super, 
  12.  
  13. }; 
  14.  
  15.  
  16. int __init shmem_init(void) { 
  17.  
  18.     ... 
  19.  
  20.     error = register_filesystem(&shmem_fs_type); 
  21.  
  22.     if (error)  
  23.  
  24.     { 
  25.  
  26.         printk(KERN_ERR "Could not register tmpfs\n"); 
  27.  
  28.         goto out2; 
  29.  
  30.     } 
  31.  
  32.     ///掛載tmpfs(用于SYS V)  
  33.  
  34.     shm_mnt = vfs_kern_mount(&shmem_fs_type, MS_NOUSER,shmem_fs_type.nameNULL); 

 

/dev/shm的mount與普通文件mount的流程類似,不再討論。但是,值得注意的是,/dev/shm默認的大小為當前物理內存的1/2:

  1. shmem_get_sb –> shmem_fill_super 

點擊(此處)折疊或打開

  1. //mem/shmem.c 
  2.  
  3. int shmem_fill_super(struct super_block *sb, void *data, int silent) 
  4.  
  5.  
  6.     ... 
  7.  
  8. #ifdef CONFIG_TMPFS  
  9.  
  10. /* 
  11.  
  12. * Per default we only allow half of the physical ram per 
  13.  
  14. * tmpfs instance, limiting inodes to one per page of lowmem; 
  15.  
  16. * but the internal instance is left unlimited. 
  17.  
  18. */ 
  19.  
  20.     if (!(sb->s_flags & MS_NOUSER)) {///內核會設置MS_NOUSER  
  21.  
  22.         sbinfo->max_blocks = shmem_default_max_blocks(); 
  23.  
  24.         sbinfo->max_inodes = shmem_default_max_inodes(); 
  25.  
  26.         if (shmem_parse_options(data, sbinfo, false)) { 
  27.  
  28.             err = -EINVAL; 
  29.  
  30.             goto failed; 
  31.  
  32.         } 
  33.  
  34.     } 
  35.  
  36.     sb->s_export_op = &shmem_export_ops; 
  37.  
  38. #else 
  39.  
  40. ... 
  41.  
  42.  
  43. #ifdef CONFIG_TMPFS 
  44.  
  45. static unsigned long shmem_default_max_blocks(void) { 
  46.  
  47.     return totalram_pages / 2; 
  48.  

 

可以看到:由于內核在mount tmpfs時,指定了MS_NOUSER,所以該tmpfs沒有大小限制,因此,SYS V共享內存能夠使用的內存空間只受/proc/sys/kernel/shmmax限制;而用戶通過掛載的/dev/shm,默認為物理內存的1/2。

注意CONFIG_TMPFS.

另外,在/dev/shm創建文件走VFS接口,而SYS V與匿名映射卻是通過shmem_file_setup實現:

SIGBUS

當應用訪問共享內存對應的地址空間,如果對應的物理PAGE還沒有分配,就會調用fault方法,分配失敗,就會返回OOM或者BIGBUS錯誤:

點擊(此處)折疊或打開

  1. static const struct vm_operations_struct shmem_vm_ops = { 
  2.  
  3.     .fault = shmem_fault, 
  4.  
  5. #ifdef CONFIG_NUMA  
  6.  
  7.     .set_policy = shmem_set_policy, 
  8.  
  9.     .get_policy = shmem_get_policy, 
  10.  
  11. #endif 
  12.  
  13. }; 
  14.  
  15.  
  16. static int shmem_fault(struct vm_area_struct *vma, struct vm_fault *vmf) 
  17.  
  18.  
  19.     struct inode *inode = vma->vm_file->f_path.dentry->d_inode; 
  20.  
  21.     int error; 
  22.  
  23.     int ret = VM_FAULT_LOCKED; 
  24.  
  25.     error = shmem_getpage(inode, vmf->pgoff, &vmf->page, SGP_CACHE, &ret); 
  26.  
  27.     if (error) 
  28.  
  29.         return ((error == -ENOMEM) ? VM_FAULT_OOM : VM_FAULT_SIGBUS); 
  30.  
  31.     return ret; 
  32.  
  33.  
  34.  
  35. shmem_getpage –> shmem_getpage_gfp: 
  36.  
  37. /* 
  38.  
  39.  * shmem_getpage_gfp - find page in cache, or get from swap, or allocate 
  40.  
  41.  * 
  42.  
  43.  * If we allocate a new one we do not mark it dirty. That's up to the 
  44.  
  45.  * vm. If we swap it in we mark it dirty since we also free the swap 
  46.  
  47.  * entry since a page cannot live in both the swap and page cache 
  48.  
  49.  */ 
  50.  
  51. static int shmem_getpage_gfp(struct inode *inode, pgoff_t index
  52.  
  53. struct page **pagep, enum sgp_type sgp, gfp_t gfp, int *fault_type)  
  54.  
  55.  
  56.     ... 
  57.  
  58.     if (sbinfo->max_blocks) { ///dev/shm會有該值  
  59.  
  60.         if (percpu_counter_compare(&sbinfo->used_blocks,sbinfo->max_blocks) >= 0) { 
  61.  
  62.             error = -ENOSPC; 
  63.  
  64.             goto unacct; 
  65.  
  66.         } 
  67.  
  68.     percpu_counter_inc(&sbinfo->used_blocks); 
  69.  
  70.     } 
  71.  
  72.     //分配一個物理PAGE 
  73.  
  74.     page = shmem_alloc_page(gfp, info, index); 
  75.  
  76.     if (!page) { 
  77.  
  78.         error = -ENOMEM; 
  79.  
  80.         goto decused; 
  81.  
  82.     } 
  83.  
  84.     SetPageSwapBacked(page); 
  85.  
  86.     __set_page_locked(page); 
  87.  
  88.     error = mem_cgroup_cache_charge(page, current->mm,gfp & GFP_RECLAIM_MASK); ///mem_cgroup檢查 
  89.  
  90. if (!error) 
  91.  
  92.     error = shmem_add_to_page_cache(page, mapping, index, gfp, NULL); 

 

共享內存與CGROUP

目前,共享內存的空間計算在***個訪問共享內存的group,參考:

l http://lwn.net/Articles/516541/

l https://www.kernel.org/doc/Documentation/cgroups/memory.txt

POSIX共享內存與Docker

目前Docker將/dev/shm限制為64M,卻沒有提供參數,這種做法比較糟糕。如果應用使用大內存的POSIX共享內存,必然會導致問題。 參考:

l https://github.com/docker/docker/issues/2606

l https://github.com/docker/docker/pull/4981

總結

(1)POSIX共享內存與SYS V共享內存在內核都是通過tmpfs實現,但對應兩個不同的tmpfs實例,相互獨立。

(2)通過/proc/sys/kernel/shmmax可以限制SYS V共享內存(單個)的***值,通過/dev/shm可以限制POSIX共享內存的***值(所有之和)。 

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

2020-10-29 08:34:48

Linux - tmp

2021-01-22 10:40:08

Linux文件內存

2011-01-13 13:18:38

Linux網絡文件

2010-04-22 14:42:34

Aix操作系統

2011-01-13 14:10:30

Linux文件系統

2020-07-22 14:53:06

Linux系統虛擬文件

2017-04-25 15:50:02

sparse傳輸處理

2021-04-12 05:44:44

Linux文件系統

2021-06-06 16:55:22

Linux文件系統

2020-09-25 07:48:12

Linux系統文件

2012-05-10 13:49:44

Linux文件系統

2011-01-11 10:29:35

Linux文件

2014-08-22 15:50:52

WindowsLinux

2018-09-29 11:02:52

WindowsLinux互訪

2010-05-19 15:23:51

Linux 2.6.3Ceph分布式文件系統

2009-12-25 09:58:46

linux劃分文件系統

2009-12-22 15:12:33

Linux擴展文件系統

2009-12-14 13:14:57

2021-11-01 13:38:55

Linux文件系統

2019-09-20 10:04:45

Linux系統虛擬文件
點贊
收藏

51CTO技術棧公眾號

国产精品无码专区| www.成年人视频| 97精品久久人人爽人人爽| 久久久久久久久久久妇女 | 国产一区二区三区播放| 殴美一级特黄aaaaaa| 天堂av在线一区| 麻豆成人在线看| 双性尿奴穿贞c带憋尿| 精品福利在线| 午夜伦理一区二区| 亚洲午夜精品久久久中文影院av| www香蕉视频| 日韩精品一区第一页| 久久久精品网站| 国产精品久久久免费观看| 欧美色网在线| 亚洲va韩国va欧美va| 亚洲福利av| 亚洲AV成人无码一二三区在线| 免费不卡在线视频| 97在线观看免费| 麻豆明星ai换脸视频| 要久久电视剧全集免费| 日韩亚洲欧美一区二区三区| 成人一级片网站| 大黄网站在线观看| 国产精品国产精品国产专区不蜜| 国内外成人免费视频| 国产精品国产av| 日韩高清不卡一区| 午夜精品一区二区三区在线视| 波多野结衣喷潮| 精品国产日韩欧美| 日韩精品中文字幕有码专区| 日日夜夜精品视频免费观看| 免费在线观看一区| 日韩欧美在线视频| 97超碰在线人人| 污污网站在线看| 亚洲婷婷在线视频| 国产亚洲精品美女久久久| 日本一区二区三区国色天香| 国产精品久久久久久超碰| 久久久久久久久久综合| 欧美高清在线| 国产亚洲精品日韩| 久久亚洲AV成人无码国产野外 | 久草成人资源| 亚洲国产成人在线视频| 韩国三级hd中文字幕有哪些| 婷婷精品久久久久久久久久不卡| 在线观看亚洲一区| 久久黄色免费看| 91精品韩国| 日本国产一区二区| 日本熟妇人妻中出| 日本一区免费网站| 欧美视频自拍偷拍| 向日葵污视频在线观看| 99只有精品| 欧美情侣在线播放| 99九九精品视频| 日韩精品成人| 亚洲成avwww人| 日本三级日本三级日本三级极| 4438全国亚洲精品观看视频| 欧美sm极限捆绑bd| 五月天丁香社区| 日韩大胆成人| 国产亚洲欧洲在线| 国产aaaaaaaaa| 午夜影院欧美| 久久久免费电影| 五月天激情国产综合婷婷婷| 日韩电影免费一区| 成人中心免费视频| 亚洲不卡免费视频| 99re热这里只有精品视频| 久久精品成人一区二区三区蜜臀| 四虎成人免费在线| 欧美激情一区在线观看| 中文字幕一区二区三区精彩视频| 影音先锋男人在线资源| 午夜电影网一区| 成年网站在线播放| 亚洲综合色婷婷在线观看| 精品国产污污免费网站入口 | 91中文字幕在线视频| 国产一区二区三区四| 国产成人av一区二区三区| 青青草手机在线| 国产精品精品国产色婷婷| 亚洲五码在线观看视频| 川上优av中文字幕一区二区| 欧美性生交大片免费| 亚洲第一天堂久久| 欧美美女黄色| 中文字幕不卡av| 九九视频免费观看| 久久综合影音| 高清不卡一区二区三区| 国产香蕉视频在线看| 亚洲日本va在线观看| 成熟丰满熟妇高潮xxxxx视频| 澳门av一区二区三区| 日韩欧美国产一区二区三区| 素人fc2av清纯18岁| 91高清一区| 日本视频久久久| xxxx国产精品| 国产精品亲子伦对白| 久久久性生活视频| 在线欧美激情| 亚洲情综合五月天| 国产一级在线观看视频| 久久精品国产精品亚洲红杏| 国产女主播一区二区| 黄网页在线观看| 欧美日韩午夜激情| 三上悠亚 电影| 成人羞羞视频播放网站| 91精品国产一区| 超碰在线观看av| 国产精品久久久久久妇女6080| 妞干网在线观看视频| 成人豆花视频| 这里只有精品在线播放| 精品成人久久久| 国产成人精品影院| 免费观看黄色的网站| 在线日本欧美| 亚洲欧洲激情在线| 国产精品视频久久久久久久| 懂色av一区二区在线播放| 亚洲人成77777| 日韩在线影院| 亚洲欧美日韩天堂| 国语对白永久免费| 成人网页在线观看| 日韩成人午夜影院| 久久爱www.| 久久精品这里热有精品| 精品国产www| 国产日韩精品一区二区三区在线| 1024av视频| 偷拍精品福利视频导航| 97精品久久久| 五月婷婷六月激情| 午夜欧美在线一二页| 性活交片大全免费看| 欧美 日韩 国产精品免费观看| 成人高清视频观看www| 日本亚洲精品| 7777精品伊人久久久大香线蕉 | 一区二区三区国产| 成人啪啪18免费游戏链接| 欧美久久影院| 国产高清在线一区| 美女在线视频免费| 亚洲美女av在线播放| 国产免费一区二区三区四区五区| 久久一区二区视频| 午夜视频你懂的| 国产精品久久久乱弄 | 国产伦一区二区| 亚洲精品乱码久久久久久黑人| 青娱乐国产精品视频| 欧美日韩1区2区3区| 国产欧美日韩在线播放| 欧美gay囗交囗交| 在线观看91久久久久久| 91精品中文字幕| 一区二区三区四区在线免费观看| 午夜福利三级理论电影| 国产精品久久国产愉拍| 日韩av一区二区三区美女毛片| 国产成人亚洲一区二区三区| 精品国产自在精品国产浪潮| www.国产黄色| 欧美视频裸体精品| 人妻无码一区二区三区免费| 国产精品中文有码| 成熟丰满熟妇高潮xxxxx视频| 国产精品美女久久久久久不卡| 国产欧美日韩丝袜精品一区| 伊人在我在线看导航| 日韩精品久久久久久久玫瑰园| 亚洲精品一区二三区| 亚洲欧洲制服丝袜| 免费看黄色aaaaaa 片| 麻豆91在线播放| 国产精品www在线观看| 视频一区欧美| 91中文精品字幕在线视频| 密臀av在线播放| 久久精品国产一区二区电影| 天堂在线视频免费| 欧美精品一二三| 九九热在线视频播放| 中文字幕中文在线不卡住| 亚洲一区二区三区黄色| 奇米四色…亚洲| 黄网站欧美内射| 91亚洲国产| 欧美成人综合一区| 欧州一区二区三区| 国产福利成人在线| 国产在线拍揄自揄拍视频| 国产一区二区三区18| 国产成人三级在线观看视频| 欧美亚洲综合一区| 日韩欧美三级在线观看| 亚洲欧美在线视频| 日韩一级av毛片| 不卡的av在线播放| 欧美日韩一区二区区别是什么| 日韩福利视频导航| 北条麻妃在线观看| 亚洲无毛电影| 91成人在线视频观看| 精品一区不卡| 久久久久久久久久久久久9999| 成人在线视频www| 国产精品久久久久免费a∨大胸| 高潮在线视频| 久久久爽爽爽美女图片| 超碰在线最新| 精品国产欧美一区二区五十路 | 日本成人中文| 国产成人精品自拍| 视频一区在线| 亚洲一区二区三区视频播放| 91在线成人| 国产激情综合五月久久| 性欧美freesex顶级少妇| 久久久久久中文字幕| 18+激情视频在线| 不卡中文字幕av| 免费人成在线观看播放视频| 永久免费看mv网站入口亚洲| 日本aaa在线观看| 日韩毛片在线观看| 青青青草网站免费视频在线观看| 欧美成人艳星乳罩| 亚洲精品成av人片天堂无码| 欧美一区二区免费视频| 国产夫妻性生活视频| 91精品国产综合久久久久久久久久| 中文字幕人妻丝袜乱一区三区| 在线免费观看日本一区| 秋霞av一区二区三区| 色婷婷综合激情| 亚洲高清视频免费观看| 在线看日韩精品电影| 中文文字幕一区二区三三| 色网综合在线观看| 精品国产www| 5月丁香婷婷综合| jlzzjlzz亚洲女人18| 欧美电视剧在线看免费| 亚洲精品无码久久久| 亚洲精品一区二区精华| 少妇激情av一区二区| 亚洲人成绝费网站色www| 国产一区二区影视| 最近2019中文免费高清视频观看www99| 91青青在线视频| 久久综合国产精品台湾中文娱乐网| 成年人网站在线| 91精品国产网站| 激情久久一区二区| 91嫩草免费看| 日韩三区视频| 一道精品一区二区三区| 中文字幕av亚洲精品一部二部| 免费网站在线观看视频| 一本一本久久| 亚洲 国产 图片| 国产凹凸在线观看一区二区| 超碰caoprom| 国产人久久人人人人爽| 国产天堂av在线| 欧美日韩午夜剧场| 亚洲天堂aaa| 亚洲国产精品久久| 在线观看精品一区二区三区| 欧美日韩成人免费| 成人美女黄网站| 亚洲一区二区自拍| 亚洲警察之高压线| 中文字幕日韩精品久久| 99视频一区| 肉色超薄丝袜脚交| 久久男人中文字幕资源站| 国产视频精品免费| 亚洲国产精品嫩草影院| 亚洲一级黄色大片| 日韩精品在线播放| 国产精品一卡二卡三卡| 91精品国产91久久久久久不卡| 久久久久伊人| 久久久综合香蕉尹人综合网| 99re久久最新地址获取| 国产精品333| 狠狠狠色丁香婷婷综合激情| 久久精品综合视频| 亚洲欧美国产高清| www.五月婷婷.com| 日韩国产欧美区| 最新国产在线拍揄自揄视频| 国产91色在线播放| 精品久久97| 青青草影院在线观看| 日韩激情视频在线观看| www.com日本| 亚洲乱码中文字幕综合| 小泽玛利亚一区二区三区视频| 亚洲高清久久久久久| av免费在线观看网址| 国产精品高潮呻吟视频 | 日韩国产伦理| 国产精品嫩草99av在线| 亚洲视频在线不卡| 国产精品免费aⅴ片在线观看| 国产午夜在线播放| 欧美不卡在线视频| www.在线视频| 国产中文日韩欧美| 日韩欧美一区二区三区在线视频 | 久久男人天堂| 国产伦理久久久| 欧美久久影院| 亚洲欧美激情一区二区三区| 国产精品毛片久久久久久| 久久久精品毛片| 亚洲欧美福利视频| 日本在线啊啊| 欧美国产视频在线观看| 99精品视频免费| 尤物网站在线观看| 亚洲国产视频在线| 亚洲精品久久久蜜桃动漫| 久久综合伊人77777尤物| 四虎成人精品一区二区免费网站| 少妇免费毛片久久久久久久久 | 中文字幕第六页| 亚洲欧美日韩一区二区| 国产精品久久久久毛片| 日韩中文字幕免费| 2020国产精品小视频| 亚洲最大色综合成人av| 久国产精品韩国三级视频| 亚洲综合图片一区| 欧美视频一区二区三区在线观看| 国产精品一区二区三区四区色| 国产精品高潮呻吟久久av野狼| 成人羞羞动漫| 红桃视频一区二区三区免费| 亚洲精品写真福利| 丰满人妻av一区二区三区| 久久全国免费视频| 久久99性xxx老妇胖精品| 欧美亚洲日本在线观看| 国产精品美女久久久久久2018| 一区二区美女视频| 超碰97人人做人人爱少妇| 4438全国亚洲精品观看视频| 人妻夜夜添夜夜无码av| 久久久久久久久久久黄色| 中文字幕无码乱码人妻日韩精品| www.日韩av.com| 中文字幕区一区二区三| www.av中文字幕| 国产人妖乱国产精品人妖| 亚洲最大成人av| 欧美激情一区二区久久久| 日韩大尺度在线观看| jizz18女人| 亚洲网友自拍偷拍| 毛片在线播放网址| 国产日韩中文字幕在线| 狠狠综合久久| 免费看的黄色网| 日韩视频免费直播| 亚洲校园激情春色| 99re99热| 91视频www| 国产伦子伦对白视频| 78色国产精品| 97视频精品| 五月开心播播网| 91麻豆精品国产91久久久| 98色花堂精品视频在线观看| 色吧亚洲视频| a在线欧美一区| 911美女片黄在线观看游戏| 97国产在线观看| 亚洲精品在线观看91| 亚洲国产无码精品|