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

統(tǒng)計(jì)

  • 隨筆 - 50
  • 文章 - 42
  • 評(píng)論 - 147
  • 引用 - 0

留言簿(6)

隨筆分類

文章分類

Link

搜索

  •  

積分與排名

  • 積分 - 167189
  • 排名 - 159

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

kmalloc vmalloc

在設(shè)備驅(qū)動(dòng)程序中動(dòng)態(tài)開(kāi)辟內(nèi)存,不是用malloc,而是kmalloc,或者用get_free_pages直接申請(qǐng)頁(yè)。釋放內(nèi)存用的是kfree,或free_pages.

   對(duì)于提供了MMU(存儲(chǔ)管理器,輔助操作系統(tǒng)進(jìn)行內(nèi)存管理,提供虛實(shí)地址轉(zhuǎn)換等硬件支持)的處理器而言,Linux提供了復(fù)雜的存儲(chǔ)管理系統(tǒng),使得進(jìn)程所能訪問(wèn)的內(nèi)存達(dá)到4GB。

  進(jìn)程的4GB內(nèi)存空間被人為的分為兩個(gè)部分--用戶空間與內(nèi)核空間。用戶空間地址分布從0到3GB(PAGE_OFFSET,在0x86中它等于0xC0000000),3GB到4GB為內(nèi)核空間。

  內(nèi)核空間中,從3G到vmalloc_start這段地址是物理內(nèi)存映射區(qū)域(該區(qū)域中包含了內(nèi)核鏡像、物理頁(yè)框表mem_map等等),比如我們使用的 VMware虛擬系統(tǒng)內(nèi)存是160M,那么3G~3G+160M這片內(nèi)存就應(yīng)該映射物理內(nèi)存。在物理內(nèi)存映射區(qū)之后,就是vmalloc區(qū)域。對(duì)于 160M的系統(tǒng)而言,vmalloc_start位置應(yīng)在3G+160M附近(在物理內(nèi)存映射區(qū)與vmalloc_start期間還存在一個(gè)8M的gap 來(lái)防止躍界),vmalloc_end的位置接近4G(最后位置系統(tǒng)會(huì)保留一片128k大小的區(qū)域用于專用頁(yè)面映射)

     kmalloc和get_free_page申請(qǐng)的內(nèi)存位于物理內(nèi)存映射區(qū)域,而且在物理上也是連續(xù)的,它們與真實(shí)的物理地址只有一個(gè)固定的偏移,因此存在較簡(jiǎn)單的轉(zhuǎn)換關(guān)系,virt_to_phys()可以實(shí)現(xiàn)內(nèi)核虛擬地址轉(zhuǎn)化為物理地址:
   #define __pa(x) ((unsigned long)(x)-PAGE_OFFSET)
   extern inline unsigned long virt_to_phys(volatile void * address)
   {
        return __pa(address);
   }
上面轉(zhuǎn)換過(guò)程是將虛擬地址減去3G(PAGE_OFFSET=0XC000000)。

與之對(duì)應(yīng)的函數(shù)為phys_to_virt(),將內(nèi)核物理地址轉(zhuǎn)化為虛擬地址:
   #define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET))
   extern inline void * phys_to_virt(unsigned long address)
   {
        return __va(address);
   }
virt_to_phys()和phys_to_virt()都定義在include\asm-i386\io.h中。

-------------------------------------------------------------------------------------
1、kmalloc() 分配連續(xù)的物理地址,用于小內(nèi)存分配。

  2、__get_free_page() 分配連續(xù)的物理地址,用于整頁(yè)分配。

  至于為什么說(shuō)以上函數(shù)分配的是連續(xù)的物理地址和返回的到底是物理地址還是虛擬地址,下面的記錄會(huì)做出解釋。

  kmalloc() 函數(shù)本身是基于 slab 實(shí)現(xiàn)的。slab 是為分配小內(nèi)存提供的一種高效機(jī)制。但 slab 這種分配機(jī)制又不是獨(dú)立的,它本身也是在頁(yè)分配器的基礎(chǔ)上來(lái)劃分更細(xì)粒度的內(nèi)存供調(diào)用者使用。也就是說(shuō)系統(tǒng)先用頁(yè)分配器分配以頁(yè)為最小單位的連續(xù)物理地址,然后 kmalloc() 再在這上面根據(jù)調(diào)用者的需要進(jìn)行切分。

  關(guān)于以上論述,我們可以查看 kmalloc() 的實(shí)現(xiàn),kmalloc()函數(shù)的實(shí)現(xiàn)是在 __do_kmalloc() 中,可以看到在 __do_kmalloc()代碼里最終調(diào)用了 __cache_alloc() 來(lái)分配一個(gè) slab,其實(shí)

  kmem_cache_alloc() 等函數(shù)的實(shí)現(xiàn)也是調(diào)用了這個(gè)函數(shù)來(lái)分配新的 slab。我們按照 __cache_alloc()函數(shù)的調(diào)用路徑一直跟蹤下去會(huì)發(fā)現(xiàn)在 cache_grow() 函數(shù)中使用了 kmem_getpages()函數(shù)來(lái)分配一個(gè)物理頁(yè)面,kmem_getpages() 函數(shù)中調(diào)用的alloc_pages_node() 最終是使用 __alloc_pages() 來(lái)返回一個(gè)struct page 結(jié)構(gòu),而這個(gè)結(jié)構(gòu)正是系統(tǒng)用來(lái)描述物理頁(yè)面的。這樣也就證實(shí)了上面所說(shuō)的,slab 是在物理頁(yè)面基礎(chǔ)上實(shí)現(xiàn)的。kmalloc() 分配的是物理地址。

  __get_free_page() 是頁(yè)面分配器提供給調(diào)用者的最底層的內(nèi)存分配函數(shù)。它分配連續(xù)的物理內(nèi)存。__get_free_page() 函數(shù)本身是基于 buddy 實(shí)現(xiàn)的。在使用 buddy 實(shí)現(xiàn)的物理內(nèi)存管理中最小分配粒度是以頁(yè)為單位的。關(guān)于以上論述,我們可以查看__get_free_page()的實(shí)現(xiàn),可以看到__get_free_page()函數(shù)只是一個(gè)非常簡(jiǎn)單的封狀,它的整個(gè)函數(shù)實(shí)現(xiàn)就是無(wú)條件的調(diào)用 __alloc_pages() 函數(shù)來(lái)分配物理內(nèi)存,上面記錄 kmalloc()實(shí)現(xiàn)時(shí)也提到過(guò)是在調(diào)用 __alloc_pages() 函數(shù)來(lái)分配物理頁(yè)面的前提下進(jìn)行的 slab 管理。那么這個(gè)函數(shù)是如何分配到物理頁(yè)面又是在什么區(qū)域中進(jìn)行分配的?回答這個(gè)問(wèn)題只能看下相關(guān)的實(shí)現(xiàn)。可以看到在 __alloc_pages() 函數(shù)中,多次嘗試調(diào)用get_page_from_freelist() 函數(shù)從 zonelist 中取得相關(guān) zone,并從其中返回一個(gè)可用的 struct page 頁(yè)面(這里的有些調(diào)用分支是因?yàn)闃?biāo)志不同)。至此,可以知道一個(gè)物理頁(yè)面的分配是從 zonelist(一個(gè) zone 的結(jié)構(gòu)數(shù)組)中的 zone 返回的。那么 zonelist/zone 是如何與物理頁(yè)面關(guān)聯(lián),又是如何初始化的呢?繼續(xù)來(lái)看 free_area_init_nodes() 函數(shù),此函數(shù)在系統(tǒng)初始化時(shí)由 zone_sizes_init() 函數(shù)間接調(diào)用的,zone_sizes_init()函數(shù)填充了三個(gè)區(qū)域:ZONE_DMA,ZONE_NORMAL,ZONE_HIGHMEM。并把他們作為參數(shù)調(diào)用 free_area_init_nodes(),在這個(gè)函數(shù)中會(huì)分配一個(gè) pglist_data 結(jié)構(gòu),此結(jié)構(gòu)中包含了 zonelist/zone結(jié)構(gòu)和一個(gè) struct page 的物理頁(yè)結(jié)構(gòu),在函數(shù)最后用此結(jié)構(gòu)作為參數(shù)調(diào)用了 free_area_init_node() 函數(shù),在這個(gè)函數(shù)中首先使用 calculate_node_totalpages() 函數(shù)標(biāo)記 pglist_data 相關(guān)區(qū)域,然后調(diào)用 alloc_node_mem_map() 函數(shù)初始化 pglist_data結(jié)構(gòu)中的 struct page 物理頁(yè)。最后使用 free_area_init_core()函數(shù)關(guān)聯(lián) pglist_data 與 zonelist。現(xiàn)在通以上分析已經(jīng)明確了__get_free_page() 函數(shù)分配物理內(nèi)存的流程。但這里又引出了幾個(gè)新問(wèn)題,那就是此函數(shù)分配的物理頁(yè)面是如何映射的?映射到了什么位置?到這里不得不去看下與 VMM 相關(guān)的引導(dǎo)代碼。

  在看 VMM 相關(guān)的引導(dǎo)代碼前,先來(lái)看一下 virt_to_phys() 與phys_to_virt 這兩個(gè)函數(shù)。顧名思義,即是虛擬地址到物理地址和物理地址到虛擬地址的轉(zhuǎn)換。函數(shù)實(shí)現(xiàn)十分簡(jiǎn)單,前者調(diào)用了__pa( address ) 轉(zhuǎn)換虛擬地址到物理地址,后者調(diào)用 __va(addrress ) 將物理地址轉(zhuǎn)換為虛擬地址。再看下 __pa __va 這兩個(gè)宏到底做了什么。

  #define __pa(x) ((unsigned long)(x)-PAGE_OFFSET)
  #define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET))

  通過(guò)上面可以看到僅僅是把地址加上或減去 PAGE_OFFSET,而PAGE_OFFSET 在 x86 下定義為 0xC0000000。這里又引出了疑問(wèn),在 linux 下寫過(guò) driver 的人都知道,在使用 kmalloc() 與

  __get_free_page() 分配完物理地址后,如果想得到正確的物理地址需要使用 virt_to_phys() 進(jìn)行轉(zhuǎn)換。那么為什么要有這一步呢?我們不分配的不就是物理地址么?怎么分配完成還需要轉(zhuǎn)換?如果返回的是虛擬地址,那么根據(jù)如上對(duì) virt_to_phys() 的分析,為什么僅僅對(duì) PAGE_OFFSET 操作就能實(shí)現(xiàn)地址轉(zhuǎn)換呢?虛擬地址與物理地址之間的轉(zhuǎn)換不需要查頁(yè)表么?代著以上諸多疑問(wèn)來(lái)看 VMM 相關(guān)的引導(dǎo)代碼。

  直接從 start_kernel() 內(nèi)核引導(dǎo)部分來(lái)查找 VMM 相關(guān)內(nèi)容。可以看到第一個(gè)應(yīng)該關(guān)注的函數(shù)是 setup_arch(),在這個(gè)函數(shù)當(dāng)中使用paging_init() 函數(shù)來(lái)初始化和映射硬件頁(yè)表(在初始化前已有 8M內(nèi)存被映射,在這里不做記錄),而 paging_init() 則是調(diào)用的pagetable_init() 來(lái)完成內(nèi)核物理地址的映射以及相關(guān)內(nèi)存的初始化。在 pagetable_init() 函數(shù)中,首先是一些 PAE/PSE/PGE 相關(guān)判斷與設(shè)置,然后使用 kernel_physical_mapping_init() 函數(shù)來(lái)實(shí)現(xiàn)內(nèi)核物理內(nèi)存的映射。在這個(gè)函數(shù)中可以很清楚的看到,pgd_idx 是以PAGE_OFFSET 為啟始地址進(jìn)行映射的,也就是說(shuō)循環(huán)初始化所有物理地址是以 PAGE_OFFSET 為起點(diǎn)的。繼續(xù)觀察我們可以看到在 PMD 被初始化后,所有地址計(jì)算均是以 PAGE_OFFSET 作為標(biāo)記來(lái)遞增的。分析到這里已經(jīng)很明顯的可以看出,物理地址被映射到以 PAGE_OFFSET 開(kāi)始的虛擬地址空間。這樣以上所有疑問(wèn)就都有了答案。kmalloc() 與__get_free_page() 所分配的物理頁(yè)面被映射到了 PAGE_OFFSET 開(kāi)始的虛擬地址,也就是說(shuō)實(shí)際物理地址與虛擬地址有一組一一對(duì)應(yīng)的關(guān)系,

  正是因?yàn)橛辛诉@種映射關(guān)系,對(duì)內(nèi)核以 PAGE_OFFSET 啟始的虛擬地址的分配也就是對(duì)物理地址的分配(當(dāng)然這有一定的范圍,應(yīng)該在 PAGE_OFFSET與 VMALLOC_START 之間,后者為 vmalloc() 函數(shù)分配內(nèi)存的啟始地址)。這也就解釋了為什么 virt_to_phys() 與 phys_to_virt() 函數(shù)的實(shí)現(xiàn)僅僅是加/減 PAGE_OFFSET 即可在虛擬地址與物理地址之間轉(zhuǎn)換,正是因?yàn)榱擞辛诉@種映射,且固定不變,所以才不用去查頁(yè)表進(jìn)行轉(zhuǎn)換。這也同樣回答了開(kāi)始的問(wèn)題,即 kmalloc() / __get_free_page() 分配的是物理地址,而返回的則是虛擬地址(雖然這聽(tīng)上去有些別扭)。正是因?yàn)橛辛诉@種映射關(guān)系,所以需要將它們的返回地址減去 PAGE_OFFSET 才可以得到真正的物理地址。

另一篇更容易理解的:

kmalloc, vmalloc分配的內(nèi)存結(jié)構(gòu) zz
2008-01-20 16:05
進(jìn)程空間:| <-用戶空間-> | <-內(nèi)核空間-> |
內(nèi)核空間:| <-物理內(nèi)存映射區(qū)-> | <-vmalloc區(qū)域-> |

==============原文================================

   對(duì)于提供了MMU(存儲(chǔ)管理器,輔助操作系統(tǒng)進(jìn)行內(nèi)存管理,提供虛實(shí)地址轉(zhuǎn)換等硬件支持)的處理器而言,Linux提供了復(fù)雜的存儲(chǔ)管理系統(tǒng),使得進(jìn)程所能訪問(wèn)的內(nèi)存達(dá)到4GB。

進(jìn)程的4GB內(nèi)存空間被人為的分為兩個(gè)部分--用戶空間與內(nèi)核空間。用戶空間地址分布從0到3GB(PAGE_OFFSET,在0x86中它等于0xC0000000),3GB到4GB為內(nèi)核空間。

內(nèi)核空間中,從3G到vmalloc_start這段地址是物理內(nèi)存映射區(qū)域(該區(qū)域中包含了內(nèi)核鏡像、物理頁(yè)框表mem_map等等),比如我們使用 的 VMware虛擬系統(tǒng)內(nèi)存是160M,那么3G~3G+160M這片內(nèi)存就應(yīng)該映射物理內(nèi)存。在物理內(nèi)存映射區(qū)之后,就是vmalloc區(qū)域。對(duì)于 160M的系統(tǒng)而言,vmalloc_start位置應(yīng)在3G+160M附近(在物理內(nèi)存映射區(qū)與vmalloc_start期間還存在一個(gè)8M的gap 來(lái)防止躍界),vmalloc_end的位置接近4G(最后位置系統(tǒng)會(huì)保留一片128k大小的區(qū)域用于專用頁(yè)面映射)

kmalloc和get_free_page申請(qǐng)的內(nèi)存位于物理內(nèi)存映射區(qū)域,而且在物理上也是連續(xù)的,它們與真實(shí)的物理地址只有一個(gè)固定的偏移,因此存在較簡(jiǎn)單的轉(zhuǎn)換關(guān)系,virt_to_phys()可以實(shí)現(xiàn)內(nèi)核虛擬地址轉(zhuǎn)化為物理地址:
   #define __pa(x) ((unsigned long)(x)-PAGE_OFFSET)
   extern inline unsigned long virt_to_phys(volatile void * address)
   {
        return __pa(address);
   }
上面轉(zhuǎn)換過(guò)程是將虛擬地址減去3G(PAGE_OFFSET=0XC000000)。

與之對(duì)應(yīng)的函數(shù)為phys_to_virt(),將內(nèi)核物理地址轉(zhuǎn)化為虛擬地址:
   #define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET))
   extern inline void * phys_to_virt(unsigned long address)
   {
        return __va(address);
   }
virt_to_phys()和phys_to_virt()都定義在include\asm-i386\io.h中。

而vmalloc申請(qǐng)的內(nèi)存則位于vmalloc_start~vmalloc_end之間,與物理地址沒(méi)有簡(jiǎn)單的轉(zhuǎn)換關(guān)系,雖然在邏輯上它們也是連續(xù)的,但是在物理上它們不要求連續(xù)。

我們用下面的程序來(lái)演示kmalloc、get_free_page和vmalloc的區(qū)別:
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/vmalloc.h>
MODULE_LICENSE("GPL");
unsigned char *pagemem;
unsigned char *kmallocmem;
unsigned char *vmallocmem;

int __init mem_module_init(void)
{
//最好每次內(nèi)存申請(qǐng)都檢查申請(qǐng)是否成功
//下面這段僅僅作為演示的代碼沒(méi)有檢查
pagemem = (unsigned char*)get_free_page(0);
printk("<1>pagemem addr=%x", pagemem);

kmallocmem = (unsigned char*)kmalloc(100, 0);
printk("<1>kmallocmem addr=%x", kmallocmem);

vmallocmem = (unsigned char*)vmalloc(1000000);
printk("<1>vmallocmem addr=%x", vmallocmem);

return 0;
}

void __exit mem_module_exit(void)
{
free_page(pagemem);
kfree(kmallocmem);
vfree(vmallocmem);
}

module_init(mem_module_init);
module_exit(mem_module_exit);

我們的系統(tǒng)上有160MB的內(nèi)存空間,運(yùn)行一次上述程序,發(fā)現(xiàn)pagemem的地址在0xc7997000(約3G+121M)、kmallocmem 地址在0xc9bc1380(約3G+155M)、vmallocmem的地址在0xcabeb000(約3G+171M)處,符合前文所述的內(nèi)存布局。

 

本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/sandflee/archive/2009/07/28/4388322.aspx

posted on 2009-11-17 17:18 pear_li 閱讀(1367) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Linux/Unix

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            麻豆国产精品777777在线| 日韩亚洲欧美成人| 欧美大片在线观看| 国产精品日日摸夜夜添夜夜av | 国产精品久久久久永久免费观看 | 性一交一乱一区二区洋洋av| 欧美日韩国产精品成人| 亚洲黄色一区| 亚洲人成小说网站色在线| 久久久久久国产精品mv| 噜噜噜躁狠狠躁狠狠精品视频| 国产欧美日韩专区发布| 亚洲免费在线播放| 性欧美大战久久久久久久久| 国产目拍亚洲精品99久久精品| 亚洲一区区二区| 欧美一区二区视频免费观看| 国产亚洲一区二区三区| 久久九九国产精品| 欧美激情第二页| 一区二区av在线| 国产精品久久久久久久久久ktv| 一本一本大道香蕉久在线精品| 亚洲一区二区三区高清不卡| 国产精品久久久久久影院8一贰佰 国产精品久久久久久影视 | 国产精品丝袜白浆摸在线| 亚洲欧美精品在线观看| 久久久久久噜噜噜久久久精品| 国产一区二区精品| 久久久精品国产一区二区三区| 欧美成人精品在线观看| 亚洲美女诱惑| 国产美女一区二区| 久久综合电影一区| 日韩午夜高潮| 欧美亚洲视频在线观看| 黄色成人av在线| 欧美激情欧美狂野欧美精品| 一区二区国产日产| 久久久久看片| 亚洲美女视频在线观看| 国产精品日韩| 久久永久免费| 亚洲性视频网站| 蜜臀a∨国产成人精品| 一区二区三区视频在线| 国产亚洲成人一区| 欧美成人亚洲| 亚洲视频免费看| 久久亚洲综合| 亚洲一区二区三区涩| 在线免费观看视频一区| 欧美少妇一区二区| 久久黄金**| 99精品久久久| 久久手机精品视频| 中文精品视频一区二区在线观看| 欧美成人综合一区| 一区二区三区高清在线| 久久久另类综合| 一区二区三区视频免费在线观看| 国产一区二区看久久| 欧美日韩成人一区二区| 久久久久久久精| 在线一区二区视频| 亚洲成人在线视频播放| 亚洲欧美日韩精品久久久久| 亚洲电影免费观看高清完整版在线观看| 欧美日韩成人在线播放| 久久手机免费观看| 亚洲欧美激情一区二区| 亚洲精品欧美极品| 猛男gaygay欧美视频| 亚洲欧美视频在线观看视频| 亚洲日韩欧美视频一区| 国产精品推荐精品| 欧美日韩国产小视频| 久久久www| 欧美亚洲网站| 亚洲视频www| 日韩视频在线免费| 亚洲大胆美女视频| 久久伊人亚洲| 欧美在线观看视频一区二区三区 | 国产一区欧美| 国产精品午夜春色av| 欧美日韩高清在线| 欧美成人精品在线播放| 久久天天躁狠狠躁夜夜av| 性欧美xxxx视频在线观看| 亚洲午夜成aⅴ人片| 在线视频免费在线观看一区二区| 亚洲精选久久| 91久久精品一区二区三区| 99日韩精品| 亚洲精品中文字幕女同| 亚洲精品日韩综合观看成人91| 亚洲国产二区| 亚洲电影第1页| 在线免费不卡视频| 亚洲第一天堂av| 伊人成人开心激情综合网| 黄色综合网站| 亚洲国产女人aaa毛片在线| 亚洲国产精品成人久久综合一区| 揄拍成人国产精品视频| 1204国产成人精品视频| 亚洲国产二区| 日韩一区二区免费高清| 一区二区三欧美| 亚洲性线免费观看视频成熟| 亚洲四色影视在线观看| 亚洲欧美资源在线| 久久久久.com| 免费成人在线观看视频| 亚洲高清在线| 日韩午夜av| 亚洲欧美一区二区原创| 久久高清福利视频| 免费亚洲婷婷| 欧美片在线观看| 国产精品大片| 国产在线乱码一区二区三区| 在线不卡欧美| 一本久久综合亚洲鲁鲁| 亚洲欧美综合v| 久久综合网络一区二区| 亚洲国产成人久久综合| 99亚洲一区二区| 亚洲欧美日韩一区在线观看| 久久精品亚洲一区| 欧美黄色影院| 国产精品你懂的在线欣赏| 亚洲欧美日韩国产成人精品影院| 老司机精品久久| 亚洲第一狼人社区| 99国产精品久久久| 午夜在线一区| 免费在线视频一区| 国产精品成人观看视频国产奇米| 国产亚洲欧美日韩精品| 91久久精品国产91性色tv| 中文一区字幕| 久久中文在线| 日韩天堂在线观看| 久久久久久69| 国产精品爱啪在线线免费观看| 国产一区二区三区久久 | 99re热这里只有精品视频| 亚洲欧美在线免费| 欧美电影资源| 国产亚洲永久域名| 一区二区三区久久| 久久午夜电影网| 一本色道久久综合一区| 久久婷婷久久一区二区三区| 国产精品扒开腿做爽爽爽视频 | 国产欧美视频一区二区三区| 91久久精品国产| 久久精品道一区二区三区| 亚洲国产精品电影在线观看| 亚洲欧美日韩精品久久| 欧美日韩无遮挡| 亚洲第一在线综合网站| 久久精品国产精品亚洲综合| 日韩亚洲在线| 美女成人午夜| 国产自产精品| 性久久久久久久久久久久| 亚洲三级网站| 米奇777在线欧美播放| 国产亚洲午夜高清国产拍精品| 亚洲在线观看免费视频| 91久久精品网| 女人色偷偷aa久久天堂| 国内精品美女在线观看| 欧美一区二粉嫩精品国产一线天| 亚洲人成久久| 免费欧美网站| 亚洲第一视频网站| 麻豆精品一区二区av白丝在线| 亚洲欧美日韩专区| 国产精品99免费看| av成人毛片| 日韩视频一区| 欧美日韩美女一区二区| 亚洲精品一区久久久久久| 欧美国产日韩精品| 久久一区亚洲| ●精品国产综合乱码久久久久| 久久婷婷一区| 久久久久国产精品厨房| 国产自产女人91一区在线观看| 欧美亚洲一区二区在线| 亚洲视频在线观看视频| 欧美午夜精品理论片a级按摩| 一本一本久久| 一区二区三区黄色| 国产精品久久久久久久午夜片| 亚洲综合另类|