国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

一文讀懂 Linux 內(nèi)存分配全過程

系統(tǒng) Linux
本文主要介紹了 Linux 內(nèi)存分配的整個(gè)過程,當(dāng)然只是介紹從堆空間分配的內(nèi)存的過程。

[[395418]]

本文轉(zhuǎn)載自微信公眾號(hào)「Linux內(nèi)核那些事」,作者songsong001。轉(zhuǎn)載本文請聯(lián)系Linux內(nèi)核那些事公眾號(hào)。  

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

本文使用 Linux 2.6.32 版本代碼

內(nèi)存分區(qū)對(duì)象

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

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

我們對(duì) vm_area_struct 對(duì)象進(jìn)行了簡化,只保留了本文需要的字段。

內(nèi)核就是使用 vm_area_struct 對(duì)象來記錄一個(gè)內(nèi)存分區(qū)(如 代碼段、數(shù)據(jù)段 和 堆空間 等),下面介紹一下 vm_area_struct 對(duì)象各個(gè)字段的作用:

  • vm_mm:指定了當(dāng)前內(nèi)存分區(qū)所屬的內(nèi)存管理對(duì)象。
  • vm_start:內(nèi)存分區(qū)的開始地址。
  • vm_end:內(nèi)存分區(qū)的結(jié)束地址。
  • vm_next:通過這個(gè)指針把進(jìn)程中所有的內(nèi)存分區(qū)連接成一個(gè)鏈表。
  • vm_rb:另外,為了快速查找內(nèi)存分區(qū),內(nèi)核還把進(jìn)程的所有內(nèi)存分區(qū)保存到一棵紅黑樹中。vm_rb 就是紅黑樹的節(jié)點(diǎn),用于把內(nèi)存分區(qū)保存到紅黑樹中。

假如進(jìn)程 A 現(xiàn)在有 4 個(gè)內(nèi)存分區(qū),它們的范圍如下:

  • 代碼段:00400000 ~ 00401000
  • 數(shù)據(jù)段:00600000 ~ 00601000
  • 堆空間:00983000 ~ 009a4000
  • 棧空間:7f37ce866000 ~ 7f3fce867000

那么這 4 個(gè)內(nèi)存分區(qū)在內(nèi)核中的結(jié)構(gòu)如 圖1 所示:

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

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

我們來介紹下 mm_struct 對(duì)象各個(gè)字段的作用:

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

我們來回顧一下進(jìn)程虛擬內(nèi)存空間的布局圖,如 圖2 所示:

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

虛擬內(nèi)存分配

在《你真的理解內(nèi)存分配》一文中說過,調(diào)用 malloc 申請內(nèi)存時(shí),最終會(huì)調(diào)用 brk 系統(tǒng)調(diào)用來從堆空間中分配內(nèi)存。我們來分析一下 brk 系統(tǒng)調(diào)用的實(shí)現(xiàn):

  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);  // 對(duì)內(nèi)存管理對(duì)象進(jìn)行上鎖 
  7.   ... 
  8.    // 判斷堆空間的大小是否超出限制, 如果超出限制, 就不進(jìn)行處理 
  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)          // 如果新舊的位置都一樣, 就不需要進(jìn)行處理 
  17.        goto set_brk; 
  18.   ... 
  19.    // 調(diào)用 do_brk 函數(shù)進(jìn)行下一步處理 
  20.    if (do_brk(oldbrk, newbrk-oldbrk) != oldbrk) 
  21.        goto out
  22.  
  23. set_brk: 
  24.    mm->brk = brk; // 設(shè)置堆空間的頂部位置(brk指針) 
  25. out
  26.    retval = mm->brk; 
  27.    up_write(&mm->mmap_sem); 
  28.    return retval; 

總結(jié)上面的代碼,主要有以下幾個(gè)步驟:

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

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

3、如果新的 brk 值發(fā)生變化,那么就調(diào)用 do_brk 函數(shù)進(jìn)行下一步處理。

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

我們看到第 3 步調(diào)用了 do_brk 函數(shù)來處理,do_brk 函數(shù)的實(shí)現(xiàn)有點(diǎn)小復(fù)雜,所以這里介紹一下大概處理流程:

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

至此,brk 系統(tǒng)調(diào)用的工作就完成了(上面沒有分析釋放內(nèi)存的情況),總結(jié)來說,brk 系統(tǒng)調(diào)用的工作主要有兩部分:

把進(jìn)程的 brk 指針設(shè)置為新的 brk 值。

把堆空間的內(nèi)存分區(qū)對(duì)象的 vm_end 字段設(shè)置為新的 brk 值。

物理內(nèi)存分配

從上面的分析知道,brk 系統(tǒng)調(diào)用申請的是 虛擬內(nèi)存,但存儲(chǔ)數(shù)據(jù)只能使用 物理內(nèi)存。所以,虛擬內(nèi)存必須映射到物理內(nèi)存才能被使用。

那么什么時(shí)候才進(jìn)行內(nèi)存映射呢?

在《你真的理解內(nèi)存分配》一文中介紹過,當(dāng)對(duì)沒有映射的虛擬內(nèi)存地址進(jìn)行讀寫操作時(shí),CPU 將會(huì)觸發(fā) 缺頁異常。內(nèi)核接收到 缺頁異常 后, 會(huì)調(diào)用 do_page_fault 函數(shù)進(jìn)行修復(fù)。

我們來分析一下 do_page_fault 函數(shù)的實(shí)現(xiàn)(精簡后):

  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(); // 獲取導(dǎo)致頁缺失異常的虛擬內(nèi)存地址 
  13.   ... 
  14.    vma = find_vma(mm, address); // 通過虛擬內(nèi)存地址從進(jìn)程內(nèi)存分區(qū)中查找對(duì)應(yīng)的內(nèi)存分區(qū)對(duì)象 
  15.   ... 
  16.    if (likely(vma->vm_start <= address)) // 如果找到內(nèi)存分區(qū)對(duì)象 
  17.        goto good_area; 
  18.   ... 
  19.  
  20. good_area: 
  21.    write = error_code & PF_WRITE; 
  22.   ... 
  23.    // 調(diào)用 handle_mm_fault 函數(shù)對(duì)虛擬內(nèi)存地址進(jìn)行映射操作 
  24.    fault = handle_mm_fault(mm, vma, address, write ? FAULT_FLAG_WRITE : 0); 
  25.   ... 

do_page_fault 函數(shù)主要完成以下操作:

獲取導(dǎo)致頁缺失異常的虛擬內(nèi)存地址,保存到 address 變量中。

調(diào)用 find_vma 函數(shù)從進(jìn)程內(nèi)存分區(qū)中查找異常的虛擬內(nèi)存地址對(duì)應(yīng)的內(nèi)存分區(qū)對(duì)象。

如果找到內(nèi)存分區(qū)對(duì)象,那么調(diào)用 handle_mm_fault 函數(shù)對(duì)虛擬內(nèi)存地址進(jìn)行映射操作。

從上面的分析可知,對(duì)虛擬內(nèi)存進(jìn)行映射操作是通過 handle_mm_fault 函數(shù)完成的,而 handle_mm_fault 函數(shù)的主要工作就是完成對(duì)進(jìn)程 頁表 的填充。

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

下面我們來分析一下 handle_mm_fault 的實(shí)現(xiàn),代碼如下:

  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;  // 頁全局目錄項(xiàng) 
  4.    pud_t *pud;  // 頁上級(jí)目錄項(xiàng) 
  5.    pmd_t *pmd;  // 頁中間目錄項(xiàng) 
  6.    pte_t *pte;  // 頁表項(xiàng) 
  7.   ... 
  8.    pgd = pgd_offset(mm, address);         // 獲取虛擬內(nèi)存地址對(duì)應(yīng)的頁全局目錄項(xiàng) 
  9.    pud = pud_alloc(mm, pgd, address);     // 獲取虛擬內(nèi)存地址對(duì)應(yīng)的頁上級(jí)目錄項(xiàng) 
  10.   ... 
  11.    pmd = pmd_alloc(mm, pud, address);     // 獲取虛擬內(nèi)存地址對(duì)應(yīng)的頁中間目錄項(xiàng) 
  12.   ... 
  13.    pte = pte_alloc_map(mm, pmd, address); // 獲取虛擬內(nèi)存地址對(duì)應(yīng)的頁表項(xiàng) 
  14.   ... 
  15.    // 對(duì)頁表項(xiàng)進(jìn)行映射 
  16.    return handle_pte_fault(mm, vma, address, pte, pmd, flags); 
  17. 18} 

handle_mm_fault 函數(shù)主要對(duì)每一級(jí)的頁表進(jìn)行映射(對(duì)照 圖3 就容易理解),最終調(diào)用 handle_pte_fault 函數(shù)對(duì) 頁表項(xiàng) 進(jìn)行映射。

我們繼續(xù)來分析 handle_pte_fault 函數(shù)的實(shí)現(xiàn),代碼如下:

  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)) { // 還沒有映射到物理內(nèi)存 
  10.        if (pte_none(entry)) { 
  11.           ... 
  12.            // 調(diào)用 do_anonymous_page 函數(shù)進(jìn)行匿名頁映射(堆空間就是使用匿名頁) 
  13.            return do_anonymous_page(mm, vma, address, pte, pmd, flags); 
  14.       } 
  15.       ... 
  16.   } 
  17.   ... 

上面代碼簡化了很多與本文無關(guān)的邏輯。從上面代碼可以看出,handle_pte_fault 函數(shù)最終會(huì)調(diào)用 do_anonymous_page 來完成內(nèi)存映射操作,我們接著來分析下 do_anonymous_page 函數(shù)的實(shí)現(xiàn):

  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)) { // 如果是讀操作導(dǎo)致的異常 
  10.        // 使用 `零頁` 進(jìn)行映射 
  11.        entry = pte_mkspecial(pfn_pte(my_zero_pfn(address), vma->vm_page_prot)); 
  12.       ... 
  13.        goto setpte; 
  14.   } 
  15.   ... 
  16.    // 如果是寫操作導(dǎo)致的異常 
  17.    // 申請一塊新的物理內(nèi)存頁 
  18.    page = alloc_zeroed_user_highpage_movable(vma, address); 
  19.   ... 
  20.    // 根據(jù)物理內(nèi)存頁的地址生成映射關(guān)系 
  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); // 設(shè)置頁表項(xiàng)為新的映射關(guān)系 
  27.   ... 
  28.    return 0; 

do_anonymous_page 函數(shù)的實(shí)現(xiàn)比較有趣,它會(huì)根據(jù) 缺頁異常 是由讀操作還是寫操作導(dǎo)致的,分為兩個(gè)不同的處理邏輯,如下:

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

如果是寫操作導(dǎo)致的,就申請一塊新的物理內(nèi)存頁,然后根據(jù)物理內(nèi)存頁的地址生成映射關(guān)系,再對(duì)頁表項(xiàng)進(jìn)行填充(映射)。

總結(jié)

 

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

 

責(zé)任編輯:武曉燕 來源: Linux內(nèi)核那些事
相關(guān)推薦

2025-06-09 04:00:00

2021-02-11 14:06:38

Linux內(nèi)核內(nèi)存

2010-06-17 13:10:09

Linux Grub修

2023-12-22 19:59:15

2021-08-04 16:06:45

DataOps智領(lǐng)云

2011-02-22 10:46:02

Samba配置

2021-11-02 10:53:56

Linux機(jī)制CPU

2021-04-30 19:53:53

HugePages大內(nèi)存頁物理

2023-11-27 17:35:48

ComponentWeb外層

2023-05-20 17:58:31

低代碼軟件

2022-07-05 06:30:54

云網(wǎng)絡(luò)網(wǎng)絡(luò)云原生

2021-12-29 18:00:19

無損網(wǎng)絡(luò)網(wǎng)絡(luò)通信網(wǎng)絡(luò)

2022-10-20 08:01:23

2025-10-14 09:01:20

2022-12-01 17:23:45

2022-07-26 00:00:03

語言模型人工智能

2021-10-20 07:18:51

Linux延時(shí)隊(duì)列

2022-09-22 09:00:46

CSS單位

2022-11-06 21:14:02

數(shù)據(jù)驅(qū)動(dòng)架構(gòu)數(shù)據(jù)

2025-04-03 10:56:47

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

97免费高清电视剧观看| 在线a人片免费观看视频| 国产区精品区| 在线成人高清不卡| 成年人免费网站| 国产精品一级在线| 国产乱码精品一区二区三区中文 | 伊人国产在线| 91免费版在线看| 亚洲欧美综合一区| 欧美va天堂在线| 欧美综合一区第一页| 不卡一二三区| 欧美mv和日韩mv国产网站| 四虎精品在永久在线观看| 国产精品久久久久天堂| 久久免费一级片| 久久精品一区| 国产精品xxxx| 欧美国产激情| 成人精品久久av网站| 久久精品国产亚洲blacked| 中文在线不卡视频| 天堂在线中文网官网| 日韩亚洲电影在线| 国产高清免费av在线| 亚洲午夜私人影院| 男女18免费网站视频| 亚洲国产成人私人影院tom| 国产精品无码一区二区在线| 久久国产精品99久久久久久老狼 | 国产精品少妇自拍| 亚洲 欧美 日韩 国产综合 在线 | 青青草原国产免费| 久久只有精品| 久久久久se| 亚洲精品美女91| 亚洲一区二区三区毛片 | 农民人伦一区二区三区| 国产中文一区二区三区| 亚州欧美一区三区三区在线| 日韩成人一区二区| 欧美一区二区综合| 男女性色大片免费观看一区二区| 欧美下载看逼逼| 捆绑调教美女网站视频一区| 四虎精品欧美一区二区免费| 不卡的av网站| 亚洲成人av免费看| 一区二区三区欧美激情| 在线欧美成人| 欧美日本在线视频| heyzo高清中文字幕在线| 日韩精品免费视频| 日韩免费大片| 69久久夜色精品国产7777| 精品国产视频| 国产精品有限公司| 蜜桃视频一区二区三区| 18禁裸男晨勃露j毛免费观看| 不卡一区二区在线| 黄色成人免费观看| 高跟丝袜一区二区三区| 韩国av网站在线| 亚洲深夜福利视频| caoporn成人| 91精品国产自产在线观看永久| 一区精品久久| 一二三在线视频| 国产日韩av一区| 在线观看一级片| 日韩三级视频中文字幕| 国产精品蜜月aⅴ在线| 97成人在线视频| 欧美国产精品| 日本一本草久p| 亚洲欧洲无码一区二区三区| 久热av在线| 亚洲欧美三级在线| 希岛爱理av免费一区二区| 国产精品午夜av在线| 国产精品亚洲一区二区三区在线 | 可以在线观看的av| 精品福利视频一区二区三区| 成人亚洲网站| 国产精品96久久久久久| 天堂在线亚洲视频| 狠狠热免费视频| 欧美三级日韩三级| 日韩免费在线电影| 99久久免费国| 成人午夜免费电影| 少妇激情av一区二区| 亚洲三级免费看| 欧美丰满日韩| av一区二区三区免费观看| 亚洲va欧美va人人爽| 涩涩av在线| 国产精品一区二区久久| 国产精品1区2区| 黄色国产在线| 久精品免费视频| 日韩电影在线免费观看| 伊人精彩视频| 伊人久久男人天堂| 欧美日韩少妇| 制服丝袜影音先锋| 亚洲午夜精品视频| 精品成人免费| 国产一级激情| 久久激情视频免费观看| 久久午夜精品| 在线看黄网站| 色中色综合影院手机版在线观看| 一本久久综合| 激情亚洲综合网| 亚洲一区av在线播放| 韩日精品在线| 香港三级经典全部种子下载| www.xxxx精品| 久久99久久久久| yw在线观看| 国产人妖伪娘一区91| 日本一区二区免费在线观看视频| 手机在线免费看av| 国产在线视频一区| 国产精品国产三级国产普通话99 | 久久激情五月激情| 男人天堂综合| 欧洲一区二区视频| 95精品视频在线| 忘忧草在线影院两性视频| 国产超碰91| 亚洲一级二级三级在线免费观看| 国产精品白丝久久av网站| 亚洲一区二区精品在线观看| 91成人免费电影| 成人羞羞网站| 黄色三级在线观看| 久久免费视频这里只有精品| 国产成人免费xxxxxxxx| eeuss鲁一区二区三区| 免费在线成人av电影| 欧美色图天堂网| 国内精品久久久久久久97牛牛| 情趣视频网站在线免费观看| 91高清视频免费观看| 一区视频在线播放| 日韩av系列| 交换国产精品视频一区| 69av在线播放| 亚洲三级久久久| 日韩大尺度在线观看| 美女xx视频| 国产高清在线不卡| 亚洲影院久久精品| 精品国产乱码久久久| 制服丝袜中文字幕在线观看| 国产精品91在线| 香蕉av福利精品导航| 日韩一区二区在线免费| 在线色视频网| 99国产超薄丝袜足j在线观看| 色婷婷久久久亚洲一区二区三区 | 日本高清不卡中文字幕| 欧美精品手机在线| 国产精品久久久久久妇女6080 | xxxxx日韩| 国产成人免费观看| 欧美三级三级三级爽爽爽| 亚洲免费网站| 大菠萝精品导航| 国产毛片久久久久久国产毛片| 色婷婷久久av| 国产精品美女久久久久aⅴ| 欧美电影免费网站| 在线观看理论片| 精品国产一区二区三区免费| 日韩精品一区二区三区中文精品| 韩国精品一区二区| 自拍偷拍欧美日韩| 嫩草影院官网| 国产欧美一区二区在线播放| 亚洲韩国欧洲国产日产av| 91网站在线播放| 色综合蜜月久久综合网| av毛片在线看| 欧美成人高潮一二区在线看| 欧美亚洲在线观看| 欧美丝袜自拍制服另类| 国产成人综合在线| 日本天堂一区| 黄在线免费看| 国产a视频免费观看| 国产在线视频一区| 亚洲激情视频在线播放| 最新日韩av在线| 亚洲一区中文| 日韩精品一区二区三区中文| 奇米影视888狠狠狠777不卡|