3atv精品不卡视频,97人人超碰国产精品最新,中文字幕av一区二区三区人妻少妇,久久久精品波多野结衣,日韩一区二区三区精品

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android系统匿名共享内存Ashmem(Anonymous Shared Memory)驱动程序源代码分析

發布時間:2024/8/24 Android 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android系统匿名共享内存Ashmem(Anonymous Shared Memory)驱动程序源代码分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章轉載至CSDN社區羅升陽的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6664554

在上一文章Android系統匿名共享內存Ashmem(Anonymous Shared Memory)簡要介紹和學習計劃中, 我們簡要介紹了Android系統的匿名共享內存機制,其中,簡要提到了它具有輔助內存管理系統來有效地管理內存的特點,但是沒有進一步去了解它是如何實 現的。在本文中,我們將通過分析Android系統的匿名共享內存Ashmem驅動程序的源代碼,來深入了解它是如何輔助內存管理系

?? ? ? ?Android系統的匿名共享內存Ashmem機制并沒有自立山頭,從頭搞一套自己的共享內存機制,而是建立在Linux內核實現的共享內存的基礎上 的。與此同時,它又向Linux內存管理系統的內存回收算法注冊接口,告訴Linux內存管理系統它的某些內存塊不再使用了,可以被回收了,不過,這些不 再使用的內存需要由它的使用者來告訴Ashmem驅動程序。通過這種用戶-Ashmem驅動程序-內存管理系統三者的緊密合作,實現有效的內存管理機制, 適合移動設備小內存的特點。

?? ? ? ?Android系統的匿名共享內存Ashmem驅動程序利用了Linux的共享內存子系統導出的接口來實現自己的功能,因此,它的實現非常小巧,總共代 碼不到700行。雖然代碼很少,但是這里不打算機械式地一行一行地閱讀和分析Ashmem驅動程序的源代碼,而是通過使用情景來分析,這樣可以幫助我們清 晰地理解它的實現原理。我們這里所說的使用情景,將從Android系統的應用程序框架層提供的匿名共享內存接口開始,經過系統運行時庫層,最終到達驅動 程序層,通過這樣一個完整的過程來理解Android系統的匿名共享內存Ashmem機制。這里,我們將從上一篇文章Android系統匿名共享內存Ashmem(Anonymous Shared Memory)簡要介紹和學習計劃介紹的Android應用程序框架層提供MemoryFile接口開始,分別介紹Android系統匿名共享內存的創建(open)、映射(mmap)、讀寫(read/write)以及鎖定和解鎖(pin/unpin)四個使用情景。

?? ? ? ?在進入到這個四個使用情景前,我們先來看一下Ashmem驅動程序模塊的初始化函數,看看它給用戶空間暴露了什么接口,即它創建了什么樣的設備文件,以 及提供了什么函數來操作這個設備文件。Ashmem驅動程序實現在kernel/common/mm/ashmem.c文件中,它的模塊初始化函數定義為 ashmem_init:

[cpp] view plaincopy
  • static?struct?file_operations?ashmem_fops?=?{??
  • ????.owner?=?THIS_MODULE,??
  • ????.open?=?ashmem_open,??
  • ????.release?=?ashmem_release,??
  • ????.mmap?=?ashmem_mmap,??
  • ????.unlocked_ioctl?=?ashmem_ioctl,??
  • ????.compat_ioctl?=?ashmem_ioctl,??
  • };??
  • ??
  • static?struct?miscdevice?ashmem_misc?=?{??
  • ????.minor?=?MISC_DYNAMIC_MINOR,??
  • ????.name?=?"ashmem",??
  • ????.fops?=?&ashmem_fops,??
  • };??
  • ??
  • static?int?__init?ashmem_init(void)??
  • {??
  • ????int?ret;??
  • ??
  • ????......??
  • ??
  • ????ret?=?misc_register(&ashmem_misc);??
  • ????if?(unlikely(ret))?{??
  • ????????printk(KERN_ERR?"ashmem:?failed?to?register?misc?device!\n");??
  • ????????return?ret;??
  • ????}??
  • ??
  • ????......??
  • ??
  • ????return?0;??
  • }??
  • ?? ? ? 這里,我們可以看到,Ahshmem驅動程序在加載時,會創建一個/dev/ashmem的設備文件,這是一個misc類型的設備。注冊misc設備是通過misc_register函數進行的,關于這個函數的詳細實現,可以參考前面Android日志系統驅動程序Logger源代碼分析一 文,調用這個函數成功后,就會在/dev目錄下生成一個ashmem設備文件了。同時,我們還可以看到,這個設備文件提供了open、mmap、 release和ioctl四種操作。為什么沒有read和write操作呢?這是因為讀寫共享內存的方法是通過內存映射地址來進行的,即通過mmap系 統調用把這個設備文件映射到進程地址空間中,然后就直接對內存進行讀寫了,不需要通過read 和write文件操作,后面我們將會具體分析是如何實現的。
    ?? ? ? 有了這個基礎之后,下面我們就分四個部分來分別介紹匿名共享內存的創建(open)、映射(mmap)、讀寫(read/write)以及鎖定和解鎖(pin/unpin)使用情景。

    ?? ? ? ?一. 匿名共享內存的創建操作

    ?? ? ? ?在Android應用程序框架層提供MemoryFile類的構造函數中,進行了匿名共享內存的創建操作,我們先來看一下這個構造函數的實現,它位于 frameworks/base/core/java/android/os/MemoryFile.java文件中:

    [java] view plaincopy
  • public?class?MemoryFile??
  • {??
  • ????......??
  • ??
  • ????private?static?native?FileDescriptor?native_open(String?name,?int?length)?throws?IOException;??
  • ??????
  • ????......??
  • ??
  • ????private?FileDescriptor?mFD;????????//?ashmem?file?descriptor??
  • ????......??
  • ????private?int?mLength;????//?total?length?of?our?ashmem?region??
  • ??????
  • ????......??
  • ??
  • ????/**?
  • ????*?Allocates?a?new?ashmem?region.?The?region?is?initially?not?purgable.?
  • ????*?
  • ????*?@param?name?optional?name?for?the?file?(can?be?null).?
  • ????*?@param?length?of?the?memory?file?in?bytes.?
  • ????*?@throws?IOException?if?the?memory?file?could?not?be?created.?
  • ????*/??
  • ????public?MemoryFile(String?name,?int?length)?throws?IOException?{??
  • ????????mLength?=?length;??
  • ????????mFD?=?native_open(name,?length);??
  • ????????......??
  • ????}??
  • ??
  • ????......??
  • }??
  • ?? ? ? ?這里我們看到,這個構造函數最終是通過JNI方法native_open來創建匿名內存共享文件。這個JNI方法native_open實現在frameworks/base/core/jni/adroid_os_MemoryFile.cpp文件中:

    [cpp] view plaincopy
  • static?jobject?android_os_MemoryFile_open(JNIEnv*?env,?jobject?clazz,?jstring?name,?jint?length)??
  • {??
  • ????const?char*?namestr?=?(name???env->GetStringUTFChars(name,?NULL)?:?NULL);??
  • ??
  • ????int?result?=?ashmem_create_region(namestr,?length);??
  • ??
  • ????if?(name)??
  • ????????env->ReleaseStringUTFChars(name,?namestr);??
  • ??
  • ????if?(result?<?0)?{??
  • ????????jniThrowException(env,?"java/io/IOException",?"ashmem_create_region?failed");??
  • ????????return?NULL;??
  • ????}??
  • ??
  • ????return?jniCreateFileDescriptor(env,?result);??
  • }??
  • ?? ? ? ?這個函數又通過運行時庫提供的接口ashmem_create_region來創建匿名共享內存,這個函數實現在system/core/libcutils/ashmem-dev.c文件中:

    [cpp] view plaincopy
  • /*?
  • ?*?ashmem_create_region?-?creates?a?new?ashmem?region?and?returns?the?file?
  • ?*?descriptor,?or?<0?on?error?
  • ?*?
  • ?*?`name'?is?an?optional?label?to?give?the?region?(visible?in?/proc/pid/maps)?
  • ?*?`size'?is?the?size?of?the?region,?in?page-aligned?bytes?
  • ?*/??
  • int?ashmem_create_region(const?char?*name,?size_t?size)??
  • {??
  • ????int?fd,?ret;??
  • ??
  • ????fd?=?open(ASHMEM_DEVICE,?O_RDWR);??
  • ????if?(fd?<?0)??
  • ????????return?fd;??
  • ??
  • ????if?(name)?{??
  • ????????char?buf[ASHMEM_NAME_LEN];??
  • ??
  • ????????strlcpy(buf,?name,?sizeof(buf));??
  • ????????ret?=?ioctl(fd,?ASHMEM_SET_NAME,?buf);??
  • ????????if?(ret?<?0)??
  • ????????????goto?error;??
  • ????}??
  • ??
  • ????ret?=?ioctl(fd,?ASHMEM_SET_SIZE,?size);??
  • ????if?(ret?<?0)??
  • ????????goto?error;??
  • ??
  • ????return?fd;??
  • ??
  • error:??
  • ????close(fd);??
  • ????return?ret;??
  • }??
  • ?? ? ? ?這里,一共通過執行三個文件操作系統調用來和Ashmem驅動程序進行交互,分雖是一個open和兩個ioctl操作,前者是打開設備文件ASHMEM_DEVICE,后者分別是設置匿名共享內存的名稱和大小。

    ?? ? ? ?在介紹這三個文件操作之前,我們先來了解一下Ashmem驅動程序的一個相關數據結構struct ashmem_area,這個數據結構就是用來表示一塊共享內存的,它定義在kernel/common/mm/ashmem.c文件中:

    [cpp] view plaincopy
  • /*?
  • ?*?ashmem_area?-?anonymous?shared?memory?area?
  • ?*?Lifecycle:?From?our?parent?file's?open()?until?its?release()?
  • ?*?Locking:?Protected?by?`ashmem_mutex'?
  • ?*?Big?Note:?Mappings?do?NOT?pin?this?structure;?it?dies?on?close()?
  • ?*/??
  • struct?ashmem_area?{??
  • ????char?name[ASHMEM_FULL_NAME_LEN];/*?optional?name?for?/proc/pid/maps?*/??
  • ????struct?list_head?unpinned_list;?/*?list?of?all?ashmem?areas?*/??
  • ????struct?file?*file;??????/*?the?shmem-based?backing?file?*/??
  • ????size_t?size;????????????/*?size?of?the?mapping,?in?bytes?*/??
  • ????unsigned?long?prot_mask;????/*?allowed?prot?bits,?as?vm_flags?*/??
  • };??
  • ?? ? ? ?域name表示這塊共享內存的名字,這個名字會顯示/proc/<pid>/maps文件中,<pid>表示打開這個共享內存 文件的進程ID;域unpinned_list是一個列表頭,它把這塊共享內存中所有被解鎖的內存塊連接在一起,下面我們講內存塊的鎖定和解鎖操作時會看 到它的用法;域file表示這個共享內存在臨時文件系統tmpfs中對應的文件,在內核決定要把這塊共享內存對應的物理頁面回收時,就會把它的內容交換到 這個臨時文件中去;域size表示這塊共享內存的大小;域prot_mask表示這塊共享內存的訪問保護位。

    ?? ? ? ?在Ashmem驅動程中,所有的ashmem_area實例都是從自定義的一個slab緩沖區創建的。這個slab緩沖區是在驅動程序模塊初始化函數創建的,我們來看一個這個初始化函數的相關實現:

    [cpp] view plaincopy
  • static?int?__init?ashmem_init(void)??
  • {??
  • ????int?ret;??
  • ??
  • ????ashmem_area_cachep?=?kmem_cache_create("ashmem_area_cache",??
  • ????????sizeof(struct?ashmem_area),??
  • ????????0,?0,?NULL);??
  • ????if?(unlikely(!ashmem_area_cachep))?{??
  • ????????printk(KERN_ERR?"ashmem:?failed?to?create?slab?cache\n");??
  • ????????return?-ENOMEM;??
  • ????}??
  • ??
  • ????......??
  • ??
  • ????return?0;??
  • }??
  • ?? ? ? ? 全局變量定義在文件開頭的地方:

    [cpp] view plaincopy
  • static?struct?kmem_cache?*ashmem_area_cachep?__read_mostly;??
  • ?? ? ? ?它的類型是struct kmem_cache,表示這是一個slab緩沖區,由內核中的內存管理系統進行管理。

    ?? ? ? ?這里就是通過kmem_cache_create函數來創建一個名為"ashmem_area_cache"、對象大小為sizeof(struct ashmem_area)的緩沖區了。緩沖區創建了以后,就可以每次從它分配一個struct ashmem_area對象了。關于Linux內核的slab緩沖區的相關知識,可以參考前面Android學習啟動篇一文中提到的一本參考書籍《Understanding the Linux Kernel》的第八章Memory Managerment。

    ?? ? ? ?有了這些基礎知識后,我們回到前面的ashmem_create_region函數中。

    ?? ? ? ?首先是執行打開文件的操作:

    [cpp] view plaincopy
  • fd?=?open(ASHMEM_DEVICE,?O_RDWR);??
  • ?? ? ? ?ASHMEM_DEVICE是一個宏,定義為:

    [cpp] view plaincopy
  • #define?ASHMEM_DEVICE???"/dev/ashmem"??
  • ?? ? ? ? 這里就是匿名共享內存設備文件/dev/ashmem了。

    ?? ? ? ?從上面的描述我們可以知道,調用這個open函數最終會進入到Ashmem驅動程序中的ashmem_open函數中去:

    [cpp] view plaincopy
  • static?int?ashmem_open(struct?inode?*inode,?struct?file?*file)??
  • {??
  • ????struct?ashmem_area?*asma;??
  • ????int?ret;??
  • ??
  • ????ret?=?nonseekable_open(inode,?file);??
  • ????if?(unlikely(ret))??
  • ????????return?ret;??
  • ??
  • ????asma?=?kmem_cache_zalloc(ashmem_area_cachep,?GFP_KERNEL);??
  • ????if?(unlikely(!asma))??
  • ????????return?-ENOMEM;??
  • ??
  • ????INIT_LIST_HEAD(&asma->unpinned_list);??
  • ????memcpy(asma->name,?ASHMEM_NAME_PREFIX,?ASHMEM_NAME_PREFIX_LEN);??
  • ????asma->prot_mask?=?PROT_MASK;??
  • ????file->private_data?=?asma;??
  • ??
  • ????return?0;??
  • }??
  • ?? ? ? ?首先是通過nonseekable_open函數來設備這個文件不可以執行定位操作,即不可以執行seek文件操作。接著就是通過 kmem_cache_zalloc函數從剛才我們創建的slab緩沖區ashmem_area_cachep來創建一個ashmem_area結構體 了,并且保存在本地變量asma中。再接下去就是初始化變量asma的其它域,其中,域name初始為ASHMEM_NAME_PREFIX,這是一個 宏,定義為:

    [cpp] view plaincopy
  • #define?ASHMEM_NAME_PREFIX?"dev/ashmem/"??
  • #define?ASHMEM_NAME_PREFIX_LEN?(sizeof(ASHMEM_NAME_PREFIX)?-?1)??
  • ?? ? ? ?函數的最后是把這個ashmem_area結構保存在打開文件結構體的private_data域中,這樣,Ashmem驅動程序就可以在其它地方通過這個private_data域來取回這個ashmem_area結構了。

    ?? ? ? ?到這里,設備文件/dev/ashmem的打開操作就完成了,它實際上就是在Ashmem驅動程序中創建了一個ashmem_area結構,表示一塊新的共享內存。

    ?? ? ? ?再回到ashmem_create_region函數中,又調用了兩次ioctl文件操作分別來設備這塊新建的匿名共享內存的名字和大小。在 kernel/comon/mm/include/ashmem.h文件中,ASHMEM_SET_NAME和ASHMEM_SET_SIZE的定義為:

    [cpp] view plaincopy
  • #define?ASHMEM_NAME_LEN?????256??
  • ??
  • #define?__ASHMEMIOC?????0x77??
  • ??
  • #define?ASHMEM_SET_NAME?????_IOW(__ASHMEMIOC,?1,?char[ASHMEM_NAME_LEN])??
  • #define?ASHMEM_SET_SIZE?????_IOW(__ASHMEMIOC,?3,?size_t)??
  • ?? ? ? 先來看ASHMEM_SET_NAME命令的ioctl調用,它最終進入到Ashmem驅動程序的ashmem_ioctl函數中:

    [cpp] view plaincopy
  • static?long?ashmem_ioctl(struct?file?*file,?unsigned?int?cmd,?unsigned?long?arg)??
  • {??
  • ????struct?ashmem_area?*asma?=?file->private_data;??
  • ????long?ret?=?-ENOTTY;??
  • ??
  • ????switch?(cmd)?{??
  • ????case?ASHMEM_SET_NAME:??
  • ????????ret?=?set_name(asma,?(void?__user?*)?arg);??
  • ????????break;??
  • ????......??
  • ????}??
  • ??
  • ????return?ret;??
  • }??
  • ?? ? ? 這里通過set_name函數來進行實際操作:

    [cpp] view plaincopy
  • static?int?set_name(struct?ashmem_area?*asma,?void?__user?*name)??
  • {??
  • ????int?ret?=?0;??
  • ??
  • ????mutex_lock(&ashmem_mutex);??
  • ??
  • ????/*?cannot?change?an?existing?mapping's?name?*/??
  • ????if?(unlikely(asma->file))?{??
  • ????????ret?=?-EINVAL;??
  • ????????goto?out;??
  • ????}??
  • ??
  • ????if?(unlikely(copy_from_user(asma->name?+?ASHMEM_NAME_PREFIX_LEN,??
  • ????????????????????name,?ASHMEM_NAME_LEN)))??
  • ????????ret?=?-EFAULT;??
  • ????asma->name[ASHMEM_FULL_NAME_LEN-1]?=?'\0';??
  • ??
  • out:??
  • ????mutex_unlock(&ashmem_mutex);??
  • ??
  • ????return?ret;??
  • }??
  • ?? ? ? ?這個函數實現很簡單,把用戶空間傳進來的匿名共享內存的名字設備到asma->name域中去。注意,匿名共享內存塊的名字的內容分兩部分,前一 部分是前綴,這是在open操作時,由驅動程序默認設置的,固定為ASHMEM_NAME_PREFIX,即"dev/ashmem/";后一部分由用戶 指定,這一部分是可選的,即用戶可以不調用ASHMEM_SET_NAME命令來設置匿名共享內存塊的名字。

    ?? ? ? ?再來看ASHMEM_SET_SIZE命令的ioctl調用,它最終也是進入到Ashmem驅動程序的ashmem_ioctl函數中:

    [cpp] view plaincopy
  • static?long?ashmem_ioctl(struct?file?*file,?unsigned?int?cmd,?unsigned?long?arg)??
  • {??
  • ????struct?ashmem_area?*asma?=?file->private_data;??
  • ????long?ret?=?-ENOTTY;??
  • ??
  • ????switch?(cmd)?{??
  • ????......??
  • ????case?ASHMEM_SET_SIZE:??
  • ????????ret?=?-EINVAL;??
  • ????????if?(!asma->file)?{??
  • ????????????ret?=?0;??
  • ????????????asma->size?=?(size_t)?arg;??
  • ????????}??
  • ????????break;??
  • ????......??
  • ????}??
  • ??
  • ????return?ret;??
  • }??
  • ?? ? ? ?這個實現很簡單,只是把用戶空間傳進來的匿名共享內存的大小值保存在對應的asma->size域中。

    ?? ? ? ?這樣,ashmem_create_region函數就執先完成了,層層返回,最后回到應用程序框架層提供的接口Memory的構造函數中,整個匿名共 享內存的創建過程就完成了。前面我們說過過,Ashmem驅動程序不提供read和write文件操作,進程若要訪問這個共享內存,必須要把這個設備文件 映射到自己的進程空間中,然后進行直接內存訪問,這就是我們下面要介紹的匿名共享內存設備文件的內存映射操作了。

    ?? ? ? ?二.?匿名共享內存設備文件的內存映射操作

    ?? ? ? ?在MemoryFile類的構造函數中,進行了匿名共享內存的創建操作后,下一步就是要把匿名共享內存設備文件映射到進程空間來了:

    [java] view plaincopy
  • public?class?MemoryFile??
  • {??
  • ????......??
  • ??
  • ????//?returns?memory?address?for?ashmem?region??
  • ????private?static?native?int?native_mmap(FileDescriptor?fd,?int?length,?int?mode)??
  • ????????throws?IOException;??
  • ??????
  • ????......??
  • ??
  • ????private?int?mAddress;???//?address?of?ashmem?memory??
  • ??????
  • ????......??
  • ??
  • ????/**?
  • ????*?Allocates?a?new?ashmem?region.?The?region?is?initially?not?purgable.?
  • ????*?
  • ????*?@param?name?optional?name?for?the?file?(can?be?null).?
  • ????*?@param?length?of?the?memory?file?in?bytes.?
  • ????*?@throws?IOException?if?the?memory?file?could?not?be?created.?
  • ????*/??
  • ????public?MemoryFile(String?name,?int?length)?throws?IOException?{??
  • ????????......??
  • ????????mAddress?=?native_mmap(mFD,?length,?PROT_READ?|?PROT_WRITE);??
  • ????????......??
  • ????}??
  • }??
  • ?? ? ? ? 映射匿名共享內存設備文件到進程空間是通過JNI方法native_mmap來進行的。這個JNI方法實現在frameworks/base/core/jni/adroid_os_MemoryFile.cpp文件中:

    [cpp] view plaincopy
  • static?jint?android_os_MemoryFile_mmap(JNIEnv*?env,?jobject?clazz,?jobject?fileDescriptor,??
  • ????????jint?length,?jint?prot)??
  • {??
  • ????int?fd?=?jniGetFDFromFileDescriptor(env,?fileDescriptor);??
  • ????jint?result?=?(jint)mmap(NULL,?length,?prot,?MAP_SHARED,?fd,?0);??
  • ????if?(!result)??
  • ????????jniThrowException(env,?"java/io/IOException",?"mmap?failed");??
  • ????return?result;??
  • }??
  • ?? ? ? ?這里的文件描述符fd是在前面open匿名設備文件/dev/ashmem獲得的,有個這個文件描述符后,就可以直接通過mmap來執行內存映射操作了。這個mmap系統調用最終進入到Ashmem驅動程序的ashmem_mmap函數中:

    [cpp] view plaincopy
  • static?int?ashmem_mmap(struct?file?*file,?struct?vm_area_struct?*vma)??
  • {??
  • ????struct?ashmem_area?*asma?=?file->private_data;??
  • ????int?ret?=?0;??
  • ??
  • ????mutex_lock(&ashmem_mutex);??
  • ??
  • ????/*?user?needs?to?SET_SIZE?before?mapping?*/??
  • ????if?(unlikely(!asma->size))?{??
  • ????????ret?=?-EINVAL;??
  • ????????goto?out;??
  • ????}??
  • ??
  • ????/*?requested?protection?bits?must?match?our?allowed?protection?mask?*/??
  • ????if?(unlikely((vma->vm_flags?&?~asma->prot_mask)?&?PROT_MASK))?{??
  • ????????ret?=?-EPERM;??
  • ????????goto?out;??
  • ????}??
  • ??
  • ????if?(!asma->file)?{??
  • ????????char?*name?=?ASHMEM_NAME_DEF;??
  • ????????struct?file?*vmfile;??
  • ??
  • ????????if?(asma->name[ASHMEM_NAME_PREFIX_LEN]?!=?'\0')??
  • ????????????name?=?asma->name;??
  • ??
  • ????????/*?...?and?allocate?the?backing?shmem?file?*/??
  • ????????vmfile?=?shmem_file_setup(name,?asma->size,?vma->vm_flags);??
  • ????????if?(unlikely(IS_ERR(vmfile)))?{??
  • ????????????ret?=?PTR_ERR(vmfile);??
  • ????????????goto?out;??
  • ????????}??
  • ????????asma->file?=?vmfile;??
  • ????}??
  • ????get_file(asma->file);??
  • ??
  • ????if?(vma->vm_flags?&?VM_SHARED)??
  • ????????shmem_set_file(vma,?asma->file);??
  • ????else?{??
  • ????????if?(vma->vm_file)??
  • ????????????fput(vma->vm_file);??
  • ????????vma->vm_file?=?asma->file;??
  • ????}??
  • ????vma->vm_flags?|=?VM_CAN_NONLINEAR;??
  • ??
  • out:??
  • ????mutex_unlock(&ashmem_mutex);??
  • ????return?ret;??
  • }??
  • ?? ? ? ?這個函數的實現也很簡單,它調用了Linux內核提供的shmem_file_setup函數來在臨時文件系統tmpfs中創建一個臨時文件,這個臨時 文件與Ashmem驅動程序創建的匿名共享內存對應。函數shmem_file_setup是Linux內核中用來創建共享內存文件的方法,而Linux 內核中的共享內存機制其實是一種進程間通信(IPC)機制,它的實現相對也是比較復雜,Android系統的匿名共享內存機制正是由于直接使用了 Linux內核共享內存機制,它才會很小巧,它站在巨人的肩膀上了。關于Linux內核中的共享內存的相關知識,可以參考前面Android學習啟動篇一文中提到的一本參考書籍《Linux內核源代碼情景分析》的第六章傳統的Unix進程間通信第七小節共享內存。

    ?? ? ? ?通過shmem_file_setup函數創建的臨時文件vmfile最終就保存在vma->file中了。這里的vma是由Linux內核的文 件系統層傳進來的,它的類型為struct vm_area_struct,它表示的是當前進程空間中一塊連續的虛擬地址空間,它的起始地址可以由用戶來指定,也可以由內核自己來分配,這里我們從 JNI方法native_mmap調用的mmap的第一個參數為NULL可以看出,這塊連續的虛擬地址空間的起始地址是由內核來指定的。文件內存映射操作 完成后,用戶訪問這個范圍的地址空間就相當于是訪問對應的文件的內容了。有關Linux文件的內存映射操作,同樣可以參考前面Android學習啟動篇一文中提到的一本參考書籍《Linux內核源代碼情景分析》的第二章內存管理第十三小節系統調用mmap。從這里我們也可以看出,Android系統的匿名共享內存是在虛擬地址空間連續的,但是在物理地址空間就不一定是連續的了。

    ?? ? ? ?同時,這個臨時文件vmfile也會保存asma->file域中,這樣,Ashmem驅動程序后面就可以通過在asma->file來操作這個匿名內存共享文件了。

    ?? ? ? ?函數ashmem_mmap執行完成后,經過層層返回到JNI方法native_mmap中去,就從mmap函數的返回值中得到了這塊虛擬空間的起始地 址了,這個起始地址最終返回到應用程序框架層的MemoryFile類的構造函數中,并且保存在成員變量mAddress中,后面,共享內存的讀寫操作就 是對這個地址空間進行操作了。

    ?? ? ? ?三.?匿名共享內存的讀寫操作

    ?? ? ? ?因為前面對匿名共享內存文件進行內存映射操作,這里對匿名內存文件內容的讀寫操作就比較簡單了,就像訪問內存變量一樣就行了。

    ?? ? ? ?我們來看一下MemoryFile類的讀寫操作函數:

    [cpp] view plaincopy
  • public?class?MemoryFile??
  • {??
  • ????......??
  • ??
  • ????private?static?native?int?native_read(FileDescriptor?fd,?int?address,?byte[]?buffer,??
  • ????????int?srcOffset,?int?destOffset,?int?count,?boolean?isUnpinned)?throws?IOException;??
  • ????private?static?native?void?native_write(FileDescriptor?fd,?int?address,?byte[]?buffer,??
  • ????????int?srcOffset,?int?destOffset,?int?count,?boolean?isUnpinned)?throws?IOException;??
  • ??????
  • ????......??
  • ??
  • ????private?FileDescriptor?mFD;????????//?ashmem?file?descriptor??
  • ????private?int?mAddress;???//?address?of?ashmem?memory??
  • ????private?int?mLength;????//?total?length?of?our?ashmem?region??
  • ????private?boolean?mAllowPurging?=?false;??//?true?if?our?ashmem?region?is?unpinned??
  • ??
  • ????......??
  • ??
  • ????/**?
  • ????*?Reads?bytes?from?the?memory?file.?
  • ????*?Will?throw?an?IOException?if?the?file?has?been?purged.?
  • ????*?
  • ????*?@param?buffer?byte?array?to?read?bytes?into.?
  • ????*?@param?srcOffset?offset?into?the?memory?file?to?read?from.?
  • ????*?@param?destOffset?offset?into?the?byte?array?buffer?to?read?into.?
  • ????*?@param?count?number?of?bytes?to?read.?
  • ????*?@return?number?of?bytes?read.?
  • ????*?@throws?IOException?if?the?memory?file?has?been?purged?or?deactivated.?
  • ????*/??
  • ????public?int?readBytes(byte[]?buffer,?int?srcOffset,?int?destOffset,?int?count)???
  • ????throws?IOException?{??
  • ????????if?(isDeactivated())?{??
  • ????????????throw?new?IOException("Can't?read?from?deactivated?memory?file.");??
  • ????????}??
  • ????????if?(destOffset?<?0?||?destOffset?>?buffer.length?||?count?<?0??
  • ????????????||?count?>?buffer.length?-?destOffset??
  • ????????????||?srcOffset?<?0?||?srcOffset?>?mLength??
  • ????????????||?count?>?mLength?-?srcOffset)?{??
  • ????????????????throw?new?IndexOutOfBoundsException();??
  • ????????}??
  • ????????return?native_read(mFD,?mAddress,?buffer,?srcOffset,?destOffset,?count,?mAllowPurging);??
  • ????}??
  • ??
  • ????/**?
  • ????*?Write?bytes?to?the?memory?file.?
  • ????*?Will?throw?an?IOException?if?the?file?has?been?purged.?
  • ????*?
  • ????*?@param?buffer?byte?array?to?write?bytes?from.?
  • ????*?@param?srcOffset?offset?into?the?byte?array?buffer?to?write?from.?
  • ????*?@param?destOffset?offset??into?the?memory?file?to?write?to.?
  • ????*?@param?count?number?of?bytes?to?write.?
  • ????*?@throws?IOException?if?the?memory?file?has?been?purged?or?deactivated.?
  • ????*/??
  • ????public?void?writeBytes(byte[]?buffer,?int?srcOffset,?int?destOffset,?int?count)??
  • ????????throws?IOException?{??
  • ????????????if?(isDeactivated())?{??
  • ????????????????throw?new?IOException("Can't?write?to?deactivated?memory?file.");??
  • ????????????}??
  • ????????????if?(srcOffset?<?0?||?srcOffset?>?buffer.length?||?count?<?0??
  • ????????????????||?count?>?buffer.length?-?srcOffset??
  • ????????????????||?destOffset?<?0?||?destOffset?>?mLength??
  • ????????????????||?count?>?mLength?-?destOffset)?{??
  • ????????????????????throw?new?IndexOutOfBoundsException();??
  • ????????????}??
  • ????????????native_write(mFD,?mAddress,?buffer,?srcOffset,?destOffset,?count,?mAllowPurging);??
  • ????}??
  • ??
  • ????......??
  • }??
  • ?? ? ? ?這里,我們可以看到,MemoryFile的匿名共享內存讀寫操作都是通過JNI方法來實現的,讀操作和寫操作的JNI方法分別是 native_read和native_write,它們都是定義在frameworks/base/core/jni /adroid_os_MemoryFile.cpp文件中:

    [cpp] view plaincopy
  • static?jint?android_os_MemoryFile_read(JNIEnv*?env,?jobject?clazz,??
  • ????????jobject?fileDescriptor,?jint?address,?jbyteArray?buffer,?jint?srcOffset,?jint?destOffset,??
  • ????????jint?count,?jboolean?unpinned)??
  • {??
  • ????int?fd?=?jniGetFDFromFileDescriptor(env,?fileDescriptor);??
  • ????if?(unpinned?&&?ashmem_pin_region(fd,?0,?0)?==?ASHMEM_WAS_PURGED)?{??
  • ????????ashmem_unpin_region(fd,?0,?0);??
  • ????????jniThrowException(env,?"java/io/IOException",?"ashmem?region?was?purged");??
  • ????????return?-1;??
  • ????}??
  • ??
  • ????env->SetByteArrayRegion(buffer,?destOffset,?count,?(const?jbyte?*)address?+?srcOffset);??
  • ??
  • ????if?(unpinned)?{??
  • ????????ashmem_unpin_region(fd,?0,?0);??
  • ????}??
  • ????return?count;??
  • }??
  • ??
  • static?jint?android_os_MemoryFile_write(JNIEnv*?env,?jobject?clazz,??
  • ????????jobject?fileDescriptor,?jint?address,?jbyteArray?buffer,?jint?srcOffset,?jint?destOffset,??
  • ????????jint?count,?jboolean?unpinned)??
  • {??
  • ????int?fd?=?jniGetFDFromFileDescriptor(env,?fileDescriptor);??
  • ????if?(unpinned?&&?ashmem_pin_region(fd,?0,?0)?==?ASHMEM_WAS_PURGED)?{??
  • ????????ashmem_unpin_region(fd,?0,?0);??
  • ????????jniThrowException(env,?"java/io/IOException",?"ashmem?region?was?purged");??
  • ????????return?-1;??
  • ????}??
  • ??
  • ????env->GetByteArrayRegion(buffer,?srcOffset,?count,?(jbyte?*)address?+?destOffset);??
  • ??
  • ????if?(unpinned)?{??
  • ????????ashmem_unpin_region(fd,?0,?0);??
  • ????}??
  • ????return?count;??
  • }??
  • ?? ? ? ?這里的address參數就是我們在前面執行mmap來映射匿名共享內存文件到內存中時,得到的進程虛擬地址空間的起始地址了,因此,這里就直接可以訪 問,不必進入到Ashmem驅動程序中去,這也是為什么Ashmem驅動程序沒有提供read和write文件操作的原因。

    ?? ? ? ?這里我們看到的ashmem_pin_region和ashmem_unpin_region兩個函數是系統運行時庫提供的接口,用來執行我們前面說的 匿名共享內存的鎖定和解鎖操作,它們的作用是告訴Ashmem驅動程序,它的哪些內存塊是正在使用的,需要鎖定,哪些內存是不需要使用了,可以它解鎖,這 樣,Ashmem驅動程序就可以輔助內存管理系統來有效地管理內存了。下面我們就看看Ashmem驅動程序是如果輔助內存管理系統來有效地管理內存的。

    ?? ? ? ?四.?匿名共享內存的鎖定和解鎖操作
    ?? ? ? ?前面提到,Android系統的運行時庫提到了執行匿名共享內存的鎖定和解鎖操作的兩個函數ashmem_pin_region和 ashmem_unpin_region,它們實現在system/core/libcutils/ashmem-dev.c文件中:

    [cpp] view plaincopy
  • int?ashmem_pin_region(int?fd,?size_t?offset,?size_t?len)??
  • {??
  • ????struct?ashmem_pin?pin?=?{?offset,?len?};??
  • ????return?ioctl(fd,?ASHMEM_PIN,?&pin);??
  • }??
  • ??
  • int?ashmem_unpin_region(int?fd,?size_t?offset,?size_t?len)??
  • {??
  • ????struct?ashmem_pin?pin?=?{?offset,?len?};??
  • ????return?ioctl(fd,?ASHMEM_UNPIN,?&pin);??
  • }??
  • ?? ? ? 它們的實現很簡單,通過ASHMEM_PIN和ASHMEM_UNPIN兩個ioctl操作來實現匿名共享內存的鎖定和解鎖操作。

    ?? ? ? 我們先看來一下ASHMEM_PIN和ASHMEM_UNPIN這兩個命令號的定義,它們的定義可以在kernel/common/include/linux/ashmem.h文件中找到:

    [cpp] view plaincopy
  • #define?__ASHMEMIOC?????0x77??
  • ??
  • #define?ASHMEM_PIN??????_IOW(__ASHMEMIOC,?7,?struct?ashmem_pin)??
  • #define?ASHMEM_UNPIN????????_IOW(__ASHMEMIOC,?8,?struct?ashmem_pin)??
  • ?? ? ? 它們的參數類型為struct ashmem_pin,它也是定義在kernel/common/include/linux/ashmem.h文件中:

    [cpp] view plaincopy
  • struct?ashmem_pin?{??
  • ????__u32?offset;???/*?offset?into?region,?in?bytes,?page-aligned?*/??
  • ????__u32?len;??/*?length?forward?from?offset,?in?bytes,?page-aligned?*/??
  • };??
  • ?? ? ? 這個結構體只有兩個域,分別表示要鎖定或者要解鎖的內塊塊的起始大小以及大小。

    ?? ? ? 在分析這兩個操作之前,我們先來看一下Ashmem驅動程序中的一個數據結構struct ashmem_range,這個數據結構就是用來表示某一塊被解鎖(unpinnd)的內存:

    [cpp] view plaincopy
  • /*?
  • ?*?ashmem_range?-?represents?an?interval?of?unpinned?(evictable)?pages?
  • ?*?Lifecycle:?From?unpin?to?pin?
  • ?*?Locking:?Protected?by?`ashmem_mutex'?
  • ?*/??
  • struct?ashmem_range?{??
  • ????struct?list_head?lru;???????/*?entry?in?LRU?list?*/??
  • ????struct?list_head?unpinned;??/*?entry?in?its?area's?unpinned?list?*/??
  • ????struct?ashmem_area?*asma;???/*?associated?area?*/??
  • ????size_t?pgstart;?????????/*?starting?page,?inclusive?*/??
  • ????size_t?pgend;???????????/*?ending?page,?inclusive?*/??
  • ????unsigned?int?purged;????????/*?ASHMEM_NOT?or?ASHMEM_WAS_PURGED?*/??
  • };??
  • ?? ? ? ?域asma表示這塊被解鎖的內存所屬于的匿名共享內存,它通過域unpinned連接在asma->unpinned_list表示的列表中;域 pgstart和paend表示這個內存塊的開始和結束頁面號,它們表示一個前后閉合的區間;域purged表示這個內存塊占用的物理內存是否已經被回 收;這塊被解鎖的內存塊除了保存在它所屬的匿名共享內存asma的解鎖列表unpinned_list之外,還通過域lru保存在一個全局的最近最少使用 列表ashmem_lru_list列表中,它的定義如下:

    [cpp] view plaincopy
  • /*?LRU?list?of?unpinned?pages,?protected?by?ashmem_mutex?*/??
  • static?LIST_HEAD(ashmem_lru_list);??
  • ?? ? ? ?了解了這個數據結構之后,我們就可以來看ashmem_ioctl函數中關于ASHMEM_PIN和ASHMEM_UNPIN的操作了:

    [cpp] view plaincopy
  • static?long?ashmem_ioctl(struct?file?*file,?unsigned?int?cmd,?unsigned?long?arg)??
  • {??
  • ????struct?ashmem_area?*asma?=?file->private_data;??
  • ????long?ret?=?-ENOTTY;??
  • ??
  • ????switch?(cmd)?{??
  • ????......??
  • ????case?ASHMEM_PIN:??
  • ????case?ASHMEM_UNPIN:??
  • ????????ret?=?ashmem_pin_unpin(asma,?cmd,?(void?__user?*)?arg);??
  • ????????break;??
  • ????......??
  • ????}??
  • ??
  • ????return?ret;??
  • }??
  • ?? ? ? ?它們都是通過ashmem_pin_unpin來進一步處理:

    [cpp] view plaincopy
  • static?int?ashmem_pin_unpin(struct?ashmem_area?*asma,?unsigned?long?cmd,??
  • ????????????????void?__user?*p)??
  • {??
  • ????struct?ashmem_pin?pin;??
  • ????size_t?pgstart,?pgend;??
  • ????int?ret?=?-EINVAL;??
  • ??
  • ????if?(unlikely(!asma->file))??
  • ????????return?-EINVAL;??
  • ??
  • ????if?(unlikely(copy_from_user(&pin,?p,?sizeof(pin))))??
  • ????????return?-EFAULT;??
  • ??
  • ????/*?per?custom,?you?can?pass?zero?for?len?to?mean?"everything?onward"?*/??
  • ????if?(!pin.len)??
  • ????????pin.len?=?PAGE_ALIGN(asma->size)?-?pin.offset;??
  • ??
  • ????if?(unlikely((pin.offset?|?pin.len)?&?~PAGE_MASK))??
  • ????????return?-EINVAL;??
  • ??
  • ????if?(unlikely(((__u32)?-1)?-?pin.offset?<?pin.len))??
  • ????????return?-EINVAL;??
  • ??
  • ????if?(unlikely(PAGE_ALIGN(asma->size)?<?pin.offset?+?pin.len))??
  • ????????return?-EINVAL;??
  • ??
  • ????pgstart?=?pin.offset?/?PAGE_SIZE;??
  • ????pgend?=?pgstart?+?(pin.len?/?PAGE_SIZE)?-?1;??
  • ??
  • ????mutex_lock(&ashmem_mutex);??
  • ??
  • ????switch?(cmd)?{??
  • ????case?ASHMEM_PIN:??
  • ????????ret?=?ashmem_pin(asma,?pgstart,?pgend);??
  • ????????break;??
  • ????case?ASHMEM_UNPIN:??
  • ????????ret?=?ashmem_unpin(asma,?pgstart,?pgend);??
  • ????????break;??
  • ????......??
  • ????}??
  • ??
  • ????mutex_unlock(&ashmem_mutex);??
  • ??
  • ????return?ret;??
  • }??
  • ?? ? ? ?首先是獲得用戶空間傳進來的參數,并保存在本地變量pin中,這是一個struct ashmem_pin類型的變量,這個結構體我們在前面已經見過了,它包括了要pin/unpin的內存塊的起始地址和大小,這里的起始地址和大小都是以 字節為單位的,因此,通過轉換把它們換成以頁面為單位的,并且保存在本地變量pgstart和pgend中。這里除了要對參數作一個安全性檢查外,還要一 個處理邏輯是,如果從用戶空間傳進來的內塊塊的大小值為0 ,則認為是要pin/unpin整個匿名共享內存。

    ?? ? ? ?函數最后根據當前要執行的是ASHMEM_PIN操作還是ASHMEM_UNPIN操作來分別執行ashmem_pin和ashmem_unpin來進 一步處理。創建匿名共享內存時,默認所有的內存都是pinned狀態的,只有用戶告訴Ashmem驅動程序要unpin某一塊內存時,Ashmem驅動程 序才會把這塊內存unpin,之后,用戶可以再告訴Ashmem驅動程序要重新pin某一塊之前被unpin過的內塊,從而把這塊內存從unpinned 狀態改為pinned狀態,也就是說,執行ASHMEM_PIN操作時,目標對象必須是一塊當前處于unpinned狀態的內存塊。

    ?? ? ? 我們先來看一下ASHMEM_UNPIN操作,進入到ashmem_unpin函數:

    [cpp] view plaincopy
  • /*?
  • ?*?ashmem_unpin?-?unpin?the?given?range?of?pages.?Returns?zero?on?success.?
  • ?*?
  • ?*?Caller?must?hold?ashmem_mutex.?
  • ?*/??
  • static?int?ashmem_unpin(struct?ashmem_area?*asma,?size_t?pgstart,?size_t?pgend)??
  • {??
  • ????struct?ashmem_range?*range,?*next;??
  • ????unsigned?int?purged?=?ASHMEM_NOT_PURGED;??
  • ??
  • restart:??
  • ????list_for_each_entry_safe(range,?next,?&asma->unpinned_list,?unpinned)?{??
  • ????????/*?short?circuit:?this?is?our?insertion?point?*/??
  • ????????if?(range_before_page(range,?pgstart))??
  • ????????????break;??
  • ??
  • ????????/*?
  • ?????????*?The?user?can?ask?us?to?unpin?pages?that?are?already?entirely?
  • ?????????*?or?partially?pinned.?We?handle?those?two?cases?here.?
  • ?????????*/??
  • ????????if?(page_range_subsumed_by_range(range,?pgstart,?pgend))??
  • ????????????return?0;??
  • ????????if?(page_range_in_range(range,?pgstart,?pgend))?{??
  • ????????????pgstart?=?min_t(size_t,?range->pgstart,?pgstart),??
  • ????????????pgend?=?max_t(size_t,?range->pgend,?pgend);??
  • ????????????purged?|=?range->purged;??
  • ????????????range_del(range);??
  • ????????????goto?restart;??
  • ????????}??
  • ????}??
  • ??
  • ????return?range_alloc(asma,?range,?purged,?pgstart,?pgend);??
  • }??
  • ?? ? ? ?這個函數的主體就是在遍歷asma->unpinned_list列表,從中查找當前處于unpinned狀態的內存塊是否與將要unpin的內 存塊[pgstart, pgend]是否相交,如果相交,則要執行合并操作,即調整pgstart和pgend的大小,然后通過調用range_del函數刪掉原來的已經被 unpinned過的內存塊,最后再通過range_alloc函數來重新unpinned這塊調整過后的內存塊[pgstart, pgend],這里新的內存塊[pgstart, pgend]已經包含了剛才所有被刪掉的unpinned狀態的內存。注意,這里如果找到一塊相并的內存塊,并且調整了pgstart和pgend的大小 之后,要重新再掃描一遍asma->unpinned_list列表,因為新的內存塊[pgstart, pgend]可能還會與前后的處于unpinned狀態的內存塊發生相交。

    ?? ? ? ?我們來看一下range_before_page的操作,這是一個宏定義:

    [cpp] view plaincopy
  • #define?range_before_page(range,?page)?\??
  • ??((range)->pgend?<?(page))??
  • ?? ? ? ?表示range描述的內存塊是否在page頁面之前,如果是,則整個描述就結束了。從這里我們可以看出asma->unpinned_list列表是按照頁面號從大到小進行排列的,并且每一塊被unpin的內存都是不相交的。

    ?? ? ? ?再來看一下page_range_subsumed_by_range的操作,這也是一個宏定義:

    [cpp] view plaincopy
  • #define?page_range_subsumed_by_range(range,?start,?end)?\??
  • ??(((range)->pgstart?<=?(start))?&&?((range)->pgend?>=?(end)))??
  • ?? ? ? 表示range描述的內存塊是不是包含了[start, end]這個內存塊,如果包含了,則說明當前要unpin的內存塊已經處于unpinned狀態,什么也不用操作,直接返回即可。

    ?? ? ? 再看page_range_in_range的操作,它也是一個宏定義:

    [cpp] view plaincopy
  • #define?page_range_in_range(range,?start,?end)?\??
  • ??(page_in_range(range,?start)?||?page_in_range(range,?end)?||?\??
  • ???page_range_subsumes_range(range,?start,?end))??
  • ?? ? ?它用到的其它兩個宏分別定義為:

    [cpp] view plaincopy
  • #define?page_range_subsumed_by_range(range,?start,?end)?\??
  • ??(((range)->pgstart?<=?(start))?&&?((range)->pgend?>=?(end)))??
  • ??
  • #define?page_in_range(range,?page)?\??
  • ?(((range)->pgstart?<=?(page))?&&?((range)->pgend?>=?(page)))??
  • ?? ? ?它們都是用來判斷兩個內存區間是否相交的。

    ?? ? ?兩個內存塊相交分為四種情況:

    ?? ? ?|-------range-----|? ? ? ? |-------range------|?? ? ? |--------range---------|? ? ? ? ? ? ? ? ?|----range---|

    ?? ? ? |-start----end-| ? ? ? |-start-----end-| ?? ? ? ? ? ? ? ? ? ? ? |-start-------end-| ? ? ? ?|-start-----------end-|
    ?? ? ? ? ? ? ? ? (1) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(2) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(3) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(4)
    ?? ? ?第一種情況,前面已經討論過了,對于第二到第四種情況,都是需要執行合并操作的。

    ?? ? ?再來看從asma->unpinned_list中刪掉內存塊的range_del函數:

    [cpp] view plaincopy
  • static?void?range_del(struct?ashmem_range?*range)??
  • {??
  • ????list_del(&range->unpinned);??
  • ????if?(range_on_lru(range))??
  • ????????lru_del(range);??
  • ????kmem_cache_free(ashmem_range_cachep,?range);??
  • }??
  • ?? ? ?這個函數首先把range從相應的unpinned_list列表中刪除,然后判斷它是否在lru列表中:

    [cpp] view plaincopy
  • #define?range_on_lru(range)?\??
  • ??((range)->purged?==?ASHMEM_NOT_PURGED)??
  • ?? ? ?如果它的狀態purged等于ASHMEM_NOT_PURGED,即對應的物理頁面尚未被回收,它就位于lru列表中,通過調用lru_del函數進行刪除:

    [cpp] view plaincopy
  • static?inline?void?lru_del(struct?ashmem_range?*range)??
  • {??
  • ????list_del(&range->lru);??
  • ????lru_count?-=?range_size(range);??
  • }??
  • ?? ? ? 最后調用kmem_cache_free將它從slab緩沖區ashmem_range_cachep中釋放。

    ?? ? ? 這里的slab緩沖區ashmem_range_cachep定義如下:

    [cpp] view plaincopy
  • static?struct?kmem_cache?*ashmem_range_cachep?__read_mostly;??
  • ?? ? ? 它和前面介紹的slab緩沖區ashmem_area_cachep一樣,是在Ashmem驅動程序模塊初始化函數ashmem_init進行初始化的:

    [cpp] view plaincopy
  • static?int?__init?ashmem_init(void)??
  • {??
  • ????int?ret;??
  • ??
  • ????......??
  • ??
  • ????ashmem_range_cachep?=?kmem_cache_create("ashmem_range_cache",??
  • ????????sizeof(struct?ashmem_range),??
  • ????????0,?0,?NULL);??
  • ????if?(unlikely(!ashmem_range_cachep))?{??
  • ????????printk(KERN_ERR?"ashmem:?failed?to?create?slab?cache\n");??
  • ????????return?-ENOMEM;??
  • ????}??
  • ??
  • ????......??
  • ??
  • ????printk(KERN_INFO?"ashmem:?initialized\n");??
  • ??
  • ????return?0;??
  • }??
  • ?? ? ? 回到ashmem_unpin函數中,我們再來看看range_alloc函數的實現:

    [cpp] view plaincopy
  • /*?
  • ?*?range_alloc?-?allocate?and?initialize?a?new?ashmem_range?structure?
  • ?*?
  • ?*?'asma'?-?associated?ashmem_area?
  • ?*?'prev_range'?-?the?previous?ashmem_range?in?the?sorted?asma->unpinned?list?
  • ?*?'purged'?-?initial?purge?value?(ASMEM_NOT_PURGED?or?ASHMEM_WAS_PURGED)?
  • ?*?'start'?-?starting?page,?inclusive?
  • ?*?'end'?-?ending?page,?inclusive?
  • ?*?
  • ?*?Caller?must?hold?ashmem_mutex.?
  • ?*/??
  • static?int?range_alloc(struct?ashmem_area?*asma,??
  • ???????????????struct?ashmem_range?*prev_range,?unsigned?int?purged,??
  • ???????????????size_t?start,?size_t?end)??
  • {??
  • ????struct?ashmem_range?*range;??
  • ??
  • ????range?=?kmem_cache_zalloc(ashmem_range_cachep,?GFP_KERNEL);??
  • ????if?(unlikely(!range))??
  • ????????return?-ENOMEM;??
  • ??
  • ????range->asma?=?asma;??
  • ????range->pgstart?=?start;??
  • ????range->pgend?=?end;??
  • ????range->purged?=?purged;??
  • ??
  • ????list_add_tail(&range->unpinned,?&prev_range->unpinned);??
  • ??
  • ????if?(range_on_lru(range))??
  • ????????lru_add(range);??
  • ??
  • ????return?0;??
  • }??
  • ?? ? ? 這個函數的作用是從slab 緩沖區中ashmem_range_cachep分配一個ashmem_range,然后對它作相應的初始化,放在相應的 ashmem_area->unpinned_list列表中,并且還要判斷這個range的purged是否是 ASHMEM_NOT_PURGED狀態,如果是,還要把它放在lru列表中:

    [cpp] view plaincopy
  • static?inline?void?lru_add(struct?ashmem_range?*range)??
  • {??
  • ????list_add_tail(&range->lru,?&ashmem_lru_list);??
  • ????lru_count?+=?range_size(range);??
  • }??
  • ?? ? ? 這樣,ashmem_unpin的源代碼我們就分析完了。

    ?? ? ? 接著,我們再來看一下ASHMEM_PIN操作,進入到ashmem_pin函數:

    [cpp] view plaincopy
  • /*?
  • ?*?ashmem_pin?-?pin?the?given?ashmem?region,?returning?whether?it?was?
  • ?*?previously?purged?(ASHMEM_WAS_PURGED)?or?not?(ASHMEM_NOT_PURGED).?
  • ?*?
  • ?*?Caller?must?hold?ashmem_mutex.?
  • ?*/??
  • static?int?ashmem_pin(struct?ashmem_area?*asma,?size_t?pgstart,?size_t?pgend)??
  • {??
  • ????struct?ashmem_range?*range,?*next;??
  • ????int?ret?=?ASHMEM_NOT_PURGED;??
  • ??
  • ????list_for_each_entry_safe(range,?next,?&asma->unpinned_list,?unpinned)?{??
  • ????????/*?moved?past?last?applicable?page;?we?can?short?circuit?*/??
  • ????????if?(range_before_page(range,?pgstart))??
  • ????????????break;??
  • ??
  • ????????/*?
  • ?????????*?The?user?can?ask?us?to?pin?pages?that?span?multiple?ranges,?
  • ?????????*?or?to?pin?pages?that?aren't?even?unpinned,?so?this?is?messy.?
  • ?????????*?
  • ?????????*?Four?cases:?
  • ?????????*?1.?The?requested?range?subsumes?an?existing?range,?so?we?
  • ?????????*????just?remove?the?entire?matching?range.?
  • ?????????*?2.?The?requested?range?overlaps?the?start?of?an?existing?
  • ?????????*????range,?so?we?just?update?that?range.?
  • ?????????*?3.?The?requested?range?overlaps?the?end?of?an?existing?
  • ?????????*????range,?so?we?just?update?that?range.?
  • ?????????*?4.?The?requested?range?punches?a?hole?in?an?existing?range,?
  • ?????????*????so?we?have?to?update?one?side?of?the?range?and?then?
  • ?????????*????create?a?new?range?for?the?other?side.?
  • ?????????*/??
  • ????????if?(page_range_in_range(range,?pgstart,?pgend))?{??
  • ????????????ret?|=?range->purged;??
  • ??
  • ????????????/*?Case?#1:?Easy.?Just?nuke?the?whole?thing.?*/??
  • ????????????if?(page_range_subsumes_range(range,?pgstart,?pgend))?{??
  • ????????????????range_del(range);??
  • ????????????????continue;??
  • ????????????}??
  • ??
  • ????????????/*?Case?#2:?We?overlap?from?the?start,?so?adjust?it?*/??
  • ????????????if?(range->pgstart?>=?pgstart)?{??
  • ????????????????range_shrink(range,?pgend?+?1,?range->pgend);??
  • ????????????????continue;??
  • ????????????}??
  • ??
  • ????????????/*?Case?#3:?We?overlap?from?the?rear,?so?adjust?it?*/??
  • ????????????if?(range->pgend?<=?pgend)?{??
  • ????????????????range_shrink(range,?range->pgstart,?pgstart-1);??
  • ????????????????continue;??
  • ????????????}??
  • ??
  • ????????????/*?
  • ?????????????*?Case?#4:?We?eat?a?chunk?out?of?the?middle.?A?bit?
  • ?????????????*?more?complicated,?we?allocate?a?new?range?for?the?
  • ?????????????*?second?half?and?adjust?the?first?chunk's?endpoint.?
  • ?????????????*/??
  • ????????????range_alloc(asma,?range,?range->purged,??
  • ????????????????????pgend?+?1,?range->pgend);??
  • ????????????range_shrink(range,?range->pgstart,?pgstart?-?1);??
  • ????????????break;??
  • ????????}??
  • ????}??
  • ??
  • ????return?ret;??
  • }??
  • ?? ? ? ?前面我們說過,被pin的內存塊,必須是在unpinned_list列表中的,如果不在,就什么都不用做。要判斷要pin的內存塊是否在 unpinned_list列表中,又要通過遍歷相應的asma->unpinned_list列表來找出與之相交的內存塊了。這個函數的處理方法 大體與前面的ashmem_unpin函數是一致的,也是要考慮四種不同的相交情況,這里就不詳述了,讀者可以自己分析一下。

    ?? ? ? ?這里我們只看一下range_shrink函數的實現:

    [cpp] view plaincopy
  • /*?
  • ?*?range_shrink?-?shrinks?a?range?
  • ?*?
  • ?*?Caller?must?hold?ashmem_mutex.?
  • ?*/??
  • static?inline?void?range_shrink(struct?ashmem_range?*range,??
  • ????????????????size_t?start,?size_t?end)??
  • {??
  • ????size_t?pre?=?range_size(range);??
  • ??
  • ????range->pgstart?=?start;??
  • ????range->pgend?=?end;??
  • ??
  • ????if?(range_on_lru(range))??
  • ????????lru_count?-=?pre?-?range_size(range);??
  • }??
  • ?? ? ? ?這個函數的實現很簡單,只是調整一下range描述的內存塊的起始頁面號,如果它是位于lru列表中,還要調整一下在lru列表中的總頁面數大小。

    ?? ? ? ?這樣,匿名共享內存的ASHMEM_PIN和ASHMEM_UNPIN操作就介紹完了,但是,我們還看不出來Ashmem驅動程序是怎么樣輔助內存管理 系統來有效管理內存的。有了前面這些unpinned的內存塊列表之后,下面我們就看一下Ashmem驅動程序是怎么樣輔助內存管理系統來有效管理內存 的。

    ?? ? ? ?首先看一下Ashmem驅動程序模塊初始化函數ashmem_init:

    [cpp] view plaincopy
  • static?struct?shrinker?ashmem_shrinker?=?{??
  • ????.shrink?=?ashmem_shrink,??
  • ????.seeks?=?DEFAULT_SEEKS?*?4,??
  • };??
  • ??
  • static?int?__init?ashmem_init(void)??
  • {??
  • ????int?ret;??
  • ??
  • ????......??
  • ??
  • ????register_shrinker(&ashmem_shrinker);??
  • ??
  • ????printk(KERN_INFO?"ashmem:?initialized\n");??
  • ??
  • ????return?0;??
  • }??
  • ?? ? ? ?這里通過調用register_shrinker函數向內存管理系統注冊一個內存回收算法函數。在Linux內核中,當系統內存緊張時,內存管理系統就 會進行內存回收算法,將一些最近沒有用過的內存換出物理內存去,這樣可以增加物理內存的供應。因此,當內存管理系統進行內存回收時,就會調用到這里的 ashmem_shrink函數,讓Ashmem驅動程序執行內存回收操作:

    [cpp] view plaincopy
  • /*?
  • ?*?ashmem_shrink?-?our?cache?shrinker,?called?from?mm/vmscan.c?::?shrink_slab?
  • ?*?
  • ?*?'nr_to_scan'?is?the?number?of?objects?(pages)?to?prune,?or?0?to?query?how?
  • ?*?many?objects?(pages)?we?have?in?total.?
  • ?*?
  • ?*?'gfp_mask'?is?the?mask?of?the?allocation?that?got?us?into?this?mess.?
  • ?*?
  • ?*?Return?value?is?the?number?of?objects?(pages)?remaining,?or?-1?if?we?cannot?
  • ?*?proceed?without?risk?of?deadlock?(due?to?gfp_mask).?
  • ?*?
  • ?*?We?approximate?LRU?via?least-recently-unpinned,?jettisoning?unpinned?partial?
  • ?*?chunks?of?ashmem?regions?LRU-wise?one-at-a-time?until?we?hit?'nr_to_scan'?
  • ?*?pages?freed.?
  • ?*/??
  • static?int?ashmem_shrink(int?nr_to_scan,?gfp_t?gfp_mask)??
  • {??
  • ????struct?ashmem_range?*range,?*next;??
  • ??
  • ????/*?We?might?recurse?into?filesystem?code,?so?bail?out?if?necessary?*/??
  • ????if?(nr_to_scan?&&?!(gfp_mask?&?__GFP_FS))??
  • ????????return?-1;??
  • ????if?(!nr_to_scan)??
  • ????????return?lru_count;??
  • ??
  • ????mutex_lock(&ashmem_mutex);??
  • ????list_for_each_entry_safe(range,?next,?&ashmem_lru_list,?lru)?{??
  • ????????struct?inode?*inode?=?range->asma->file->f_dentry->d_inode;??
  • ????????loff_t?start?=?range->pgstart?*?PAGE_SIZE;??
  • ????????loff_t?end?=?(range->pgend?+?1)?*?PAGE_SIZE?-?1;??
  • ??
  • ????????vmtruncate_range(inode,?start,?end);??
  • ????????range->purged?=?ASHMEM_WAS_PURGED;??
  • ????????lru_del(range);??
  • ??
  • ????????nr_to_scan?-=?range_size(range);??
  • ????????if?(nr_to_scan?<=?0)??
  • ????????????break;??
  • ????}??
  • ????mutex_unlock(&ashmem_mutex);??
  • ??
  • ????return?lru_count;??
  • }??
  • ?? ? ? ?這里的參數nr_to_scan表示要掃描的頁數,如果是0,則表示要查詢一下,當前Ashmem驅動程序有多少頁面可以回收,這里就等于掛在lru列 表的內塊頁面的總數了,即lru_count;否則,就要開始掃描lru列表,從中回收內存了,直到回收的內存頁數等于nr_to_scan,或者已經沒 有內存可回收為止。回收內存頁面是通過vm_truncate_range函數進行的,這個函數定義在kernel/common/mm /memory.c文件中,它是Linux內核內存管理系統實現的,有興趣的讀者可以研究一下。

    ?? ? ? ?這樣,Android系統匿名共享內存Ashmem驅動程序源代碼就分析完了,在下一篇文章中,我們將繼續分析Android系統的匿名共享內存機制,研究它是如何通過Binder進程間通信機制實現在不同進程程進行內存共享的,敬請關注。

    老羅的新浪微博:http://weibo.com/shengyangluo,歡迎關注!

    轉載于:https://www.cnblogs.com/Free-Thinker/p/4142112.html

    總結

    以上是生活随笔為你收集整理的Android系统匿名共享内存Ashmem(Anonymous Shared Memory)驱动程序源代码分析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    狠狠噜狠狠狠狠丁香五月 | 国产超级va在线观看视频 | 久久精品女人的天堂av | 又色又爽又黄的美女裸体网站 | 骚片av蜜桃精品一区 | 国产熟妇另类久久久久 | 无码人妻av免费一区二区三区 | 人人妻人人澡人人爽欧美一区九九 | 99麻豆久久久国产精品免费 | 狠狠亚洲超碰狼人久久 | 亚洲人成网站在线播放942 | 人妻尝试又大又粗久久 | 亚洲欧美日韩国产精品一区二区 | 永久免费精品精品永久-夜色 | 红桃av一区二区三区在线无码av | 国产免费久久精品国产传媒 | 黑人玩弄人妻中文在线 | 国产精品va在线观看无码 | 伊人久久大香线焦av综合影院 | 搡女人真爽免费视频大全 | 帮老师解开蕾丝奶罩吸乳网站 | 国产精品18久久久久久麻辣 | 特黄特色大片免费播放器图片 | 国产欧美熟妇另类久久久 | 日本www一道久久久免费榴莲 | 精品国产av色一区二区深夜久久 | 四虎国产精品一区二区 | 国产成人综合美国十次 | 蜜桃av抽搐高潮一区二区 | 亚洲精品一区国产 | 久久精品女人天堂av免费观看 | 日本高清一区免费中文视频 | 久久亚洲日韩精品一区二区三区 | 欧洲熟妇精品视频 | 小鲜肉自慰网站xnxx | 玩弄人妻少妇500系列视频 | 国产精品久久久av久久久 | 人人澡人摸人人添 | 亚洲国产欧美国产综合一区 | 97夜夜澡人人爽人人喊中国片 | 无码人中文字幕 | 天天躁日日躁狠狠躁免费麻豆 | 日韩精品成人一区二区三区 | 午夜福利一区二区三区在线观看 | 午夜男女很黄的视频 | 欧美野外疯狂做受xxxx高潮 | 中文精品无码中文字幕无码专区 | 精品无码国产自产拍在线观看蜜 | 欧美亚洲日韩国产人成在线播放 | 国产成人精品视频ⅴa片软件竹菊 | 国产欧美亚洲精品a | 国产成人精品视频ⅴa片软件竹菊 | 色综合久久88色综合天天 | 国产午夜无码精品免费看 | 真人与拘做受免费视频一 | 成人无码视频在线观看网站 | 国产精品久久久久久久影院 | 亚洲欧洲日本无在线码 | 日本一卡2卡3卡四卡精品网站 | 一本久道久久综合婷婷五月 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 西西人体www44rt大胆高清 | 亚洲天堂2017无码 | 亚洲人成网站免费播放 | 久热国产vs视频在线观看 | 国产精品无码一区二区三区不卡 | 亚洲色www成人永久网址 | 国产成人综合色在线观看网站 | 无码中文字幕色专区 | 亚洲熟妇自偷自拍另类 | 狂野欧美性猛交免费视频 | 欧洲精品码一区二区三区免费看 | 国产亚洲精品久久久闺蜜 | 国产亚洲视频中文字幕97精品 | 日韩少妇内射免费播放 | 大胆欧美熟妇xx | 亚洲日本一区二区三区在线 | 一本久久a久久精品亚洲 | 少妇愉情理伦片bd | 亚洲精品国产品国语在线观看 | 老熟女重囗味hdxx69 | 性欧美牲交在线视频 | 午夜免费福利小电影 | a片免费视频在线观看 | 一本久久伊人热热精品中文字幕 | 中文字幕无码日韩欧毛 | 亚洲成av人片在线观看无码不卡 | 女人色极品影院 | 国产欧美精品一区二区三区 | 欧美日韩亚洲国产精品 | 性生交大片免费看女人按摩摩 | 乱中年女人伦av三区 | 日本熟妇人妻xxxxx人hd | 无遮挡啪啪摇乳动态图 | 午夜福利试看120秒体验区 | 天堂亚洲2017在线观看 | 国产成人无码午夜视频在线观看 | 人人妻人人澡人人爽精品欧美 | 欧美三级a做爰在线观看 | 精品一区二区三区波多野结衣 | 成人av无码一区二区三区 | 无码任你躁久久久久久久 | 欧美 日韩 人妻 高清 中文 | 成人性做爰aaa片免费看 | 色老头在线一区二区三区 | 熟妇激情内射com | 亚洲精品www久久久 | 97无码免费人妻超级碰碰夜夜 | 亚洲区欧美区综合区自拍区 | 国产精品办公室沙发 | 国产明星裸体无码xxxx视频 | 亚洲狠狠色丁香婷婷综合 | 国产成人综合色在线观看网站 | 乱码午夜-极国产极内射 | 亚洲无人区午夜福利码高清完整版 | 熟妇人妻无码xxx视频 | 亚洲日本一区二区三区在线 | 亚洲国产一区二区三区在线观看 | 亚洲 a v无 码免 费 成 人 a v | 亚洲精品国产精品乱码视色 | 一本大道伊人av久久综合 | 男女爱爱好爽视频免费看 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 精品少妇爆乳无码av无码专区 | 成人精品天堂一区二区三区 | 丰满护士巨好爽好大乳 | 亚洲精品一区三区三区在线观看 | 午夜福利电影 | 国产农村乱对白刺激视频 | 国产一区二区三区四区五区加勒比 | 亚洲理论电影在线观看 | 乱中年女人伦av三区 | 国产一区二区三区四区五区加勒比 | 亚洲一区二区三区播放 | 中文字幕无码免费久久99 | 欧美国产日产一区二区 | 亚洲男人av香蕉爽爽爽爽 | 人人澡人摸人人添 | 一二三四社区在线中文视频 | 中文字幕无码热在线视频 | 亚洲精品久久久久avwww潮水 | av无码电影一区二区三区 | 国产在线一区二区三区四区五区 | 亚洲无人区午夜福利码高清完整版 | 成人性做爰aaa片免费看 | 免费人成网站视频在线观看 | 无码免费一区二区三区 | 东京一本一道一二三区 | 麻豆成人精品国产免费 | 国产人妻人伦精品 | 国产国产精品人在线视 | 国产色xx群视频射精 | aⅴ在线视频男人的天堂 | 欧美性生交活xxxxxdddd | 夫妻免费无码v看片 | 中文字幕精品av一区二区五区 | 欧美性黑人极品hd | 国产免费久久久久久无码 | 欧美日韩在线亚洲综合国产人 | 欧美乱妇无乱码大黄a片 | 欧美黑人巨大xxxxx | 俄罗斯老熟妇色xxxx | 四虎国产精品一区二区 | 帮老师解开蕾丝奶罩吸乳网站 | 天干天干啦夜天干天2017 | 日日噜噜噜噜夜夜爽亚洲精品 | 久久人人97超碰a片精品 | 久久午夜无码鲁丝片午夜精品 | 高潮毛片无遮挡高清免费视频 | 国产亚洲精品精品国产亚洲综合 | 4hu四虎永久在线观看 | 亚洲日本va中文字幕 | 欧美人与善在线com | 亚洲欧洲无卡二区视頻 | 日韩人妻无码中文字幕视频 | 国产精品怡红院永久免费 | 精品久久久久香蕉网 | 在线看片无码永久免费视频 | 国产人妖乱国产精品人妖 | 亚洲の无码国产の无码步美 | 精品久久久无码中文字幕 | 图片区 小说区 区 亚洲五月 | 国产无遮挡又黄又爽又色 | 黑人巨大精品欧美黑寡妇 | 国产明星裸体无码xxxx视频 | 亚洲自偷自偷在线制服 | 亚洲大尺度无码无码专区 | 特黄特色大片免费播放器图片 | 国产精品嫩草久久久久 | 欧美黑人乱大交 | 午夜精品久久久久久久 | 国产真实伦对白全集 | 天天做天天爱天天爽综合网 | 曰韩无码二三区中文字幕 | 狠狠cao日日穞夜夜穞av | 伊人久久大香线蕉亚洲 | 国产成人无码av在线影院 | 我要看www免费看插插视频 | 国产av剧情md精品麻豆 | 精品一区二区三区无码免费视频 | 欧美日韩亚洲国产精品 | 色婷婷香蕉在线一区二区 | 狠狠色色综合网站 | 全黄性性激高免费视频 | 男女超爽视频免费播放 | 人人妻人人澡人人爽欧美一区九九 | 国产精品va在线观看无码 | 亚洲国产精品美女久久久久 | 青春草在线视频免费观看 | 欧美日韩一区二区综合 | 国产内射爽爽大片视频社区在线 | 久久国产36精品色熟妇 | 人妻无码久久精品人妻 | 亚洲国产精品一区二区美利坚 | 欧美丰满熟妇xxxx | 99久久久国产精品无码免费 | 99久久99久久免费精品蜜桃 | 国产亚洲精品久久久闺蜜 | 亚洲色欲久久久综合网东京热 | 中文无码成人免费视频在线观看 | 人人妻人人澡人人爽精品欧美 | 国产电影无码午夜在线播放 | 欧美zoozzooz性欧美 | 午夜精品一区二区三区的区别 | 少妇太爽了在线观看 | 色窝窝无码一区二区三区色欲 | 国产免费久久精品国产传媒 | 人人妻人人澡人人爽欧美一区 | 377p欧洲日本亚洲大胆 | 黑人粗大猛烈进出高潮视频 | 国产精品亚洲一区二区三区喷水 | 国产农村乱对白刺激视频 | 亚洲精品国偷拍自产在线观看蜜桃 | 亚洲理论电影在线观看 | 国产熟妇另类久久久久 | 亚洲综合在线一区二区三区 | 久久久久久九九精品久 | 国产成人无码专区 | 给我免费的视频在线观看 | 超碰97人人做人人爱少妇 | 伊人久久大香线蕉av一区二区 | 久久久婷婷五月亚洲97号色 | 亚洲 激情 小说 另类 欧美 | 人人妻人人澡人人爽欧美精品 | 天天摸天天透天天添 | 荡女精品导航 | 欧美35页视频在线观看 | 国产av无码专区亚洲awww | 久久人人爽人人爽人人片av高清 | 亚洲一区二区三区香蕉 | 国产成人一区二区三区别 | 野狼第一精品社区 | 日韩无套无码精品 | 永久免费观看美女裸体的网站 | 久久精品视频在线看15 | 国产极品美女高潮无套在线观看 | 野外少妇愉情中文字幕 | 国产成人无码av一区二区 | 日本精品久久久久中文字幕 | 人妻有码中文字幕在线 | 国产精品亚洲五月天高清 | 精品少妇爆乳无码av无码专区 | 久久zyz资源站无码中文动漫 | 99久久精品午夜一区二区 | 欧美日本免费一区二区三区 | 老子影院午夜精品无码 | 少妇性l交大片欧洲热妇乱xxx | 中文字幕乱码人妻无码久久 | 国产在线精品一区二区三区直播 | аⅴ资源天堂资源库在线 | 午夜熟女插插xx免费视频 | 日本精品人妻无码免费大全 | 欧美性猛交xxxx富婆 | 欧美人与禽猛交狂配 | 国产精品人人妻人人爽 | 一二三四在线观看免费视频 | 性欧美大战久久久久久久 | 精品久久综合1区2区3区激情 | 久久午夜无码鲁丝片 | 性色欲网站人妻丰满中文久久不卡 | 国产精品久久久久久亚洲毛片 | 无码人妻av免费一区二区三区 | 无码午夜成人1000部免费视频 | 国产97色在线 | 免 | 少妇被粗大的猛进出69影院 | 亚洲综合无码久久精品综合 | 一本色道婷婷久久欧美 | 国内丰满熟女出轨videos | 午夜成人1000部免费视频 | 小鲜肉自慰网站xnxx | 在线看片无码永久免费视频 | 国产热a欧美热a在线视频 | 亚洲人成人无码网www国产 | 樱花草在线播放免费中文 | 国产一区二区三区影院 | 色 综合 欧美 亚洲 国产 | 亚洲乱码中文字幕在线 | 成人性做爰aaa片免费看 | 中文字幕无码视频专区 | 亚洲色偷偷偷综合网 | 老太婆性杂交欧美肥老太 | 亚洲热妇无码av在线播放 | 亚洲精品鲁一鲁一区二区三区 | 久久久精品国产sm最大网站 | 久久无码专区国产精品s | 国产成人精品一区二区在线小狼 | 久久aⅴ免费观看 | 亚洲高清偷拍一区二区三区 | 亚洲国产精品久久人人爱 | 成人三级无码视频在线观看 | 亚洲综合久久一区二区 | 美女黄网站人色视频免费国产 | 波多野结衣一区二区三区av免费 | 欧美 丝袜 自拍 制服 另类 | 狠狠色色综合网站 | 狠狠噜狠狠狠狠丁香五月 | 日日碰狠狠丁香久燥 | 97精品人妻一区二区三区香蕉 | 少妇高潮喷潮久久久影院 | 亚洲成av人综合在线观看 | 性啪啪chinese东北女人 | 性色欲情网站iwww九文堂 | 夜夜夜高潮夜夜爽夜夜爰爰 | 亚洲精品久久久久中文第一幕 | 天海翼激烈高潮到腰振不止 | 国产av剧情md精品麻豆 | 国产成人无码av片在线观看不卡 | 中文字幕无码av波多野吉衣 | 精品国产一区av天美传媒 | 999久久久国产精品消防器材 | 兔费看少妇性l交大片免费 | 水蜜桃亚洲一二三四在线 | 午夜精品一区二区三区在线观看 | 久久久无码中文字幕久... | 亚洲a无码综合a国产av中文 | 色综合久久久无码网中文 | 妺妺窝人体色www在线小说 | 久久久精品国产sm最大网站 | 国产疯狂伦交大片 | 国产精品久久久 | 国产人妻人伦精品 | 无套内谢的新婚少妇国语播放 | 少妇邻居内射在线 | 色五月五月丁香亚洲综合网 | 亚洲乱亚洲乱妇50p | 四虎4hu永久免费 | 欧美激情内射喷水高潮 | 爆乳一区二区三区无码 | 亚洲日韩一区二区 | 中文字幕无码av波多野吉衣 | 无码福利日韩神码福利片 | 蜜桃av抽搐高潮一区二区 | 精品无码一区二区三区爱欲 | 88国产精品欧美一区二区三区 | 国产精品丝袜黑色高跟鞋 | 国产乱人偷精品人妻a片 | 无码人妻av免费一区二区三区 | 色综合久久88色综合天天 | 丰满人妻精品国产99aⅴ | 久久精品人妻少妇一区二区三区 | 99久久精品国产一区二区蜜芽 | 国产亚洲精品久久久久久久久动漫 | 亚洲国产日韩a在线播放 | 人妻有码中文字幕在线 | 亚洲精品综合一区二区三区在线 | 国产精品久久久久久亚洲影视内衣 | 成人一区二区免费视频 | 激情综合激情五月俺也去 | 无码精品人妻一区二区三区av | 爽爽影院免费观看 | 日本肉体xxxx裸交 | 日本护士毛茸茸高潮 | 亚无码乱人伦一区二区 | 国产免费久久精品国产传媒 | 成人亚洲精品久久久久 | 欧美成人午夜精品久久久 | 午夜熟女插插xx免费视频 | 一二三四在线观看免费视频 | 性做久久久久久久免费看 | 伊人久久大香线焦av综合影院 | 国产精品久久久午夜夜伦鲁鲁 | 国产精品毛片一区二区 | 国产人妻精品午夜福利免费 | 狠狠色丁香久久婷婷综合五月 | 欧美人与动性行为视频 | 丁香花在线影院观看在线播放 | 亚洲精品中文字幕乱码 | 天堂久久天堂av色综合 | 清纯唯美经典一区二区 | 曰韩无码二三区中文字幕 | 天堂无码人妻精品一区二区三区 | 东京热一精品无码av | 人妻少妇被猛烈进入中文字幕 | 日产国产精品亚洲系列 | 天下第一社区视频www日本 | 无码毛片视频一区二区本码 | 久久久www成人免费毛片 | 色一情一乱一伦一视频免费看 | 成 人 免费观看网站 | 久久亚洲中文字幕无码 | 狠狠色欧美亚洲狠狠色www | 亚洲综合精品香蕉久久网 | 欧美老人巨大xxxx做受 | 亚洲男人av天堂午夜在 | 久久精品国产日本波多野结衣 | 日本熟妇大屁股人妻 | 又大又紧又粉嫩18p少妇 | 欧美日韩综合一区二区三区 | 日本乱人伦片中文三区 | 国产精品久久久久久亚洲影视内衣 | 红桃av一区二区三区在线无码av | 夜夜影院未满十八勿进 | 中文字幕+乱码+中文字幕一区 | 日本一区二区三区免费高清 | 99精品久久毛片a片 | 久久久久av无码免费网 | 理论片87福利理论电影 | 欧美人与物videos另类 | 精品一区二区三区波多野结衣 | 欧美性生交xxxxx久久久 | 欧美日本精品一区二区三区 | 国产9 9在线 | 中文 | 131美女爱做视频 | 国产人成高清在线视频99最全资源 | 四虎永久在线精品免费网址 | 最新国产乱人伦偷精品免费网站 | 中文精品无码中文字幕无码专区 | 国产乱人偷精品人妻a片 | 亚洲熟妇自偷自拍另类 | 亚洲国产综合无码一区 | 欧美真人作爱免费视频 | 自拍偷自拍亚洲精品被多人伦好爽 | 四虎国产精品一区二区 | 成人试看120秒体验区 | 国产两女互慰高潮视频在线观看 | 97久久精品无码一区二区 | 曰韩无码二三区中文字幕 | 女人被男人躁得好爽免费视频 | 三上悠亚人妻中文字幕在线 | 日本成熟视频免费视频 | 日韩人妻无码一区二区三区久久99 | 无码人妻出轨黑人中文字幕 | 全黄性性激高免费视频 | 久久国产36精品色熟妇 | 亚洲精品久久久久久一区二区 | 99麻豆久久久国产精品免费 | ass日本丰满熟妇pics | www国产亚洲精品久久网站 | 人妻人人添人妻人人爱 | 日韩精品无码免费一区二区三区 | 精品欧美一区二区三区久久久 | 无码人妻av免费一区二区三区 | 鲁鲁鲁爽爽爽在线视频观看 | 亚洲中文无码av永久不收费 | 55夜色66夜色国产精品视频 | 一本加勒比波多野结衣 | 国产亚洲美女精品久久久2020 | 一区二区三区乱码在线 | 欧洲 | 亚洲成av人在线观看网址 | 十八禁视频网站在线观看 | 在线 国产 欧美 亚洲 天堂 | 性开放的女人aaa片 | 久久熟妇人妻午夜寂寞影院 | 免费中文字幕日韩欧美 | 久热国产vs视频在线观看 | 中文字幕+乱码+中文字幕一区 | 亚洲精品一区二区三区大桥未久 | 精品无码一区二区三区的天堂 | 最新国产麻豆aⅴ精品无码 | 国产成人午夜福利在线播放 | 精品亚洲韩国一区二区三区 | 亚洲人亚洲人成电影网站色 | 国产av一区二区三区最新精品 | 2020久久香蕉国产线看观看 | 嫩b人妻精品一区二区三区 | 色综合久久久久综合一本到桃花网 | 18黄暴禁片在线观看 | 免费中文字幕日韩欧美 | 日韩欧美中文字幕公布 | 四虎国产精品免费久久 | 红桃av一区二区三区在线无码av | 国产精品无码永久免费888 | 午夜肉伦伦影院 | 女人被男人爽到呻吟的视频 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 国产后入清纯学生妹 | 露脸叫床粗话东北少妇 | 成熟妇人a片免费看网站 | 丰满妇女强制高潮18xxxx | 日韩视频 中文字幕 视频一区 | 亚洲乱亚洲乱妇50p | 国产亚av手机在线观看 | 亚洲精品一区二区三区在线 | 精品国产精品久久一区免费式 | 亚洲中文字幕无码中字 | 日日天日日夜日日摸 | 久久综合久久自在自线精品自 | av人摸人人人澡人人超碰下载 | 亚洲人成影院在线观看 | av人摸人人人澡人人超碰下载 | 久久伊人色av天堂九九小黄鸭 | 精品国产国产综合精品 | 国产人妖乱国产精品人妖 | 又紧又大又爽精品一区二区 | 真人与拘做受免费视频一 | 波多野结衣aⅴ在线 | 午夜精品久久久久久久 | 成 人 网 站国产免费观看 | 欧美日韩在线亚洲综合国产人 | 最新国产麻豆aⅴ精品无码 | 激情亚洲一区国产精品 | 国产精品香蕉在线观看 | 日日干夜夜干 | 帮老师解开蕾丝奶罩吸乳网站 | 欧美自拍另类欧美综合图片区 | 国产精品99爱免费视频 | 99久久久无码国产精品免费 | 免费观看黄网站 | 麻豆精产国品 | 亚洲精品国产第一综合99久久 | 国产三级精品三级男人的天堂 | 欧美丰满熟妇xxxx性ppx人交 | 成人女人看片免费视频放人 | 中文字幕乱码人妻二区三区 | 99久久精品国产一区二区蜜芽 | 久久久久久久久888 | 中文字幕无码av波多野吉衣 | 午夜嘿嘿嘿影院 | 午夜性刺激在线视频免费 | 狠狠综合久久久久综合网 | 国产成人综合在线女婷五月99播放 | 国产亚洲精品精品国产亚洲综合 | 欧美 丝袜 自拍 制服 另类 | 老太婆性杂交欧美肥老太 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 久热国产vs视频在线观看 | 国产在线精品一区二区高清不卡 | 狠狠躁日日躁夜夜躁2020 | 中文字幕无码av波多野吉衣 | 亚洲综合伊人久久大杳蕉 | 欧美精品在线观看 | 国产农村乱对白刺激视频 | 午夜福利电影 | 少妇被黑人到高潮喷出白浆 | 国产乱码精品一品二品 | 97久久超碰中文字幕 | 日韩精品a片一区二区三区妖精 | 精品一区二区不卡无码av | 免费看男女做好爽好硬视频 | 无码一区二区三区在线 | 色欲av亚洲一区无码少妇 | 国产精品va在线观看无码 | 无码精品国产va在线观看dvd | 亚洲色偷偷偷综合网 | 国产精品美女久久久久av爽李琼 | 国产香蕉尹人视频在线 | 偷窥日本少妇撒尿chinese | 精品无码一区二区三区爱欲 | 中文字幕无线码 | 亚洲中文字幕无码中字 | 给我免费的视频在线观看 | 亚洲中文字幕久久无码 | 久久国产精品精品国产色婷婷 | 国产精品理论片在线观看 | 精品国产乱码久久久久乱码 | 在线精品国产一区二区三区 | 久久亚洲a片com人成 | 国产精品国产自线拍免费软件 | 日本又色又爽又黄的a片18禁 | 中文字幕无线码免费人妻 | 在线视频网站www色 | 99精品国产综合久久久久五月天 | 久久97精品久久久久久久不卡 | 日韩精品一区二区av在线 | 国产精品美女久久久网av | 精品久久久久久亚洲精品 | 中文无码精品a∨在线观看不卡 | 国产人妻精品一区二区三区不卡 | 成人亚洲精品久久久久软件 | 中文字幕日产无线码一区 | 男女超爽视频免费播放 | 久久99精品久久久久久动态图 | 国产一区二区三区四区五区加勒比 | 成熟妇人a片免费看网站 | 日本乱人伦片中文三区 | 国产无av码在线观看 | 久久综合给合久久狠狠狠97色 | 人人妻人人澡人人爽欧美一区九九 | 日日麻批免费40分钟无码 | 极品嫩模高潮叫床 | av人摸人人人澡人人超碰下载 | 亚洲区欧美区综合区自拍区 | 免费观看的无遮挡av | 国产精品igao视频网 | 国产片av国语在线观看 | 55夜色66夜色国产精品视频 | 精品无码国产自产拍在线观看蜜 | 国产黑色丝袜在线播放 | 国产亚洲人成a在线v网站 | 久青草影院在线观看国产 | 久久www免费人成人片 | 色婷婷香蕉在线一区二区 | 人人妻人人澡人人爽欧美精品 | 一个人看的视频www在线 | 婷婷六月久久综合丁香 | 在线观看国产午夜福利片 | 奇米影视888欧美在线观看 | 骚片av蜜桃精品一区 | 成人综合网亚洲伊人 | 午夜精品一区二区三区的区别 | 亚洲人成网站在线播放942 | 日韩无码专区 | 国产亚洲精品久久久闺蜜 | 大乳丰满人妻中文字幕日本 | 国产精品国产自线拍免费软件 | 中文字幕 人妻熟女 | 中文字幕+乱码+中文字幕一区 | 国内精品九九久久久精品 | 精品厕所偷拍各类美女tp嘘嘘 | 玩弄人妻少妇500系列视频 | 亚洲中文字幕va福利 | 午夜福利试看120秒体验区 | 大色综合色综合网站 | 亚洲国精产品一二二线 | 欧洲熟妇精品视频 | 亚洲精品成人福利网站 | 成人欧美一区二区三区黑人 | 天天躁日日躁狠狠躁免费麻豆 | 天天综合网天天综合色 | 精品无码av一区二区三区 | 国产成人精品优优av | 免费国产黄网站在线观看 | 午夜性刺激在线视频免费 | 好男人社区资源 | 无遮挡国产高潮视频免费观看 | 老子影院午夜伦不卡 | 在线 国产 欧美 亚洲 天堂 | 亚洲精品国偷拍自产在线麻豆 | 久久久亚洲欧洲日产国码αv | 亚欧洲精品在线视频免费观看 | 亚洲乱码国产乱码精品精 | 一本久道久久综合狠狠爱 | 性生交大片免费看女人按摩摩 | 婷婷六月久久综合丁香 | 人妻无码αv中文字幕久久琪琪布 | 国产精品美女久久久 | 77777熟女视频在线观看 а天堂中文在线官网 | av小次郎收藏 | 久久午夜无码鲁丝片 | 伊人久久大香线蕉午夜 | 性生交大片免费看l | 高清不卡一区二区三区 | 无码一区二区三区在线观看 | 国产成人精品久久亚洲高清不卡 | 亚洲日韩精品欧美一区二区 | 国産精品久久久久久久 | 国产成人精品视频ⅴa片软件竹菊 | 女人被男人爽到呻吟的视频 | a片在线免费观看 | 亚洲精品一区二区三区在线 | 国产精品久久福利网站 | 久久精品无码一区二区三区 | 成人女人看片免费视频放人 | 亚洲狠狠色丁香婷婷综合 | 少妇一晚三次一区二区三区 | 国产成人无码午夜视频在线观看 | 十八禁真人啪啪免费网站 | 国产欧美亚洲精品a | 伊人久久大香线焦av综合影院 | 精品一二三区久久aaa片 | 国产亚洲欧美日韩亚洲中文色 | 亚洲va欧美va天堂v国产综合 | 欧美一区二区三区视频在线观看 | 一区二区传媒有限公司 | 欧美黑人性暴力猛交喷水 | 免费国产黄网站在线观看 | 久久久久se色偷偷亚洲精品av | 帮老师解开蕾丝奶罩吸乳网站 | 国产精品人人爽人人做我的可爱 | 亚洲乱亚洲乱妇50p | 亚洲精品国偷拍自产在线观看蜜桃 | 国产无av码在线观看 | 亚洲中文字幕久久无码 | 兔费看少妇性l交大片免费 | 国产艳妇av在线观看果冻传媒 | 亚洲日韩一区二区 | 成人女人看片免费视频放人 | 夜夜躁日日躁狠狠久久av | 成人无码精品一区二区三区 | 国产成人综合在线女婷五月99播放 | 人人妻人人澡人人爽欧美精品 | 丰满妇女强制高潮18xxxx | 色老头在线一区二区三区 | 欧美精品免费观看二区 | 在线观看免费人成视频 | a在线观看免费网站大全 | 色婷婷香蕉在线一区二区 | 中文字幕色婷婷在线视频 | 国产亚洲视频中文字幕97精品 | 免费男性肉肉影院 | 无码人妻久久一区二区三区不卡 | 国产免费无码一区二区视频 | 国产无遮挡又黄又爽免费视频 | 国产一区二区三区四区五区加勒比 | 亚洲呦女专区 | 少妇的肉体aa片免费 | 亚洲 另类 在线 欧美 制服 | 99精品视频在线观看免费 | 天堂一区人妻无码 | 激情五月综合色婷婷一区二区 | 欧美日韩色另类综合 | 欧美亚洲国产一区二区三区 | 成人免费视频一区二区 | 少妇高潮一区二区三区99 | 超碰97人人做人人爱少妇 | 精品人妻人人做人人爽 | 又紧又大又爽精品一区二区 | 日本饥渴人妻欲求不满 | 国产莉萝无码av在线播放 | 大乳丰满人妻中文字幕日本 | 无码午夜成人1000部免费视频 | a片免费视频在线观看 | 色一情一乱一伦一区二区三欧美 | 波多野结衣 黑人 | 麻豆av传媒蜜桃天美传媒 | 国产精品久久久久久久影院 | 学生妹亚洲一区二区 | 四十如虎的丰满熟妇啪啪 | 无码国内精品人妻少妇 | 国产凸凹视频一区二区 | 偷窥村妇洗澡毛毛多 | 成年女人永久免费看片 | 亚洲精品国产精品乱码不卡 | 久久精品女人的天堂av | 亚洲国产av精品一区二区蜜芽 | 国产无遮挡吃胸膜奶免费看 | 在线视频网站www色 | 嫩b人妻精品一区二区三区 | 999久久久国产精品消防器材 | 国产精品爱久久久久久久 | 欧美丰满熟妇xxxx | 99久久久无码国产aaa精品 | 欧美兽交xxxx×视频 | 国产亚洲精品久久久闺蜜 | 男女爱爱好爽视频免费看 | 国产人妻久久精品二区三区老狼 | 日日碰狠狠丁香久燥 | 无遮无挡爽爽免费视频 | 免费国产成人高清在线观看网站 | 日韩欧美成人免费观看 | 欧美熟妇另类久久久久久多毛 | 国产精品久久久久久久9999 | 亚洲一区二区三区播放 | 久久精品99久久香蕉国产色戒 | 国产精华av午夜在线观看 | 自拍偷自拍亚洲精品被多人伦好爽 | 国产午夜无码视频在线观看 | 又紧又大又爽精品一区二区 | 午夜理论片yy44880影院 | 性欧美videos高清精品 | 国产乱人伦偷精品视频 | 成年女人永久免费看片 | 综合网日日天干夜夜久久 | 人妻体内射精一区二区三四 | 强伦人妻一区二区三区视频18 | 国产亚洲欧美在线专区 | 色五月丁香五月综合五月 | 国产精品嫩草久久久久 | 高清无码午夜福利视频 | 久久无码专区国产精品s | 国产精品va在线播放 | 人人妻人人澡人人爽欧美一区 | 国产超碰人人爽人人做人人添 | 撕开奶罩揉吮奶头视频 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 中国大陆精品视频xxxx | 人人妻人人澡人人爽欧美一区九九 | 玩弄少妇高潮ⅹxxxyw | www国产精品内射老师 | 全球成人中文在线 | 色婷婷香蕉在线一区二区 | 中文字幕无码av激情不卡 | 久久久久久久久888 | 最近免费中文字幕中文高清百度 | 日本www一道久久久免费榴莲 | 蜜臀av无码人妻精品 | 麻豆蜜桃av蜜臀av色欲av | 狠狠色色综合网站 | 国产精品国产三级国产专播 | 偷窥村妇洗澡毛毛多 | 色窝窝无码一区二区三区色欲 | 久精品国产欧美亚洲色aⅴ大片 | 国产亚洲欧美在线专区 | 久久综合狠狠综合久久综合88 | 亚洲精品久久久久中文第一幕 | 清纯唯美经典一区二区 | 55夜色66夜色国产精品视频 | 真人与拘做受免费视频 | 亚洲综合色区中文字幕 | 无码av免费一区二区三区试看 | 亚洲另类伦春色综合小说 | 国产情侣作爱视频免费观看 | 久久国产精品偷任你爽任你 | 中文字幕人妻丝袜二区 | 国产午夜手机精彩视频 | 午夜理论片yy44880影院 | 午夜福利一区二区三区在线观看 | 人人爽人人澡人人高潮 | 亚洲熟妇色xxxxx欧美老妇y | 亚洲国产欧美在线成人 | 婷婷色婷婷开心五月四房播播 | 波多野结衣高清一区二区三区 | 国产成人精品无码播放 | 亚洲国产日韩a在线播放 | 波多野结衣乳巨码无在线观看 | 免费乱码人妻系列无码专区 | 成人三级无码视频在线观看 | 2020最新国产自产精品 | 国产美女精品一区二区三区 | 樱花草在线社区www | 久久无码中文字幕免费影院蜜桃 | 免费观看的无遮挡av | 少妇一晚三次一区二区三区 | 丰满护士巨好爽好大乳 | 大地资源中文第3页 | 少妇太爽了在线观看 | 老子影院午夜伦不卡 | 丰满少妇熟乱xxxxx视频 | 国产成人精品三级麻豆 | 亚洲天堂2017无码 | 国精品人妻无码一区二区三区蜜柚 | 日韩精品久久久肉伦网站 | 亚洲七七久久桃花影院 | 精品人妻人人做人人爽夜夜爽 | 亚洲中文无码av永久不收费 | 久久无码中文字幕免费影院蜜桃 | 四虎国产精品免费久久 | 人人妻人人澡人人爽精品欧美 | 鲁大师影院在线观看 | 色婷婷欧美在线播放内射 | 国产成人无码午夜视频在线观看 | 牲欲强的熟妇农村老妇女视频 | 高潮毛片无遮挡高清免费 | 在线播放免费人成毛片乱码 | 强辱丰满人妻hd中文字幕 | 欧美国产日韩亚洲中文 | 精品国产一区二区三区av 性色 | 六十路熟妇乱子伦 | 国产69精品久久久久app下载 | 国产人妻大战黑人第1集 | 少妇久久久久久人妻无码 | 日本va欧美va欧美va精品 | 久久精品一区二区三区四区 | 成年美女黄网站色大免费全看 | 国产亚洲精品久久久闺蜜 | 中文字幕精品av一区二区五区 | 好男人www社区 | 色婷婷综合中文久久一本 | 蜜臀av无码人妻精品 | 人人澡人人透人人爽 | 鲁一鲁av2019在线 | 亚洲中文字幕在线无码一区二区 | 99久久婷婷国产综合精品青草免费 | 成人片黄网站色大片免费观看 | 精品亚洲韩国一区二区三区 | 日日天干夜夜狠狠爱 | 强辱丰满人妻hd中文字幕 | 波多野结衣高清一区二区三区 | 三上悠亚人妻中文字幕在线 | 强伦人妻一区二区三区视频18 | 自拍偷自拍亚洲精品被多人伦好爽 | 美女极度色诱视频国产 | 久久久精品456亚洲影院 | 亚洲欧美国产精品久久 | 无码国模国产在线观看 | 国产精品人人爽人人做我的可爱 | 欧美成人免费全部网站 | 男人的天堂2018无码 | 精品水蜜桃久久久久久久 | 99久久人妻精品免费二区 | 亚洲国产精品久久久天堂 | 少妇激情av一区二区 | 国产黄在线观看免费观看不卡 | 亚洲精品国产a久久久久久 | av无码不卡在线观看免费 | 国产舌乚八伦偷品w中 | 欧美国产日韩久久mv | 蜜臀aⅴ国产精品久久久国产老师 | 老熟女乱子伦 | 狂野欧美激情性xxxx | 九九久久精品国产免费看小说 | 131美女爱做视频 | 红桃av一区二区三区在线无码av | 亚洲精品国产精品乱码视色 | 亚洲日韩中文字幕在线播放 | 色老头在线一区二区三区 | 欧美日韩久久久精品a片 | 亚洲综合另类小说色区 | 久久久久亚洲精品中文字幕 | 亚洲s码欧洲m码国产av | 男女下面进入的视频免费午夜 | 欧美人与禽zoz0性伦交 | 精品国产av色一区二区深夜久久 | 国精产品一品二品国精品69xx | 成年美女黄网站色大免费视频 | 国产精品高潮呻吟av久久 | 国内精品久久毛片一区二区 | 最近中文2019字幕第二页 | 免费人成在线视频无码 | 午夜福利一区二区三区在线观看 | 成人精品视频一区二区三区尤物 | 亚洲国精产品一二二线 | 国产性生交xxxxx无码 | 国产 浪潮av性色四虎 | 欧美日韩在线亚洲综合国产人 | 精品国产一区二区三区av 性色 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 无码人妻精品一区二区三区下载 | 强辱丰满人妻hd中文字幕 | 国产午夜视频在线观看 | 国产欧美精品一区二区三区 | 国产成人无码区免费内射一片色欲 | 亚洲乱码国产乱码精品精 | 国产av人人夜夜澡人人爽麻豆 | 午夜性刺激在线视频免费 | 无码国产色欲xxxxx视频 | 亚洲色欲色欲欲www在线 | 自拍偷自拍亚洲精品被多人伦好爽 | 国产办公室秘书无码精品99 | 内射白嫩少妇超碰 | 麻豆国产97在线 | 欧洲 | av香港经典三级级 在线 | 免费中文字幕日韩欧美 | 国产成人精品视频ⅴa片软件竹菊 | 精品国产av色一区二区深夜久久 | 亚洲一区二区三区 | 国产乱人偷精品人妻a片 | 少妇的肉体aa片免费 | 国产无遮挡又黄又爽又色 | 久久zyz资源站无码中文动漫 | 国产又粗又硬又大爽黄老大爷视 | 麻豆国产丝袜白领秘书在线观看 | 欧美日韩综合一区二区三区 | 99久久精品日本一区二区免费 | 久久99热只有频精品8 | 波多野结衣乳巨码无在线观看 | 无码福利日韩神码福利片 | 美女毛片一区二区三区四区 | 色老头在线一区二区三区 | 中文字幕日产无线码一区 | 东京无码熟妇人妻av在线网址 | 久久综合给久久狠狠97色 | 免费无码午夜福利片69 | 国产特级毛片aaaaaa高潮流水 | 中文久久乱码一区二区 | 97久久精品无码一区二区 | 综合人妻久久一区二区精品 | 999久久久国产精品消防器材 | 午夜无码人妻av大片色欲 | 国内精品久久毛片一区二区 | 麻豆果冻传媒2021精品传媒一区下载 | 国产精品久免费的黄网站 | 国产一区二区不卡老阿姨 | 婷婷丁香六月激情综合啪 | 在线亚洲高清揄拍自拍一品区 | 色爱情人网站 | 97久久精品无码一区二区 | 日日天干夜夜狠狠爱 | 久精品国产欧美亚洲色aⅴ大片 | 图片小说视频一区二区 | 性色av无码免费一区二区三区 | 偷窥村妇洗澡毛毛多 | 日韩精品a片一区二区三区妖精 | 久久99精品久久久久婷婷 | 国产无套粉嫩白浆在线 | 久久亚洲精品中文字幕无男同 | 亚洲熟妇色xxxxx亚洲 | 国产精华av午夜在线观看 | 免费观看又污又黄的网站 | 女人被爽到呻吟gif动态图视看 | 亚洲中文字幕乱码av波多ji | 国产一区二区三区四区五区加勒比 | 樱花草在线社区www | 无码人妻丰满熟妇区毛片18 | 蜜桃臀无码内射一区二区三区 | 无码国产激情在线观看 | 日本乱偷人妻中文字幕 | 国产成人综合在线女婷五月99播放 | 久久精品人人做人人综合试看 | 亚洲精品美女久久久久久久 | 亚洲爆乳精品无码一区二区三区 | 人妻无码久久精品人妻 | 亚洲春色在线视频 | 大肉大捧一进一出视频出来呀 | 一本加勒比波多野结衣 | 色五月五月丁香亚洲综合网 | 草草网站影院白丝内射 | 蜜桃无码一区二区三区 | 精品国产aⅴ无码一区二区 | 亚洲国产精品无码久久久久高潮 | 亚洲人成网站色7799 | 清纯唯美经典一区二区 | 男女作爱免费网站 | 欧美 亚洲 国产 另类 | 人妻尝试又大又粗久久 | 国产激情无码一区二区 | 久久无码人妻影院 | 久久久久99精品成人片 | 色综合久久网 | 国产国语老龄妇女a片 | 国产人妻精品一区二区三区不卡 | 大地资源中文第3页 | 小泽玛莉亚一区二区视频在线 | 1000部夫妻午夜免费 | 一本久久a久久精品亚洲 | 国产在线无码精品电影网 | 成 人影片 免费观看 | 无码人妻出轨黑人中文字幕 | 欧美 日韩 亚洲 在线 | 国产无遮挡又黄又爽免费视频 | 亚洲精品无码国产 | 最近的中文字幕在线看视频 | 免费无码一区二区三区蜜桃大 | 亚洲欧洲日本无在线码 | 日本熟妇乱子伦xxxx | 激情亚洲一区国产精品 | 色综合久久88色综合天天 | 国产精品久久久一区二区三区 | 日本爽爽爽爽爽爽在线观看免 | 色五月五月丁香亚洲综合网 | 国产一区二区三区精品视频 | a片在线免费观看 | 国产亚洲精品久久久ai换 | 国产性生大片免费观看性 | 国产av无码专区亚洲awww | 成人影院yy111111在线观看 | 亚洲啪av永久无码精品放毛片 | 欧美刺激性大交 | 久久亚洲精品成人无码 | 国产精品久久久久无码av色戒 | 强伦人妻一区二区三区视频18 | 伊人久久大香线蕉午夜 | 精品成在人线av无码免费看 | 成人动漫在线观看 | 国産精品久久久久久久 | 天堂无码人妻精品一区二区三区 | 内射巨臀欧美在线视频 | 久久人人爽人人爽人人片av高清 | 免费播放一区二区三区 | 高潮喷水的毛片 | 国产农村妇女高潮大叫 | 中文字幕精品av一区二区五区 | 国精品人妻无码一区二区三区蜜柚 | 成人三级无码视频在线观看 | 九月婷婷人人澡人人添人人爽 | 狠狠色噜噜狠狠狠7777奇米 | 久久99精品国产.久久久久 | 小sao货水好多真紧h无码视频 | 精品一二三区久久aaa片 | 亚洲成熟女人毛毛耸耸多 | 色综合久久久久综合一本到桃花网 | 夜夜夜高潮夜夜爽夜夜爰爰 | 亚洲理论电影在线观看 | 亚洲另类伦春色综合小说 | 色妞www精品免费视频 | 又大又黄又粗又爽的免费视频 | 性色av无码免费一区二区三区 | 日韩精品a片一区二区三区妖精 | 99久久人妻精品免费二区 | 四虎国产精品免费久久 | 日韩av无码中文无码电影 | 丝袜人妻一区二区三区 | 国产乱人无码伦av在线a | 中文无码成人免费视频在线观看 | 欧美日韩色另类综合 | 国产无遮挡吃胸膜奶免费看 | 人妻少妇精品视频专区 | 毛片内射-百度 | 国产麻豆精品一区二区三区v视界 | 欧美zoozzooz性欧美 | 国产精品免费大片 | 精品久久久久香蕉网 | 99精品视频在线观看免费 | 国产香蕉97碰碰久久人人 | 少女韩国电视剧在线观看完整 | 亚洲精品一区三区三区在线观看 | 超碰97人人射妻 | 人人妻人人澡人人爽欧美一区九九 | 国产人妻人伦精品1国产丝袜 | 55夜色66夜色国产精品视频 | 国产av剧情md精品麻豆 | 午夜无码人妻av大片色欲 | 亚洲日本一区二区三区在线 | 色欲久久久天天天综合网精品 | 国产农村妇女高潮大叫 | www国产亚洲精品久久久日本 | 亚洲国产欧美国产综合一区 | 久久亚洲精品中文字幕无男同 | 18黄暴禁片在线观看 | 人妻少妇被猛烈进入中文字幕 | 日韩在线不卡免费视频一区 | 99在线 | 亚洲 | 国产内射老熟女aaaa | 老司机亚洲精品影院无码 | 丰满少妇高潮惨叫视频 | 国产激情艳情在线看视频 | 最近的中文字幕在线看视频 | 亚洲国产一区二区三区在线观看 | 国产精品爱久久久久久久 | 少妇无码av无码专区在线观看 | 最近中文2019字幕第二页 | 国产艳妇av在线观看果冻传媒 | 国产精品第一区揄拍无码 | 亚洲成a人片在线观看日本 | 又大又紧又粉嫩18p少妇 | 国产美女极度色诱视频www | 成人三级无码视频在线观看 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 少妇激情av一区二区 | 久热国产vs视频在线观看 | 小sao货水好多真紧h无码视频 | 国产卡一卡二卡三 | 国产激情艳情在线看视频 | 久久成人a毛片免费观看网站 | 成人性做爰aaa片免费看不忠 | 国产又爽又黄又刺激的视频 | 成人精品视频一区二区三区尤物 | 人人妻人人澡人人爽欧美一区九九 | 亚洲国产成人a精品不卡在线 | 成熟人妻av无码专区 | 久久久久成人片免费观看蜜芽 | 国产97在线 | 亚洲 | 18禁黄网站男男禁片免费观看 | 黄网在线观看免费网站 | 伊人久久大香线蕉av一区二区 | 粉嫩少妇内射浓精videos | 东京热男人av天堂 | 亚洲综合无码久久精品综合 | 丰满少妇人妻久久久久久 | 大地资源网第二页免费观看 | 亚洲成a人一区二区三区 | 男女下面进入的视频免费午夜 | 久久久久久久女国产乱让韩 | 真人与拘做受免费视频一 | 一二三四社区在线中文视频 | 东京热一精品无码av | 精品国产青草久久久久福利 | 国产精品免费大片 | 中文字幕乱码亚洲无线三区 | 日本乱偷人妻中文字幕 | 日本又色又爽又黄的a片18禁 | 欧美国产日韩久久mv | 人人妻人人澡人人爽欧美一区九九 | 国内少妇偷人精品视频 | 熟妇人妻无码xxx视频 | 帮老师解开蕾丝奶罩吸乳网站 | 高清不卡一区二区三区 | 欧美 日韩 人妻 高清 中文 | 精品久久综合1区2区3区激情 | 丰满护士巨好爽好大乳 | 中文精品久久久久人妻不卡 | 日韩人妻系列无码专区 | 少妇性荡欲午夜性开放视频剧场 | 一个人看的www免费视频在线观看 | 亚洲精品无码国产 | 国产av久久久久精东av | 国产色精品久久人妻 | 樱花草在线播放免费中文 | 亚洲日韩av一区二区三区四区 | 欧美性猛交内射兽交老熟妇 | 少妇高潮喷潮久久久影院 | 亚洲精品综合一区二区三区在线 | 国产精品-区区久久久狼 | 色欲久久久天天天综合网精品 | 亚无码乱人伦一区二区 | 伦伦影院午夜理论片 | 亚洲欧美日韩成人高清在线一区 | 99精品视频在线观看免费 | 大地资源网第二页免费观看 | 国产热a欧美热a在线视频 | 97久久国产亚洲精品超碰热 | 性欧美videos高清精品 | 久久亚洲精品中文字幕无男同 | 任你躁国产自任一区二区三区 | 亚洲国产精品成人久久蜜臀 | 免费乱码人妻系列无码专区 | 欧美黑人巨大xxxxx | 欧美丰满老熟妇xxxxx性 | 强开小婷嫩苞又嫩又紧视频 | 欧美高清在线精品一区 | 久久成人a毛片免费观看网站 | 亚洲欧洲中文日韩av乱码 | 97色伦图片97综合影院 | 亚洲日韩一区二区 | 精品无人国产偷自产在线 | 亚洲成色www久久网站 | 大地资源中文第3页 | 免费人成网站视频在线观看 | 国产熟女一区二区三区四区五区 | 国产成人精品久久亚洲高清不卡 | 国产精品久久精品三级 | 无码国内精品人妻少妇 | 一本加勒比波多野结衣 | 强奷人妻日本中文字幕 | 午夜福利一区二区三区在线观看 | 成年美女黄网站色大免费视频 | 国产后入清纯学生妹 | 日产国产精品亚洲系列 | 欧美老妇交乱视频在线观看 | 亚洲天堂2017无码 | 国产另类ts人妖一区二区 | 久久午夜无码鲁丝片午夜精品 | 国产凸凹视频一区二区 | √天堂资源地址中文在线 | 久久亚洲国产成人精品性色 | 日韩在线不卡免费视频一区 | 国产va免费精品观看 | 日本精品久久久久中文字幕 | 亚洲一区二区三区 | 免费中文字幕日韩欧美 | 色妞www精品免费视频 | 中文字幕日产无线码一区 | 国产亚洲精品久久久久久 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 九九久久精品国产免费看小说 | 97精品人妻一区二区三区香蕉 | 国产精品久久久久久亚洲毛片 | 中文字幕av无码一区二区三区电影 | 久久精品女人的天堂av | 日本在线高清不卡免费播放 | 亚洲精品午夜国产va久久成人 | 免费无码的av片在线观看 | 午夜精品久久久内射近拍高清 | 欧美性色19p | 欧美xxxx黑人又粗又长 | 国产sm调教视频在线观看 | 免费国产成人高清在线观看网站 | 5858s亚洲色大成网站www | 国产乱人偷精品人妻a片 | 亚洲狠狠婷婷综合久久 | 日韩人妻无码一区二区三区久久99 | 亚欧洲精品在线视频免费观看 | 亚洲男女内射在线播放 | 亚洲精品国产精品乱码视色 | 玩弄少妇高潮ⅹxxxyw | 中文字幕+乱码+中文字幕一区 | 2020久久香蕉国产线看观看 | 日本一卡2卡3卡四卡精品网站 | 六月丁香婷婷色狠狠久久 | 人人爽人人爽人人片av亚洲 | 日韩人妻少妇一区二区三区 | 成在人线av无码免费 | 国内精品久久毛片一区二区 | 亚洲中文字幕乱码av波多ji | 2019午夜福利不卡片在线 | 熟妇女人妻丰满少妇中文字幕 | 内射老妇bbwx0c0ck | a片免费视频在线观看 | 中国女人内谢69xxxx | 乱码av麻豆丝袜熟女系列 | 欧美人与善在线com | 亚洲欧美精品aaaaaa片 | 一个人看的www免费视频在线观看 | 美女张开腿让人桶 | 国产无遮挡吃胸膜奶免费看 | 久久伊人色av天堂九九小黄鸭 | 亚洲人成网站在线播放942 | ass日本丰满熟妇pics | 国产成人av免费观看 | 噜噜噜亚洲色成人网站 | 99久久久无码国产aaa精品 | 亚洲最大成人网站 | 成人无码影片精品久久久 | 男女超爽视频免费播放 | 午夜福利不卡在线视频 | 国产黑色丝袜在线播放 | 一二三四社区在线中文视频 | 久久熟妇人妻午夜寂寞影院 | 97人妻精品一区二区三区 | 成熟人妻av无码专区 | 亚洲一区二区三区含羞草 | 精品国产一区av天美传媒 | 在线精品亚洲一区二区 | 小鲜肉自慰网站xnxx | 亚洲最大成人网站 | 人妻少妇精品无码专区动漫 | 性做久久久久久久免费看 | 乱人伦人妻中文字幕无码久久网 | 蜜桃视频插满18在线观看 | 亚洲精品久久久久avwww潮水 | 高潮毛片无遮挡高清免费视频 | 国产人妻精品一区二区三区不卡 | 欧美乱妇无乱码大黄a片 | 国产九九九九九九九a片 | 久久久中文久久久无码 | 欧美激情综合亚洲一二区 | 国产精品久久久一区二区三区 | 十八禁真人啪啪免费网站 | 国产明星裸体无码xxxx视频 | 精品久久久久久人妻无码中文字幕 | 内射白嫩少妇超碰 | 荡女精品导航 | 日日干夜夜干 | 综合人妻久久一区二区精品 | 亚洲综合另类小说色区 | 丰满少妇高潮惨叫视频 | 国产激情艳情在线看视频 | 久久精品人妻少妇一区二区三区 | 久久无码专区国产精品s | 精品人妻av区 | 亚洲一区二区三区播放 | 国产情侣作爱视频免费观看 | 无码人妻久久一区二区三区不卡 | 亚洲中文字幕无码中字 | 免费播放一区二区三区 | 麻豆国产人妻欲求不满谁演的 | 大地资源中文第3页 | 日本va欧美va欧美va精品 | 国产精品毛片一区二区 | 成人欧美一区二区三区 | 亚洲熟妇色xxxxx欧美老妇 | 成人免费视频视频在线观看 免费 | 精品久久久无码人妻字幂 | 麻豆人妻少妇精品无码专区 | 亚洲人成网站免费播放 | 国产精品免费大片 | 久久久中文久久久无码 | 亚洲小说图区综合在线 | 亚洲色偷偷男人的天堂 | 无码播放一区二区三区 | 亚洲日本一区二区三区在线 | 蜜桃av抽搐高潮一区二区 | 成人精品天堂一区二区三区 | 天干天干啦夜天干天2017 | 亚洲国产精品成人久久蜜臀 | 亚洲成av人在线观看网址 | 亚洲色欲久久久综合网东京热 | 国产精品嫩草久久久久 | 老太婆性杂交欧美肥老太 | 日韩精品无码免费一区二区三区 | 中文字幕无码日韩欧毛 | 99久久精品午夜一区二区 | 少妇被粗大的猛进出69影院 | 亚洲人成无码网www | 日本大乳高潮视频在线观看 | 麻豆国产人妻欲求不满谁演的 | 成 人 网 站国产免费观看 | 欧美国产日产一区二区 | 乱码av麻豆丝袜熟女系列 | 欧美激情综合亚洲一二区 | 成人综合网亚洲伊人 | 国产免费久久久久久无码 | 中国大陆精品视频xxxx | 国产办公室秘书无码精品99 | 最近的中文字幕在线看视频 | 亚洲日本在线电影 | 亚洲国产精品美女久久久久 | 国产精品无码一区二区桃花视频 | 无码人妻出轨黑人中文字幕 | 男女猛烈xx00免费视频试看 | 色妞www精品免费视频 | 国产综合久久久久鬼色 | 捆绑白丝粉色jk震动捧喷白浆 | 亚洲精品一区国产 | 国产卡一卡二卡三 | 久久久久亚洲精品男人的天堂 | 日本熟妇人妻xxxxx人hd | 国产亚洲日韩欧美另类第八页 | 高潮毛片无遮挡高清免费视频 | 色综合久久网 | 国产一区二区三区四区五区加勒比 | 久久久无码中文字幕久... | 国产内射爽爽大片视频社区在线 | 特级做a爰片毛片免费69 | 少妇久久久久久人妻无码 | 性欧美videos高清精品 | 成人片黄网站色大片免费观看 | 动漫av一区二区在线观看 | 黄网在线观看免费网站 | 乱人伦人妻中文字幕无码久久网 | 久久精品无码一区二区三区 | 领导边摸边吃奶边做爽在线观看 | 又色又爽又黄的美女裸体网站 | 在线看片无码永久免费视频 | www国产亚洲精品久久久日本 | 精品久久久无码人妻字幂 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 久久久久久久女国产乱让韩 | 人妻无码久久精品人妻 | 国产内射爽爽大片视频社区在线 | 精品成在人线av无码免费看 | 99久久人妻精品免费二区 | 一本久道久久综合婷婷五月 | 久久久久亚洲精品男人的天堂 | 沈阳熟女露脸对白视频 | 国产精品办公室沙发 | 高中生自慰www网站 | 欧美日韩人成综合在线播放 | 97精品人妻一区二区三区香蕉 | 精品aⅴ一区二区三区 | 男女作爱免费网站 | 一本久久伊人热热精品中文字幕 | 香港三级日本三级妇三级 | 亚洲日韩中文字幕在线播放 | 国产精品99爱免费视频 | 久久精品国产精品国产精品污 | 久久人人爽人人爽人人片av高清 | 老子影院午夜精品无码 | 麻豆md0077饥渴少妇 | 欧美国产日韩亚洲中文 | 国产农村乱对白刺激视频 | 日韩av激情在线观看 | 一本久道久久综合婷婷五月 | 日本一区二区三区免费播放 | 蜜臀av无码人妻精品 | 扒开双腿吃奶呻吟做受视频 | 亚洲成av人在线观看网址 | 99久久亚洲精品无码毛片 | 亚洲第一无码av无码专区 | 图片区 小说区 区 亚洲五月 | 亚洲啪av永久无码精品放毛片 | 久久综合激激的五月天 | 国内精品人妻无码久久久影院蜜桃 | 久久久久久久人妻无码中文字幕爆 | 狠狠色噜噜狠狠狠狠7777米奇 | 澳门永久av免费网站 | 男女作爱免费网站 | 国产综合色产在线精品 | 99久久精品国产一区二区蜜芽 | 伦伦影院午夜理论片 | 日韩av无码一区二区三区不卡 | 国产午夜无码精品免费看 | 日本精品少妇一区二区三区 | 亚洲精品午夜国产va久久成人 | 亚洲男人av天堂午夜在 | 婷婷综合久久中文字幕蜜桃三电影 | 欧美激情内射喷水高潮 | 沈阳熟女露脸对白视频 | 亚洲の无码国产の无码影院 | 国产午夜视频在线观看 | 亚洲人成影院在线无码按摩店 | 久久亚洲精品成人无码 | 中文字幕无码乱人伦 | 成人一区二区免费视频 | 久久午夜无码鲁丝片秋霞 | 性生交大片免费看l | 国产97色在线 | 免 | 欧美freesex黑人又粗又大 | 日韩精品成人一区二区三区 | 中文无码成人免费视频在线观看 | 国产无遮挡又黄又爽免费视频 | 奇米影视888欧美在线观看 | 99久久精品日本一区二区免费 | 麻豆国产丝袜白领秘书在线观看 | 国产超级va在线观看视频 | 国产 精品 自在自线 | 国内精品久久毛片一区二区 | 欧美xxxx黑人又粗又长 | 色综合久久久久综合一本到桃花网 | 亚洲国产精品一区二区第一页 | 亚洲日本一区二区三区在线 | 亚洲精品鲁一鲁一区二区三区 | 亚洲精品久久久久avwww潮水 | 中文毛片无遮挡高清免费 | 久久亚洲日韩精品一区二区三区 | 无码一区二区三区在线 | 99国产欧美久久久精品 | 欧美丰满少妇xxxx性 | 亚洲の无码国产の无码步美 | 亚无码乱人伦一区二区 | 精品亚洲韩国一区二区三区 | а天堂中文在线官网 | 一本久久伊人热热精品中文字幕 | 国产黄在线观看免费观看不卡 | 国产精品无码成人午夜电影 | 无码帝国www无码专区色综合 | 国产97人人超碰caoprom | 亚洲精品久久久久中文第一幕 | 国产成人精品一区二区在线小狼 | 成人免费视频视频在线观看 免费 | av无码不卡在线观看免费 | 丰满少妇人妻久久久久久 | 久久久精品成人免费观看 | 18精品久久久无码午夜福利 | 国产av久久久久精东av | 99久久人妻精品免费二区 | 在线看片无码永久免费视频 | 久久久久se色偷偷亚洲精品av | 国产美女精品一区二区三区 | 老熟妇仑乱视频一区二区 | 国产乱人无码伦av在线a | 色狠狠av一区二区三区 | 婷婷五月综合激情中文字幕 | 精品无码国产自产拍在线观看蜜 | 国产乱码精品一品二品 | 国产午夜无码视频在线观看 | 无码毛片视频一区二区本码 | 水蜜桃av无码 | 亚洲成在人网站无码天堂 | 久久久国产精品无码免费专区 | 久久久久久av无码免费看大片 | 国内精品人妻无码久久久影院 | 中文字幕色婷婷在线视频 | 亚洲人亚洲人成电影网站色 | 人妻夜夜爽天天爽三区 | 1000部啪啪未满十八勿入下载 | 中文无码伦av中文字幕 | 欧洲熟妇色 欧美 | 国产精品18久久久久久麻辣 | 无码av最新清无码专区吞精 | 日日天日日夜日日摸 | 欧美变态另类xxxx | 国产猛烈高潮尖叫视频免费 | 日韩 欧美 动漫 国产 制服 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 噜噜噜亚洲色成人网站 | 久久久www成人免费毛片 | 国色天香社区在线视频 | 18禁黄网站男男禁片免费观看 | 装睡被陌生人摸出水好爽 | 国产精品永久免费视频 | 色老头在线一区二区三区 | 国产精品沙发午睡系列 | 久久99久久99精品中文字幕 | 国产精品高潮呻吟av久久4虎 | 久久亚洲中文字幕无码 | 又大又黄又粗又爽的免费视频 | 2020久久超碰国产精品最新 | 精品久久8x国产免费观看 | 成在人线av无码免费 | 奇米影视888欧美在线观看 | 亚洲精品午夜国产va久久成人 | 成人片黄网站色大片免费观看 | 日本欧美一区二区三区乱码 | 最新国产麻豆aⅴ精品无码 | 久久久精品456亚洲影院 | 少妇人妻偷人精品无码视频 | 国产舌乚八伦偷品w中 | 日韩亚洲欧美精品综合 | 国内精品久久久久久中文字幕 | 精品一区二区不卡无码av | 超碰97人人做人人爱少妇 | 99riav国产精品视频 | 九一九色国产 | 国产精品第一国产精品 | 国产手机在线αⅴ片无码观看 | 国产亚av手机在线观看 | www一区二区www免费 | 亚洲а∨天堂久久精品2021 | 全球成人中文在线 | 亚洲国产精品久久久天堂 | 亚洲国产精品毛片av不卡在线 | 偷窥村妇洗澡毛毛多 | 国产亚洲精品久久久ai换 | 成人女人看片免费视频放人 | 国产精品久久久 | 日日鲁鲁鲁夜夜爽爽狠狠 | 伊人久久大香线蕉午夜 | 日韩av激情在线观看 | 亚洲国产精品久久久天堂 | 亚洲精品久久久久中文第一幕 | 日日摸日日碰夜夜爽av | 图片区 小说区 区 亚洲五月 | 老司机亚洲精品影院无码 | 精品无码av一区二区三区 | 午夜精品一区二区三区在线观看 | аⅴ资源天堂资源库在线 | 亚洲色偷偷偷综合网 | 国产精品视频免费播放 | 国内精品一区二区三区不卡 | 丰满少妇高潮惨叫视频 | 色欲久久久天天天综合网精品 | 综合人妻久久一区二区精品 | 欧美日韩亚洲国产精品 | 1000部啪啪未满十八勿入下载 | 亚洲天堂2017无码 | 狠狠色噜噜狠狠狠7777奇米 | 在线a亚洲视频播放在线观看 | 狠狠cao日日穞夜夜穞av | 精品久久久久香蕉网 | 天天做天天爱天天爽综合网 | 亚洲国产精品成人久久蜜臀 | 久久亚洲中文字幕无码 | 国产精品久久久久7777 | 青青青爽视频在线观看 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 少妇性l交大片欧洲热妇乱xxx | 久久综合给合久久狠狠狠97色 | 精品人人妻人人澡人人爽人人 | 久久国产自偷自偷免费一区调 | 久久精品中文闷骚内射 | 国产精华av午夜在线观看 | 夜先锋av资源网站 | 久久综合九色综合97网 | 欧美日韩一区二区综合 | 亚洲熟妇色xxxxx欧美老妇y | 大地资源网第二页免费观看 | 中文字幕无码av激情不卡 | 乱人伦人妻中文字幕无码 | 131美女爱做视频 | 国语精品一区二区三区 | 欧美兽交xxxx×视频 | 超碰97人人射妻 | 亚洲欧美日韩国产精品一区二区 | 伊在人天堂亚洲香蕉精品区 | а√天堂www在线天堂小说 | 狠狠色噜噜狠狠狠7777奇米 | 人妻插b视频一区二区三区 | 亚洲人成网站免费播放 | 日韩精品久久久肉伦网站 | 欧美老人巨大xxxx做受 | 性欧美牲交xxxxx视频 | 国产国语老龄妇女a片 | 久久久精品欧美一区二区免费 | 婷婷综合久久中文字幕蜜桃三电影 | 女人被爽到呻吟gif动态图视看 | 国产成人一区二区三区在线观看 | 国产免费观看黄av片 | 亚洲国产精品一区二区第一页 | 日日鲁鲁鲁夜夜爽爽狠狠 | 亚洲熟妇色xxxxx亚洲 | 丰满诱人的人妻3 | 国产在线aaa片一区二区99 | 天天燥日日燥 | 麻豆果冻传媒2021精品传媒一区下载 | 国产熟女一区二区三区四区五区 | 国产成人久久精品流白浆 | 久久精品国产日本波多野结衣 | 牲欲强的熟妇农村老妇女视频 | 亚洲精品国产精品乱码不卡 | 中文无码伦av中文字幕 | 国产无套粉嫩白浆在线 | 99国产欧美久久久精品 | 国产精品久久国产三级国 | 特黄特色大片免费播放器图片 | 亚洲熟妇色xxxxx欧美老妇 | 国产精品久久久 | 精品久久综合1区2区3区激情 | 亚洲精品一区二区三区在线 | 亚洲精品综合一区二区三区在线 | 国产超级va在线观看视频 | 永久免费观看美女裸体的网站 | 亚洲 激情 小说 另类 欧美 | 久久国产精品萌白酱免费 | 亚洲人亚洲人成电影网站色 | 一本久道高清无码视频 | 精品无码国产自产拍在线观看蜜 | 欧美日韩综合一区二区三区 | 久久亚洲日韩精品一区二区三区 | 亚洲精品www久久久 | 国产午夜精品一区二区三区嫩草 | 亚洲精品一区二区三区婷婷月 | 亚洲精品一区二区三区在线观看 | 色婷婷综合中文久久一本 | 精品久久综合1区2区3区激情 | 久久精品视频在线看15 | 国产乱人偷精品人妻a片 | 亚洲区欧美区综合区自拍区 | 3d动漫精品啪啪一区二区中 | 一个人看的www免费视频在线观看 | 亚洲国产精品久久久久久 | 亚洲小说图区综合在线 | 在线欧美精品一区二区三区 | 久久99精品国产麻豆蜜芽 | 婷婷六月久久综合丁香 | 免费看男女做好爽好硬视频 | 国精产品一品二品国精品69xx | 亚洲综合无码一区二区三区 | 精品一区二区三区波多野结衣 | 国产成人av免费观看 | 亚洲毛片av日韩av无码 | 久久无码专区国产精品s | 狠狠色色综合网站 | 国产精品无码mv在线观看 | 国产熟女一区二区三区四区五区 | 成年女人永久免费看片 |