青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

isware

Linux的mmap文件內(nèi)存映射機(jī)制

  在講述文件映射的概念時(shí), 不可避免的要牽涉到虛存(SVR 4的VM). 實(shí)際上, 文件映射是虛存的中心概念, 文件映射一方面給用戶(hù)提供了一組措施, 好似用戶(hù)將文件映射到自己地址空間的某個(gè)部分, 使用簡(jiǎn)單的內(nèi)存訪問(wèn)指令讀寫(xiě)文件;另一方面, 它也可以用于內(nèi)核的基本組織模式, 在這種模式種, 內(nèi)核將整個(gè)地址空間視為諸如文件之類(lèi)的一組不同對(duì)象的映射. 中的傳統(tǒng)文件訪問(wèn)方式是, 用 open系統(tǒng)調(diào)用打開(kāi)文件, 然后使用read, write以及l(fā)seek等調(diào)用進(jìn)行順序或者隨即的I/O. 這種方式是非常低效的, 每一次I/O操作都需要一次系統(tǒng)調(diào)用. 另外, 如果若干個(gè)進(jìn)程訪問(wèn)同一個(gè)文件, 每個(gè)進(jìn)程都要在自己的地址空間維護(hù)一個(gè)副本, 浪費(fèi)了內(nèi)存空間. 而如果能夠通過(guò)一定的機(jī)制將頁(yè)面映射到進(jìn)程的地址空間中, 也就是說(shuō)通過(guò)簡(jiǎn)單的產(chǎn)生某些內(nèi)存管理數(shù)據(jù)結(jié)構(gòu)完成映射的創(chuàng)建. 當(dāng)進(jìn)程訪問(wèn)頁(yè)面時(shí)產(chǎn)生一個(gè)缺頁(yè)中斷, 內(nèi)核將頁(yè)面讀入內(nèi)存并且更新頁(yè)表指向該頁(yè)面. 這種方式非常方便于同一副本的共享.

  VM是面向?qū)ο蟮姆椒ㄔO(shè)計(jì)的, 這里的對(duì)象是指內(nèi)存對(duì)象: 內(nèi)存對(duì)象是一個(gè)軟件抽象的概念, 它描述內(nèi)存區(qū)與后備存儲(chǔ)之間的映射. 系統(tǒng)可以使用多種類(lèi)型的后備存儲(chǔ), 比如交換空間, 本地或者遠(yuǎn)程文件以及幀緩存等等. VM系統(tǒng)對(duì)它們統(tǒng)一處理, 采用同一操作集操作, 比如讀取頁(yè)面或者回寫(xiě)頁(yè)面等. 每種不同的后備存儲(chǔ)都可以用不同的方法實(shí)現(xiàn)這些操作. 這樣, 系統(tǒng)定義了一套統(tǒng)一的接口, 每種后備存儲(chǔ)給出自己的實(shí)現(xiàn)方法. 這樣, 進(jìn)程的地址空間就被視為一組映射到不同數(shù)據(jù)對(duì)象上的的映射組成. 所有的有效地址就是那些映射到數(shù)據(jù)對(duì)象上的地址. 這些對(duì)象為映射它的頁(yè)面提供了持久性的后備存儲(chǔ). 映射用戶(hù)可以直接尋址這些對(duì)象.

  值得提出的是, VM體系結(jié)構(gòu)獨(dú)立于Unix系統(tǒng), 所有的Unix系統(tǒng)語(yǔ)義, 如正文, 數(shù)據(jù)及堆棧區(qū)都可以建構(gòu)在基本VM系統(tǒng)之上. 同時(shí), VM體系結(jié)構(gòu)也是獨(dú)立于存儲(chǔ)管理的, 存儲(chǔ)管理是由操作系統(tǒng)實(shí)施的, 如: 究竟采取什么樣的對(duì)換和請(qǐng)求調(diào)頁(yè)算法, 究竟是采取分段還是分頁(yè)機(jī)制進(jìn)行存儲(chǔ)管理, 究竟是如何將虛擬地址轉(zhuǎn)換成為物理地址等等(Linux中是一種叫Three Level Page Table的機(jī)制), 這些都與內(nèi)存對(duì)象的概念無(wú)關(guān).

  下面介紹Linux中 VM的實(shí)現(xiàn).

  一個(gè)進(jìn)程應(yīng)該包括一個(gè)mm_struct(memory manage struct), 該結(jié)構(gòu)是進(jìn)程虛擬地址空間的抽象描述, 里面包括了進(jìn)程虛擬空間的一些管理信息: start_code, end_code, start_data, end_data, start_brk, end_brk等等信息. 另外, 也有一個(gè)指向進(jìn)程虛存區(qū)表(vm_area_struct: virtual memory area)的指針, 該鏈?zhǔn)前凑仗摂M地址的增長(zhǎng)順序排列的. 在Linux進(jìn)程的地址空間被分作許多區(qū)(vma), 每個(gè)區(qū)(vma)都對(duì)應(yīng)虛擬地址空間上一段連續(xù)的區(qū)域, vma是可以被共享和保護(hù)的獨(dú)立實(shí)體, 這里的vma就是前面提到的內(nèi)存對(duì)象. 下面是vm_area_struct的結(jié)構(gòu), 其中, 前半部分是公共的, 與類(lèi)型無(wú)關(guān)的一些數(shù)據(jù)成員, 如: 指向mm_struct的指針, 地址范圍等等, 后半部分則是與類(lèi)型相關(guān)的成員, 其中最重要的是一個(gè)指向vm_operation_struct向量表的指針vm_ops, vm_pos向量表是一組虛函數(shù), 定義了與vma類(lèi)型無(wú)關(guān)的接口. 每一個(gè)特定的子類(lèi), 即每種vma類(lèi)型都在向量表中實(shí)現(xiàn)這些操作. 這里包括了: open, close, unmap, protect, sync, nopage, wppage, swapout這些操作.

  struct vm_area_struct {

  /*公共的, 與vma類(lèi)型無(wú)關(guān)的 */

  struct mm_struct * vm_mm;

  unsigned long vm_start;

  unsigned long vm_end;

  struct vm_area_struct *vm_next;

  pgprot_t vm_page_prot;

  unsigned long vm_flags;

  short vm_avl_height;

  struct vm_area_struct * vm_avl_left;

  struct vm_area_struct * vm_avl_right;

  struct vm_area_struct *vm_next_share;

  struct vm_area_struct **vm_pprev_share;

  /* 與類(lèi)型相關(guān)的 */

  struct vm_operations_struct * vm_ops;

  unsigned long vm_pgoff;

  struct file * vm_file;

  unsigned long vm_raend;

  void * vm_private_data;

  };

  vm_ops: open, close, no_page, swapin, swapout……

  介紹完VM的基本概念后, 我們可以講述mmap和munmap系統(tǒng)調(diào)用了. mmap調(diào)用實(shí)際上就是一個(gè)內(nèi)存對(duì)象vma的創(chuàng)建過(guò)程, mmap的調(diào)用格式是:

  void * mmap(void *start, size_t length, int prot , int flags, int fd, off_t offset);

  其中start是映射地址, length是映射長(zhǎng)度, 如果flags的MAP_FIXED不被置位, 則該參數(shù)通常被忽略, 而查找進(jìn)程地址空間中第一個(gè)長(zhǎng)度符合的空閑區(qū)域;Fd是映射文件的文件句柄, offset是映射文件中的偏移地址;prot是映射保護(hù)權(quán)限, 可以是PROT_EXEC, PROT_READ, PROT_WRITE, PROT_NONE, flags則是指映射類(lèi)型, 可以是MAP_FIXED, MAP_PRIVATE, MAP_SHARED, 該參數(shù)被 指定為MAP_PRIVATE和MAP_SHARED其中之一, MAP_PRIVATE 是創(chuàng)建一個(gè)寫(xiě)時(shí)拷貝映射(copy-on-write), 也就是說(shuō)如果有多個(gè)進(jìn)程同時(shí)映射到一個(gè)文件上, 映射建立時(shí)只是共享同樣的存儲(chǔ)頁(yè)面, 但是某進(jìn)程企圖修改頁(yè)面內(nèi)容, 則復(fù)制一個(gè)副本給該進(jìn)程私用, 它的任何修改對(duì)其它進(jìn)程都不可見(jiàn). 而MAP_SHARED則無(wú)論修改與否都使用同一副本, 任何進(jìn)程對(duì)頁(yè)面的修改對(duì)其它進(jìn)程都是可見(jiàn)的.

  mmap系統(tǒng)調(diào)用的實(shí)現(xiàn)過(guò)程是:

  1.先通過(guò)文件系統(tǒng)定位要映射的文件;

  2.權(quán)限檢查, 映射的權(quán)限不會(huì)超過(guò)文件打開(kāi)的方式, 也就是說(shuō)如果文件是以只讀方式打開(kāi), 那么則不允許建立一個(gè)可寫(xiě)映射;

  3.創(chuàng)建一個(gè)vma對(duì)象, 并對(duì)之進(jìn)行初始化;

  4.調(diào)用映射文件的mmap函數(shù), 其主要工作是給vm_ops向量表賦值;

  5.把該vma鏈入該進(jìn)程的vma鏈表中, 如果可以和前后的vma合并則合并;

  6.如果是要求VM_LOCKED(映射區(qū)不被換出)方式映射, 則發(fā)出缺頁(yè)請(qǐng)求, 把映射頁(yè)面讀入內(nèi)存中.

  munmap(void * start, size_t length):

  該調(diào)用可以看作是 mmap的一個(gè)逆過(guò)程. 它將進(jìn)程中從start開(kāi)始length長(zhǎng)度的一段區(qū)域的映射關(guān)閉, 如果該區(qū)域不是恰好對(duì)應(yīng)一個(gè)vma, 則有可能會(huì)分割幾個(gè)或幾個(gè)vma.

  msync(void * start, size_t length, int flags):

  把映射區(qū)域的修改回寫(xiě)到后備存儲(chǔ)中. munmap 時(shí)并不保證頁(yè)面回寫(xiě), 如果不調(diào)用msync, 那么有可能在munmap后丟失對(duì)映射區(qū)的修改. 其中flags可以是MS_SYNC, MS_ASYNC, MS_INVALIDATE, MS_SYNC要求回寫(xiě)完成后才返回, MS_ASYNC發(fā)出回寫(xiě)請(qǐng)求后立即返回, MS_INVALIDATE使用回寫(xiě)的內(nèi)容更新該文件的其它映射. 該系統(tǒng)調(diào)用是通過(guò)調(diào)用映射文件的sync函數(shù)來(lái)完成工作的.

  brk(void * end_data_segement):

  將進(jìn)程的數(shù)據(jù)段擴(kuò)展到 end_data_segement指定的地址, 該系統(tǒng)調(diào)用和mmap的實(shí)現(xiàn)方式十分相似, 同樣是產(chǎn)生一個(gè)vma, 然后指定其屬性. 不過(guò)在此之前需要做一些合法性檢查, 比如該地址是否大于mm->end_code, end_data_segement和mm->brk之間是否還存在其它vma等等. 通過(guò)brk產(chǎn)生的vma映射的文件為空, 這和匿名映射產(chǎn)生的vma相似, 關(guān)于匿名映射不做進(jìn)一步介紹. 庫(kù)函數(shù)malloc就是通過(guò)brk實(shí)現(xiàn)的.

  Linux提供了內(nèi)存映射函數(shù)mmap, 它把文件內(nèi)容映射到一段內(nèi)存上(準(zhǔn)確說(shuō)是虛擬內(nèi)存上), 通過(guò)對(duì)這段內(nèi)存的讀取和修改, 實(shí)現(xiàn)對(duì)文件的讀取和修改, 先來(lái)看一下mmap的函數(shù)聲明:

  頭文件:

  <unistd.h>

  <sys/mman.h>

  原型: void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offsize);

  返回值: 成功則返回映射區(qū)起始地址, 失敗則返回MAP_FAILED(-1).

  參數(shù):

  addr: 指定映射的起始地址, 通常設(shè)為NULL, 由系統(tǒng)指定.

  length: 將文件的多大長(zhǎng)度映射到內(nèi)存.

  prot: 映射區(qū)的保護(hù)方式, 可以是:

  PROT_EXEC: 映射區(qū)可被執(zhí)行.

  PROT_READ: 映射區(qū)可被讀取.

  PROT_WRITE: 映射區(qū)可被寫(xiě)入.

  PROT_NONE: 映射區(qū)不能存取.

  flags: 映射區(qū)的特性, 可以是:

  MAP_SHARED: 對(duì)映射區(qū)域的寫(xiě)入數(shù)據(jù)會(huì)復(fù)制回文件, 且允許其他映射該文件的進(jìn)程共享.

  MAP_PRIVATE: 對(duì)映射區(qū)域的寫(xiě)入操作會(huì)產(chǎn)生一個(gè)映射的復(fù)制(copy-on-write), 對(duì)此區(qū)域所做的修改不會(huì)寫(xiě)回原文件.

  此外還有其他幾個(gè)flags不很常用, 具體查看linux C函數(shù)說(shuō)明.

  fd: 由open返回的文件描述符, 代表要映射的文件.

  offset: 以文件開(kāi)始處的偏移量, 是分頁(yè)大小的整數(shù)倍, 通常為0, 表示從文件頭開(kāi)始映射.

  下面說(shuō)一下內(nèi)存映射的步驟:

  用open系統(tǒng)調(diào)用打開(kāi)文件, 并返回描述符fd.

  用mmap建立內(nèi)存映射, 并返回映射首地址指針start.

  對(duì)映射(文件)進(jìn)行各種操作, 顯示(printf), 修改(sprintf).

  用munmap(void *start, size_t lenght)關(guān)閉內(nèi)存映射.

  用close系統(tǒng)調(diào)用關(guān)閉文件fd.

  注意事項(xiàng):

  在修改映射的文件時(shí), 只能在原長(zhǎng)度上修改, 不能增加文件長(zhǎng)度, 內(nèi)存是已經(jīng)分配好的.

  Linux-mmap函數(shù)介紹

  mmap函數(shù)是unix/linux下的系統(tǒng)調(diào)用,來(lái)看《Unix Netword programming》卷二12.2節(jié)對(duì)mmap的介紹:

  The mmap function maps either a file or a Posix shared memory object into the address space of a process.We use this function for three purposes:

  1. with a regular file to provide memory-mapped I/O

  2. with special files to provide anonymous memory mappings

  3. with shm_open to provide Posix shared memory between unrelated processes

  mmap系統(tǒng)調(diào)用并不是完全為了用于共享內(nèi)存而設(shè)計(jì)的.它本身提供了不同于一般對(duì)普通文件的訪問(wèn)方式,進(jìn)程可以像讀寫(xiě)內(nèi)存一樣對(duì)普通文件的操作.而 Posix或系統(tǒng)V的共享內(nèi)存IPC則純粹用于共享目的,當(dāng)然mmap()實(shí)現(xiàn)共享內(nèi)存也是其主要應(yīng)用之一.

  mmap系統(tǒng)調(diào)用進(jìn)程之間通過(guò)映射同一個(gè)普通文件實(shí)現(xiàn)共享內(nèi)存.普通文件被映射到進(jìn)程地址空間后,進(jìn)程可以像訪問(wèn)普通內(nèi)存一樣對(duì)文件進(jìn)行訪問(wèn),不必再調(diào)用read(),write()等操作.

  我們的程序中大量運(yùn)用了mmap,用到的正是mmap的這種“像訪問(wèn)普通內(nèi)存一樣對(duì)文件進(jìn)行訪問(wèn)”的功能.實(shí)踐證明,當(dāng)要對(duì)一個(gè)文件頻繁的進(jìn)行訪問(wèn),并且指針來(lái)回移動(dòng)時(shí),調(diào)用mmap比用常規(guī)的方法快很多.

  來(lái)看看mmap的定義:

  void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset);

  參數(shù)fd為即將映射到進(jìn)程空間的文件描述字,一般由open()返回,同時(shí),fd可以指定為-1,此時(shí)須指定flags參數(shù)中的MAP_ANON,表明進(jìn)行的是匿名映射(不涉及具體的文件名,避免了文件的創(chuàng)建及打開(kāi),很顯然只能用于具有親緣關(guān)系的進(jìn)程間通信).

  len是映射到調(diào)用進(jìn)程地址空間的字節(jié)數(shù),它從被映射文件開(kāi)頭offset個(gè)字節(jié)開(kāi)始算起.

  prot參數(shù)指定共享內(nèi)存的訪問(wèn)權(quán)限.可取如下幾個(gè)值的或:PROT_READ(可讀),PROT_WRITE(可寫(xiě)),PROT_EXEC(可執(zhí)行),PROT_NONE(不可訪問(wèn)).

  flags由以下幾個(gè)常值指定:MAP_SHARED, MAP_PRIVATE, MAP_FIXED.其中,MAP_SHARED,MAP_PRIVATE必選其一,而MAP_FIXED則不推薦使用.

  如果指定為MAP_SHARED,則對(duì)映射的內(nèi)存所做的修改同樣影響到文件.如果是MAP_PRIVATE,則對(duì)映射的內(nèi)存所做的修改僅對(duì)該進(jìn)程可見(jiàn),對(duì)文件沒(méi)有影響.

  offset參數(shù)一般設(shè)為0,表示從文件頭開(kāi)始映射.

  參數(shù)addr指定文件應(yīng)被映射到進(jìn)程空間的起始地址,一般被指定一個(gè)空指針,此時(shí)選擇起始地址的任務(wù)留給內(nèi)核來(lái)完成.函數(shù)的返回值為文件映射到進(jìn)程空間的地址,進(jìn)程可直接操作起始地址為該值的有效地址.

  ,舉個(gè)例子來(lái)結(jié)束本節(jié).4.2節(jié)說(shuō)過(guò),Fileinformation數(shù)組是以二進(jìn)制的形式寫(xiě)進(jìn)一個(gè)叫inforindex的文件中.那么,當(dāng)要訪問(wèn) Fileinformation數(shù)組時(shí),代碼類(lèi)似這樣:

  struct stat st;

  char buffer=” inforindex”;

  Fileinformation *_fileinfoIndexptr = NULL;

  if(stat(buffer,&st)<0)

 

  fprintf(stderr,"error to stat %sn",buffer);

  exit(-1);

  }

  // mmap the inforindex to _fileinfoIndexptr

  int fd=open(buffer, O_RDONLY);

  if(fd<0)

  {

  printf("error to open %sn",buffer);

  exit(-1);

  }

  _fileinfoIndexptr = (Fileinformation*)mmap(NULL,st.st_size, PROT_READ,MAP_SHARED,fd,0);

  if(MAP_FAILED == _fileinfoIndexptr)

  {

  printf("error to mmap %sn",buffer);

  close(fd);

  exit(-1);

  }

  close(fd);

  下面這個(gè)例子顯示了把文件映射到內(nèi)存的方法

  源代碼是:

  /************關(guān)于本文檔********************************************

  *filename: mmap.c

  *purpose: 說(shuō)明調(diào)用mmap把文件映射到內(nèi)存的方法

  *wrote by: zhoulifa(zhoulifa@163.com) 周立發(fā)(http://zhoulifa.bokee.com)

  Linux愛(ài)好者 Linux知識(shí)傳播者 SOHO族 開(kāi)發(fā)者 最擅長(zhǎng)C語(yǔ)言

  *date time:2008-01-27 18:59 上海大雪天,據(jù)說(shuō)是多年不遇

  *Note: 任何人可以任意復(fù)制代碼并運(yùn)用這些文檔,當(dāng)然包括你的商業(yè)用途

  * 但請(qǐng)遵循GPL

  *Thanks to:

  * Ubuntu 本程序在Ubuntu 7.10系統(tǒng)上測(cè)試完全正常

  * Google.com 我通常通過(guò)google搜索發(fā)現(xiàn)許多有用的資料

  *Hope:希望越來(lái)越多的人貢獻(xiàn)自己的力量,為科學(xué)技術(shù)發(fā)展出力

  * 科技站在巨人的肩膀上進(jìn)步更快!感謝有開(kāi)源前輩的貢獻(xiàn)!

  *********************************************************************/

  #include <sys/mman.h> /* for mmap and munmap */

  #include <sys/types.h> /* for open */

  #include <sys/stat.h> /* for open */

  #include <fcntl.h> /* for open */

  #include <unistd.h> /* for lseek and write */

  #include <stdio.h>

  int main(int argc, char **argv)

  {

  int fd;

  char *mapped_mem, * p;

  int flength = 1024;

  void * start_addr = 0;

  fd = open(argv[1], O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);

  flength = lseek(fd, 1, SEEK_END);

  write(fd, "", 1); /* 在文件添加一個(gè)空字符,以便下面printf正常工作 */

  lseek(fd, 0, SEEK_SET);

  mapped_mem = mmap(start_addr, flength, PROT_READ, //允許讀

  MAP_PRIVATE, //不允許其它進(jìn)程訪問(wèn)此內(nèi)存區(qū)域

  fd, 0);

  /* 使用映射區(qū)域. */

  printf("%sn", mapped_mem); /* 為了保證這里工作正常,參數(shù)傳遞的文件名最好是一個(gè)文本文件 */

  close(fd);

  munmap(mapped_mem, flength);

  return 0;

  }

  編譯運(yùn)行此程序:

  gcc -Wall mmap.c

  ./a.out text_filename

  上面的方法用了PROT_READ,只能讀取文件里的內(nèi)容,不能修改,如果換成PROT_WRITE就可以修改文件的內(nèi)容了.又 用了MAAP_PRIVATE只能此進(jìn)程使用此內(nèi)存區(qū)域,如果換成MAP_SHARED,則可以被其它進(jìn)程訪問(wèn),比如下面的:

  #include <sys/mman.h> /* for mmap and munmap */

  #include <sys/types.h> /* for open */

  #include <sys/stat.h> /* for open */

  #include <fcntl.h> /* for open */

  #include <unistd.h> /* for lseek and write */

  #include <stdio.h>

  #include <string.h> /* for memcpy */

  int main(int argc, char **argv)

  {

  int fd;

  char *mapped_mem, * p;

  int flength = 1024;

  void * start_addr = 0;

  fd = open(argv[1], O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);

  flength = lseek(fd, 1, SEEK_END);

  write(fd, "", 1); /* 在文件添加一個(gè)空字符,以便下面printf正常工作 */

  lseek(fd, 0, SEEK_SET);

  start_addr = 0x80000;

  mapped_mem = mmap(start_addr, flength, PROT_READ|PROT_WRITE, //允許寫(xiě)入

  MAP_SHARED, //允許其它進(jìn)程訪問(wèn)此內(nèi)存區(qū)域

  fd, 0);

  /* 使用映射區(qū)域. */

  printf("%sn", mapped_mem); /* 為了保證這里工作正常,參數(shù)傳遞的文件名最好是一個(gè)文本文 */

  while((p = strstr(mapped_mem, "Hello"))) { /* 此處來(lái)修改文件 內(nèi)容 */

  memcpy(p, "Linux", 5);

  p = 5;

  }

  close(fd);

  munmap(mapped_mem, flength);

  return 0;

  }

  man -a mmap 看更詳細(xì)的信息

posted on 2011-07-20 15:51 艾斯維亞 閱讀(1375) 評(píng)論(0)  編輯 收藏 引用


只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            免费日韩av| 亚洲欧洲精品成人久久奇米网| 亚洲尤物影院| 久久国产精品久久久久久久久久 | 欧美日韩综合| 亚洲一区二区少妇| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲第一精品夜夜躁人人爽| 欧美精品色一区二区三区| 亚洲视频网在线直播| 久久香蕉国产线看观看网| 最新日韩在线| 国产精品久久久久久久久久尿| 欧美一级视频| 91久久一区二区| 一区二区三区 在线观看视频| 国产精品乱码妇女bbbb| 久久国产精品久久久久久久久久| 欧美国产亚洲另类动漫| 亚洲一卡久久| 黄色免费成人| 欧美日韩在线三级| 久久久亚洲国产美女国产盗摄| 91久久久国产精品| 久久女同互慰一区二区三区| 亚洲精品一线二线三线无人区| 国产九色精品成人porny| 欧美77777| 欧美一区二区三区精品| 亚洲精品久久久久久久久久久久久| 欧美亚洲一区二区在线观看| 亚洲欧洲美洲综合色网| 国产乱子伦一区二区三区国色天香| 蜜桃av一区二区在线观看| 亚洲欧美日产图| 亚洲人成网站色ww在线| 久久字幕精品一区| 亚洲欧美怡红院| 亚洲精品一区二区三| 国产视频久久久久| 国产精品a级| 欧美夫妇交换俱乐部在线观看| 欧美一区亚洲| 中文成人激情娱乐网| 亚洲承认在线| 免费看亚洲片| 久久精品国产清自在天天线 | 亚洲综合清纯丝袜自拍| 亚洲黄色成人久久久| 裸体歌舞表演一区二区| 久久国产加勒比精品无码| 亚洲性线免费观看视频成熟| 亚洲国产一区二区三区在线播 | 欧美女激情福利| 久久久综合网站| 午夜精品久久久久久| 亚洲一区二区免费| 一本一本a久久| 亚洲精品在线电影| 亚洲激情在线观看视频免费| 免费日韩视频| 另类酷文…触手系列精品集v1小说| 久久精品夜夜夜夜久久| 性欧美暴力猛交69hd| 亚洲欧美综合一区| 性久久久久久久久| 亚洲字幕在线观看| 亚洲欧美视频一区| 亚洲欧美日韩在线播放| 亚洲综合二区| 欧美夜福利tv在线| 久久成人18免费网站| 久久国产日韩| 久久蜜桃精品| 嫩草成人www欧美| 欧美韩日一区| 亚洲精品久久久蜜桃| 亚洲美女精品久久| 一区二区三区欧美亚洲| 亚洲一区二区三区精品视频| 亚洲欧美激情视频| 欧美一级片一区| 久久一区中文字幕| 欧美激情中文字幕一区二区| 欧美美女视频| 国产精品男女猛烈高潮激情| 国产日韩欧美一区二区| 激情综合视频| 99re热这里只有精品免费视频| 亚洲深爱激情| 久久gogo国模啪啪人体图| 久久夜精品va视频免费观看| 欧美成人精品在线播放| 亚洲欧洲视频在线| 中文国产成人精品| 欧美在线观看www| 老司机成人网| 欧美日韩精品一区二区| 国产美女搞久久| 在线欧美日韩国产| 亚洲无线一线二线三线区别av| 午夜精品久久久久久| 免费欧美电影| 夜夜嗨av一区二区三区中文字幕 | 99国产精品久久久久老师| 亚洲系列中文字幕| 久久人人97超碰精品888| 欧美日韩调教| 国产在线不卡| 一区二区三区视频在线| 久久亚洲综合网| 亚洲精品偷拍| 欧美一区二区三区四区在线观看地址| 巨乳诱惑日韩免费av| 国产精品成人观看视频免费| 黄网动漫久久久| 亚洲在线网站| 欧美成人免费观看| 亚洲欧美另类在线| 免费日韩视频| 国产精品视频网址| 999在线观看精品免费不卡网站| 欧美一区三区三区高中清蜜桃 | 国产精品系列在线播放| 亚洲国产精品尤物yw在线观看 | 91久久中文字幕| 欧美一区二区福利在线| 91久久综合| 久久免费观看视频| 国产精品一区二区三区四区 | 欧美激情精品| 激情伊人五月天久久综合| 亚洲摸下面视频| 亚洲黄色尤物视频| 久久久久欧美| 国产色综合网| 香蕉尹人综合在线观看| 亚洲精品看片| 你懂的国产精品永久在线| 国一区二区在线观看| 亚洲欧美日韩综合aⅴ视频| 亚洲人成人一区二区在线观看| 久久精视频免费在线久久完整在线看| 国产精品久久看| 亚洲视频一二区| 亚洲精品女人| 久久综合999| 伊人久久成人| 久久欧美中文字幕| 欧美一区二区免费| 国产精品一区一区三区| 亚洲伊人网站| 亚洲视频中文字幕| 欧美午夜精品一区| 亚洲在线一区| 亚洲少妇在线| 国产精品免费在线| 午夜综合激情| 亚洲在线电影| 国产精品国产三级国产专播品爱网 | 久久精品国产v日韩v亚洲 | 亚洲天堂av在线免费| 欧美日韩成人综合| 一个色综合av| 99视频+国产日韩欧美| 欧美日韩在线电影| 亚洲欧美日韩国产成人| 亚洲一区欧美| 国产日本精品| 老色批av在线精品| 蜜臀99久久精品久久久久久软件| 亚洲福利视频一区| 亚洲黄色一区| 欧美日韩一区二区免费在线观看| 亚洲视频大全| 亚洲一区二区在线播放| 国产亚洲欧美日韩一区二区| 久久亚洲综合| 免费黄网站欧美| 一区二区三区欧美激情| 亚洲午夜精品国产| 国产亚洲a∨片在线观看| 久久综合五月| 欧美大片一区二区三区| 亚洲视频一区二区| 小嫩嫩精品导航| 在线观看日韩av电影| 亚洲欧洲精品一区二区精品久久久| 欧美日韩一二三四五区| 久久精彩免费视频| 老司机一区二区三区| 99re热这里只有精品视频| 亚洲影院色在线观看免费| 一区二区三区在线视频免费观看| 欧美国产视频在线| 国产精品免费视频观看| 免费在线观看日韩欧美| 欧美日韩在线播放一区二区| 久久久久久穴| 欧美区一区二|