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

一文讀懂 Linux 內存分配全過程

系統 Linux
本文主要介紹了 Linux 內存分配的整個過程,當然只是介紹從堆空間分配的內存的過程。

[[395418]]

本文轉載自微信公眾號「Linux內核那些事」,作者songsong001。轉載本文請聯系Linux內核那些事公眾號。  

在《你真的理解內存分配》一文中,我們介紹了 malloc 申請內存的原理,但其在內核怎么實現的呢?所以,本文主要分析在 Linux 內核中對堆內存分配的實現過程。

本文使用 Linux 2.6.32 版本代碼

內存分區對象

在《你真的理解內存分配》一文中介紹過,Linux 會把進程虛擬內存空間劃分為多個分區,在 Linux 內核中使用 vm_area_struct 對象來表示,其定義如下:

  1.  struct vm_area_struct { 
  2.     struct mm_struct *vm_mm;        // 分區所屬的內存管理對象 
  3.   
  4.     unsigned long vm_start;         // 分區的開始地址 
  5.     unsigned long vm_end;           // 分區的結束地址 
  6.   
  7.     struct vm_area_struct *vm_next; // 通過這個指針把進程所有的內存分區連接成一個鏈表 
  8.    ... 
  9.     struct rb_node vm_rb;           // 紅黑樹的節點, 用于保存到內存分區紅黑樹中 
  10.   ... 
  11. }; 

我們對 vm_area_struct 對象進行了簡化,只保留了本文需要的字段。

內核就是使用 vm_area_struct 對象來記錄一個內存分區(如 代碼段、數據段 和 堆空間 等),下面介紹一下 vm_area_struct 對象各個字段的作用:

  • vm_mm:指定了當前內存分區所屬的內存管理對象。
  • vm_start:內存分區的開始地址。
  • vm_end:內存分區的結束地址。
  • vm_next:通過這個指針把進程中所有的內存分區連接成一個鏈表。
  • vm_rb:另外,為了快速查找內存分區,內核還把進程的所有內存分區保存到一棵紅黑樹中。vm_rb 就是紅黑樹的節點,用于把內存分區保存到紅黑樹中。

假如進程 A 現在有 4 個內存分區,它們的范圍如下:

  • 代碼段:00400000 ~ 00401000
  • 數據段:00600000 ~ 00601000
  • 堆空間:00983000 ~ 009a4000
  • ??臻g:7f37ce866000 ~ 7f3fce867000

那么這 4 個內存分區在內核中的結構如 圖1 所示:

在 圖1 中,我們可以看到有個 mm_struct 的對象,此對象每個進程都持有一個,是進程虛擬內存空間和物理內存空間的管理對象。我們簡單介紹一下這個對象,其定義如下:

  1. struct mm_struct { 
  2.    struct vm_area_struct *mmap;  // 指向由進程內存分區連接成的鏈表 
  3.    struct rb_root mm_rb;         // 內核使用紅黑樹保存進程的所有內存分區, 這個是紅黑樹的根節點 
  4.    unsigned long start_brk, brk; // 堆空間的開始地址和結束地址 
  5.   ... 
  6. }; 

我們來介紹下 mm_struct 對象各個字段的作用:

  • mmap:指向由進程所有內存分區連接成的鏈表。
  • mm_rb:內核為了加快查找內存分區的速度,使用了紅黑樹保存所有內存分區,這個就是紅黑樹的根節點。
  • start_brk:堆空間的開始內存地址。
  • brk:堆空間的頂部內存地址。

我們來回顧一下進程虛擬內存空間的布局圖,如 圖2 所示:

start_brk 和 brk 字段用來記錄堆空間的范圍, 如 圖2 所示。一般來說,start_brk 是不會變的,而 brk 會隨著分配內存和釋放內存而變化。

虛擬內存分配

在《你真的理解內存分配》一文中說過,調用 malloc 申請內存時,最終會調用 brk 系統調用來從堆空間中分配內存。我們來分析一下 brk 系統調用的實現:

  1. unsigned long sys_brk(unsigned long brk) 
  2.    unsigned long rlim, retval; 
  3.    unsigned long newbrk, oldbrk; 
  4.    struct mm_struct *mm = current->mm; 
  5.   ... 
  6.    down_write(&mm->mmap_sem);  // 對內存管理對象進行上鎖 
  7.   ... 
  8.    // 判斷堆空間的大小是否超出限制, 如果超出限制, 就不進行處理 
  9.    rlim = current->signal->rlim[RLIMIT_DATA].rlim_cur; 
  10.    if (rlim < RLIM_INFINITY 
  11.        && (brk - mm->start_brk) + (mm->end_data - mm->start_data) > rlim) 
  12.        goto out
  13.  
  14.    newbrk = PAGE_ALIGN(brk);      // 新的brk值 
  15.    oldbrk = PAGE_ALIGN(mm->brk);  // 舊的brk值 
  16.    if (oldbrk == newbrk)          // 如果新舊的位置都一樣, 就不需要進行處理 
  17.        goto set_brk; 
  18.   ... 
  19.    // 調用 do_brk 函數進行下一步處理 
  20.    if (do_brk(oldbrk, newbrk-oldbrk) != oldbrk) 
  21.        goto out
  22.  
  23. set_brk: 
  24.    mm->brk = brk; // 設置堆空間的頂部位置(brk指針) 
  25. out
  26.    retval = mm->brk; 
  27.    up_write(&mm->mmap_sem); 
  28.    return retval; 

總結上面的代碼,主要有以下幾個步驟:

1、判斷堆空間的大小是否超出限制,如果超出限制,就不作任何處理,直接返回舊的 brk 值。

2、如果新的 brk 值跟舊的 brk 值一致,那么也不用作任何處理。

3、如果新的 brk 值發生變化,那么就調用 do_brk 函數進行下一步處理。

4、設置進程的 brk 指針(堆空間頂部)為新的 brk 的值。

我們看到第 3 步調用了 do_brk 函數來處理,do_brk 函數的實現有點小復雜,所以這里介紹一下大概處理流程:

  1. 通過堆空間的起始地址 start_brk 從進程內存分區紅黑樹中找到其對應的內存分區對象(也就是 vm_area_struct)。
  2. 把堆空間的內存分區對象的 vm_end 字段設置為新的 brk 值。

至此,brk 系統調用的工作就完成了(上面沒有分析釋放內存的情況),總結來說,brk 系統調用的工作主要有兩部分:

把進程的 brk 指針設置為新的 brk 值。

把堆空間的內存分區對象的 vm_end 字段設置為新的 brk 值。

物理內存分配

從上面的分析知道,brk 系統調用申請的是 虛擬內存,但存儲數據只能使用 物理內存。所以,虛擬內存必須映射到物理內存才能被使用。

那么什么時候才進行內存映射呢?

在《你真的理解內存分配》一文中介紹過,當對沒有映射的虛擬內存地址進行讀寫操作時,CPU 將會觸發 缺頁異常。內核接收到 缺頁異常 后, 會調用 do_page_fault 函數進行修復。

我們來分析一下 do_page_fault 函數的實現(精簡后):

  1. void do_page_fault(struct pt_regs *regs, unsigned long error_code) 
  2.    struct vm_area_struct *vma; 
  3.    struct task_struct *tsk; 
  4.    unsigned long address; 
  5.    struct mm_struct *mm; 
  6.    int write; 
  7.    int fault; 
  8.  
  9.    tsk = current
  10.    mm = tsk->mm; 
  11.  
  12.    address = read_cr2(); // 獲取導致頁缺失異常的虛擬內存地址 
  13.   ... 
  14.    vma = find_vma(mm, address); // 通過虛擬內存地址從進程內存分區中查找對應的內存分區對象 
  15.   ... 
  16.    if (likely(vma->vm_start <= address)) // 如果找到內存分區對象 
  17.        goto good_area; 
  18.   ... 
  19.  
  20. good_area: 
  21.    write = error_code & PF_WRITE; 
  22.   ... 
  23.    // 調用 handle_mm_fault 函數對虛擬內存地址進行映射操作 
  24.    fault = handle_mm_fault(mm, vma, address, write ? FAULT_FLAG_WRITE : 0); 
  25.   ... 

do_page_fault 函數主要完成以下操作:

獲取導致頁缺失異常的虛擬內存地址,保存到 address 變量中。

調用 find_vma 函數從進程內存分區中查找異常的虛擬內存地址對應的內存分區對象。

如果找到內存分區對象,那么調用 handle_mm_fault 函數對虛擬內存地址進行映射操作。

從上面的分析可知,對虛擬內存進行映射操作是通過 handle_mm_fault 函數完成的,而 handle_mm_fault 函數的主要工作就是完成對進程 頁表 的填充。

我們通過 圖3 來理解內存映射的原理,可以參考文章《一文讀懂 HugePages的原理》:

下面我們來分析一下 handle_mm_fault 的實現,代碼如下:

  1. int handle_mm_fault(struct mm_struct *mm, struct vm_area_struct *vma, 
  2.                    unsigned long address, unsigned int flags) 
  3.    pgd_t *pgd;  // 頁全局目錄項 
  4.    pud_t *pud;  // 頁上級目錄項 
  5.    pmd_t *pmd;  // 頁中間目錄項 
  6.    pte_t *pte;  // 頁表項 
  7.   ... 
  8.    pgd = pgd_offset(mm, address);         // 獲取虛擬內存地址對應的頁全局目錄項 
  9.    pud = pud_alloc(mm, pgd, address);     // 獲取虛擬內存地址對應的頁上級目錄項 
  10.   ... 
  11.    pmd = pmd_alloc(mm, pud, address);     // 獲取虛擬內存地址對應的頁中間目錄項 
  12.   ... 
  13.    pte = pte_alloc_map(mm, pmd, address); // 獲取虛擬內存地址對應的頁表項 
  14.   ... 
  15.    // 對頁表項進行映射 
  16.    return handle_pte_fault(mm, vma, address, pte, pmd, flags); 
  17. 18} 

handle_mm_fault 函數主要對每一級的頁表進行映射(對照 圖3 就容易理解),最終調用 handle_pte_fault 函數對 頁表項 進行映射。

我們繼續來分析 handle_pte_fault 函數的實現,代碼如下:

  1. static inline int 
  2. handle_pte_fault(struct mm_struct *mm, struct vm_area_struct *vma, 
  3.                 unsigned long address, pte_t *pte, pmd_t *pmd, 
  4.                 unsigned int flags) 
  5.    pte_t entry; 
  6.  
  7.    entry = *pte; 
  8.  
  9.    if (!pte_present(entry)) { // 還沒有映射到物理內存 
  10.        if (pte_none(entry)) { 
  11.           ... 
  12.            // 調用 do_anonymous_page 函數進行匿名頁映射(堆空間就是使用匿名頁) 
  13.            return do_anonymous_page(mm, vma, address, pte, pmd, flags); 
  14.       } 
  15.       ... 
  16.   } 
  17.   ... 

上面代碼簡化了很多與本文無關的邏輯。從上面代碼可以看出,handle_pte_fault 函數最終會調用 do_anonymous_page 來完成內存映射操作,我們接著來分析下 do_anonymous_page 函數的實現:

  1. static int 
  2. do_anonymous_page(struct mm_struct *mm, struct vm_area_struct *vma, 
  3.                  unsigned long address, pte_t *page_table, pmd_t *pmd, 
  4.                  unsigned int flags) 
  5.    struct page *page; 
  6.    spinlock_t *ptl; 
  7.    pte_t entry; 
  8.  
  9.    if (!(flags & FAULT_FLAG_WRITE)) { // 如果是讀操作導致的異常 
  10.        // 使用 `零頁` 進行映射 
  11.        entry = pte_mkspecial(pfn_pte(my_zero_pfn(address), vma->vm_page_prot)); 
  12.       ... 
  13.        goto setpte; 
  14.   } 
  15.   ... 
  16.    // 如果是寫操作導致的異常 
  17.    // 申請一塊新的物理內存頁 
  18.    page = alloc_zeroed_user_highpage_movable(vma, address); 
  19.   ... 
  20.    // 根據物理內存頁的地址生成映射關系 
  21.    entry = mk_pte(page, vma->vm_page_prot); 
  22.    if (vma->vm_flags & VM_WRITE) 
  23.        entry = pte_mkwrite(pte_mkdirty(entry)); 
  24.   ... 
  25. setpte: 
  26.    set_pte_at(mm, address, page_table, entry); // 設置頁表項為新的映射關系 
  27.   ... 
  28.    return 0; 

do_anonymous_page 函數的實現比較有趣,它會根據 缺頁異常 是由讀操作還是寫操作導致的,分為兩個不同的處理邏輯,如下:

如果是讀操作導致的,那么將會使用 零頁 進行映射(零頁 是 Linux 內核中一個比較特殊的內存頁,所有讀操作引起的 缺頁異常 都會指向此頁,從而可以減少物理內存的消耗),并且設置其為只讀(因為 零頁 是不能進行寫操作)。如果下次對此頁進行寫操作,將會觸發寫操作的 缺頁異常,從而進入下面步驟。

如果是寫操作導致的,就申請一塊新的物理內存頁,然后根據物理內存頁的地址生成映射關系,再對頁表項進行填充(映射)。

總結

 

本文主要介紹了 Linux 內存分配的整個過程,當然只是介紹從堆空間分配的內存的過程。Linux 分配內存的方式還有很多,比如 mmap、HugePages 等,有興趣的可以查閱相關的資料和書籍。

 

責任編輯:武曉燕 來源: Linux內核那些事
相關推薦

2025-06-09 04:00:00

2021-02-11 14:06:38

Linux內核內存

2010-06-17 13:10:09

Linux Grub修

2021-08-04 16:06:45

DataOps智領云

2023-12-22 19:59:15

2021-11-02 10:53:56

Linux機制CPU

2011-02-22 10:46:02

Samba配置

2021-04-30 19:53:53

HugePages大內存頁物理

2023-11-27 17:35:48

ComponentWeb外層

2022-07-05 06:30:54

云網絡網絡云原生

2023-05-20 17:58:31

低代碼軟件

2022-10-20 08:01:23

2022-12-01 17:23:45

2021-12-29 18:00:19

無損網絡網絡通信網絡

2025-10-14 09:01:20

2022-07-26 00:00:03

語言模型人工智能

2022-09-22 09:00:46

CSS單位

2018-09-28 14:06:25

前端緩存后端

2025-04-03 10:56:47

2022-11-06 21:14:02

數據驅動架構數據
點贊
收藏

51CTO技術棧公眾號

欧美极品jizzhd欧美仙踪林| 九一免费在线观看| 亚洲永久精品视频| 一区二区亚洲| 有码中文亚洲精品| 69久久精品无码一区二区| 国产夫妻在线| 中文字幕在线免费不卡| 国产精品亚洲不卡a| 成人黄色三级视频| 欧美日韩国产成人精品| 伊人久久久久久久久久久久久| 中文字幕亚洲影院| 中文字幕在线看片| 亚洲综合一二三区| 色99中文字幕| 天堂а√在线8种子蜜桃视频| 毛片一区二区三区| 日本高清视频精品| 欧美一级高潮片| 我不卡伦不卡影院| 国产亚洲激情视频在线| 美女扒开腿免费视频| 国产成人免费| 一本到不卡精品视频在线观看| 中文字幕中文字幕一区三区| 奇米影视888狠狠狠777不卡| 国产成人一区二区精品非洲| 国产色综合天天综合网| 无码人妻aⅴ一区二区三区有奶水| 欧美激情第8页| 日日狠狠久久偷偷四色综合免费| 欧美色图亚洲激情| 欧美福利在线播放网址导航| 日韩精品一区二| 日韩av片专区| 99久久伊人| 欧美性猛交xxxx乱大交极品| 欧美大片在线播放| 1234区中文字幕在线观看| 亚洲黄色免费网站| 精品一区二区成人免费视频| av在线免费观看网站| 久久久美女毛片| 久久精品国产一区二区三区不卡| 丰满岳乱妇国产精品一区| 国产精品夜夜嗨| 97中文在线观看| 国产成人三级在线播放| 国产精品影视网| 99久久综合狠狠综合久久止| 国产99对白在线播放| 国产乱理伦片在线观看夜一区| 91精品在线观| 91禁在线观看| 国产乱码字幕精品高清av| 91一区二区三区| 黄色av网址在线| 成人av网址在线观看| 国产欧美日韩一区| 日本国产在线| 亚洲国产经典视频| 在线不卡日本| 午夜影院免费在线| 亚洲国产一区二区三区| av免费观看大全| 伊人久久在线| 欧美日韩一级二级三级| 992kp免费看片| 草莓视频一区二区三区| 日韩精品在线视频观看| 久久久久久久毛片| 99精品视频在线| 欧美激情一区二区三区成人| 欧美成人aaaaⅴ片在线看| 亚洲专区免费| 国产精品亚洲аv天堂网| 国产伦子伦对白视频| 丰满少妇久久久久久久| 欧美二区三区在线| 麻豆传媒视频在线观看| 亚洲一区在线电影| 99色精品视频| 成人精品视频在线观看| 精品1区2区在线观看| 国产精品无码永久免费不卡| 日韩av久操| 欧美黄色小视频| 日批视频免费在线观看| 久久99精品久久久久| 国产一级二级三级精品| 激情小视频在线| 一区二区三区在线免费播放 | 韩国av中国字幕| 天天久久夜夜| 北条麻妃在线一区二区| 日产精品久久久久久久| 奇米亚洲午夜久久精品| 国产精品伊人日日| 1024免费在线视频| 午夜久久久久久电影| 美女网站免费观看视频| 清纯唯美激情亚洲| 国产亚洲精品高潮| 久久免费精彩视频| 久久99久国产精品黄毛片色诱| 国产欧美在线一区二区| 日本激情视频在线观看| 欧美日韩在线影院| 韩国三级hd中文字幕有哪些| 国产日产精品_国产精品毛片| 欧美精品免费看| 91麻豆精品在线| 91亚洲午夜精品久久久久久| 米仓穗香在线观看| 97欧美成人| 亚洲欧美制服中文字幕| 久久久国产精品黄毛片| 美腿丝袜亚洲综合| 欧美一区少妇| 亚洲天堂av影院| 亚洲精品一线二线三线无人区| 成年人免费视频播放| 久久一区中文字幕| 精品久久中出| 波多野结依一区| 欧美一区二区人人喊爽| 精品伦精品一区二区三区视频密桃| 一本久久综合| 国产精品久久波多野结衣| 国产视频中文字幕在线观看| 欧美影视一区在线| www在线观看免费视频| 亚洲美女网站| 激情欧美一区二区三区中文字幕| 中文字幕资源网在线观看| 欧美日韩国产另类不卡| 日韩视频在线观看免费视频| 亚洲在线一区| 欧美一区国产一区| 性欧美videohd高精| 亚洲男人天堂2024| 亚洲中文字幕无码av| 羞羞视频在线免费国产| 欧美午夜无遮挡| 337p日本欧洲亚洲大胆张筱雨| 波多野结衣一区| 日本精品久久电影| 三级在线观看| 欧美日韩激情视频| 岛国av免费观看| 欧美三区在线| 高清av免费一区中文字幕| 操你啦视频在线| 欧美一级日韩不卡播放免费| 老司机福利在线观看| 日本亚洲一区二区| 亚洲 国产 欧美一区| 香蕉成人影院| 中文字幕久热精品在线视频| 中文字幕免费高清在线观看| 国产精品嫩草影院av蜜臀| 亚洲综合日韩欧美| 在线精品视频在线观看高清| 91沈先生作品| 秋霞在线午夜| 亚洲国产欧美一区二区丝袜黑人| 国产精品9191| 久久一夜天堂av一区二区三区| 国产日韩一区二区在线观看| 国产麻豆精品久久| 国产精品视频中文字幕91| 国产视频一区二区| 亚洲国产高清自拍| 国产一级一级国产| 亚洲欧洲精品一区二区精品久久久| 色噜噜狠狠一区二区三区狼国成人| 欧美在线首页| 欧美lavv| 日韩欧国产精品一区综合无码| 欧美成人全部免费| 视频在线不卡| 欧美精选一区二区| 国产无码精品久久久| 久久欧美中文字幕| 国产精品久久久久久久99| 亚洲性图久久| 日韩三级电影免费观看| 久久久国产精品入口麻豆| 97在线视频观看| eeuss影院在线播放| 欧美一级二级三级蜜桃| 亚州国产精品视频| 国产精品视频在线看| 久久综合桃花网| 免费在线亚洲| 日本三日本三级少妇三级66| 奇米777国产一区国产二区| 国产欧美精品日韩| 欧产日产国产精品视频| 久久国产一区二区三区| 午夜影院免费视频| 91精品欧美一区二区三区综合在| 在线观看 中文字幕| 国产精品免费av| 中文在线一区二区三区| 国产一区二区美女诱惑| 成人在线观看a| 亚洲一级网站| 992tv成人免费观看| 久久成人av| 国产精品一 二 三| 成人豆花视频| 国产美女搞久久| 日本免费久久| 午夜精品一区二区三区在线播放| 免费黄色网页在线观看| 亚洲片国产一区一级在线观看| 超碰在线播放97| 欧美精品九九99久久| 久久国产视频精品| 亚洲成人福利片| 国产盗摄x88av| 国产精品国产三级国产| 久久精品老司机| 成人av在线资源网站| 在线观看网站黄| 激情综合一区二区三区| 天天干天天综合| 久久激情一区| 国产99久久九九精品无码| 黄色亚洲免费| 三级在线免费观看| 国产精品精品| 超碰成人在线免费观看| 欧美成人激情| 一区二区三区视频| 欧美色图在线播放| 日韩美女一区| 欧美先锋资源| 亚洲国产午夜伦理片大全在线观看网站| 中文字幕伦av一区二区邻居| 久久超碰亚洲| 亚洲精品亚洲人成在线观看| 国内精品久久久久久久果冻传媒| 一区二区三区高清在线观看| 亚洲a级在线播放观看| av在线亚洲一区| 91精品在线一区| 韩国三级大全久久网站| 亚洲一区久久久| 免费观看性欧美大片无片| 亚洲free性xxxx护士白浆| 高清久久精品| 超碰97在线人人| 欧美成人午夜77777| 精品日本一区二区| 蜜桃tv一区二区三区| 欧美一区二区三区四区在线观看地址| 久草在线成人| 亚洲一区二区在| 欧美精品不卡| 国产成人无码精品久久久性色| 亚洲专区一区| 久久黄色片网站| 国产精品主播直播| 影音先锋黄色资源| 国产亚洲综合色| 99自拍视频在线| 亚洲影院在线观看| 亚洲精品午夜国产va久久成人| 色系网站成人免费| 在线免费观看一区二区| 日韩欧美国产精品一区| 亚洲av成人精品一区二区三区在线播放 | 国产精品视频男人的天堂| 国产第一亚洲| 99蜜桃在线观看免费视频网站| 国产一级成人av| 亚洲欧美成人一区| 国内揄拍国内精品久久| 成人免费观看视频在线观看| 免费成人av在线| 中文字幕在线观看91| 国产午夜精品一区二区| 97成人资源站| 日韩欧美主播在线| 国产精品无码专区av免费播放| 精品久久久网站| 91在线网址| 国内精品久久久久伊人av| 欧美人体一区二区三区| 97人人模人人爽人人喊38tv| 在线日韩一区| 亚洲精品天堂成人片av在线播放| 久久动漫亚洲| 日韩精品xxx| 国产欧美日韩三区| 国产午夜精品无码一区二区| 欧美午夜免费电影| 可以免费观看的毛片| 日韩中文在线中文网在线观看| 日本动漫同人动漫在线观看| 国产精品99久久久久久www| 亚洲精品aⅴ| 亚洲国产一区在线| 免费欧美日韩| 国产chinese中国hdxxxx| 亚洲欧洲av色图| 伊人中文字幕在线观看| 欧美久久久久久久久中文字幕| 欧美理论在线观看| 久久久久久久97| 成人av在线播放| 日韩区国产区| 天堂久久久久va久久久久| 日批视频免费看| 亚洲同性gay激情无套| 少妇无套内谢久久久久| 亚洲精品一区二区在线| 国产后进白嫩翘臀在线观看视频| 国产日本欧美视频| 精品盗摄女厕tp美女嘘嘘| 欧美大片在线播放| 成人一区二区三区中文字幕| 91传媒免费观看| 欧美视频一二三区| 国产在线免费观看| 国产91色在线| 九一亚洲精品| 成人综合视频在线| 99久久免费精品| 国产精品999久久久| 欧美成人欧美edvon| 18+视频在线观看| 亚洲一区免费网站| 亚洲女同一区| 999热精品视频| 亚洲日本va在线观看| 91精品国自产| 久久久99久久精品女同性| 久久影视精品| 中文字幕人成一区| 久久99精品国产麻豆婷婷洗澡| 中文天堂资源在线| 欧美日本一区二区| 日本蜜桃在线观看| 亚洲a在线观看| 激情欧美一区| 国产精品一级黄片| 91成人在线精品| 岛国视频免费在线观看| 国产精品久久久久福利| 91综合久久一区二区| 日本精品一区在线| 亚洲在线视频一区| 日本在线视频1区| 国产成人精品电影| 精品久久久久中文字幕小说| 手机在线免费观看毛片| 国产精品久久一级| xxxx国产精品| 欧美一级淫片丝袜脚交| 九九亚洲视频| 五月天婷婷影视| 亚洲一区二区在线视频| 污污网站在线免费观看| 国产不卡视频在线| 婷婷亚洲五月| 国产一卡二卡三卡四卡| 色婷婷久久久综合中文字幕| 成人性爱视频在线观看| 91久久久久久久久久| 伊人久久大香线蕉av超碰演员| 久久久国产精品无码| 欧美性高清videossexo| 超碰caoporn久久| 裸体丰满少妇做受久久99精品| 日韩电影一二三区| 久久精品视频免费在线观看| 亚洲国产三级网| 国产极品嫩模在线观看91精品| 国产精品无码乱伦| www.欧美日韩国产在线| 影音先锋国产在线| 欧美激情精品久久久久久久变态| 日韩av网址大全| 色婷婷激情视频| 日韩欧美亚洲成人| 91小视频xxxx网站在线| 免费观看成人在线| 国产一二精品视频| 精品不卡一区二区| 九九久久久久久久久激情| 九九热线有精品视频99| 无码国产精品一区二区高潮| 欧美性少妇18aaaa视频| 在线观看的网站你懂的| 日本一区二区不卡高清更新| 国产99久久久国产精品潘金网站|