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

深入理解Linux內(nèi)核之主調(diào)度器(下)

系統(tǒng) Linux
前面選擇了一個(gè)合適進(jìn)程作為下一個(gè)進(jìn)程,接下來(lái)做重要的上下文切換動(dòng)作,來(lái)保存上一個(gè)進(jìn)程的“上下文”恢復(fù)下一個(gè)進(jìn)程的“上下文”,主要包括進(jìn)程地址空間切換和處理器狀態(tài)切換。

[[409218]]

本文轉(zhuǎn)載自微信公眾號(hào)「Linux內(nèi)核遠(yuǎn)航者」,作者Linux內(nèi)核遠(yuǎn)航者。轉(zhuǎn)載本文請(qǐng)聯(lián)系Linux內(nèi)核遠(yuǎn)航者公眾號(hào)。

4.進(jìn)程上下文切換

前面選擇了一個(gè)合適進(jìn)程作為下一個(gè)進(jìn)程,接下來(lái)做重要的上下文切換動(dòng)作,來(lái)保存上一個(gè)進(jìn)程的“上下文”恢復(fù)下一個(gè)進(jìn)程的“上下文”,主要包括進(jìn)程地址空間切換和處理器狀態(tài)切換。

注:這里的上下文實(shí)際上是指進(jìn)程運(yùn)行時(shí)最小寄存器的集合。

如果切換的next進(jìn)程不是同一個(gè)進(jìn)程,才進(jìn)行切換:

  1. __schedule 
  2.  i  f (likely(prev != next)) {       
  3.         ... 
  4.         context_switch  //進(jìn)程上下文切換 
  5.     } 

4.1 進(jìn)程地址空間切換

進(jìn)程地址空間切換就是切換虛擬地址空間,使得切換之后,當(dāng)前進(jìn)程訪問的是屬于自己的虛擬地址空間(包括用戶地址空間和內(nèi)核地址空間),本質(zhì)上是切換頁(yè)表基地址寄存器。

進(jìn)程地址空間切換讓進(jìn)程產(chǎn)生獨(dú)占系統(tǒng)內(nèi)存的錯(cuò)覺,因?yàn)榍袚Q完地址空間后,當(dāng)前進(jìn)程可以訪問屬于它的海量的虛擬地址空間(內(nèi)核地址空間各個(gè)進(jìn)程共享,用戶地址空間各個(gè)進(jìn)程私有),而實(shí)際上物理地址空間只有一份。

下面給出源代碼分析:

  1. context_switch 
  2. -> 
  3.  /* 
  4.  ¦* kernel -> kernel   lazy + transfer active 
  5.  ¦*   user -> kernel   lazy + mmgrab() active 
  6.  ¦* 
  7.  ¦* kernel ->   user   switch + mmdrop() active 
  8.  ¦*   user ->   user   switch 
  9.  ¦*/ 
  10.  if (!next->mm) {                                // to kernel 
  11.          enter_lazy_tlb(prev->active_mm, next); 
  12.  
  13.          next->active_mm = prev->active_mm; 
  14.          if (prev->mm)                           // from user 
  15.                  mmgrab(prev->active_mm); 
  16.          else 
  17.                  prev->active_mm = NULL
  18.  } else {                                        // to user 
  19.         ... 
  20.          switch_mm_irqs_off(prev->active_mm, next->mm, next); 
  21.  
  22.          if (!prev->mm) {                        // from kernel 
  23.                  /* will mmdrop() in finish_task_switch(). */ 
  24.                  rq->prev_mm = prev->active_mm; 
  25.                  prev->active_mm = NULL
  26.          }             
  27.  }                     
  28.                       

以上代碼是判斷是否next進(jìn)程是內(nèi)核線程,如果是則不需要進(jìn)行地址空間切換(實(shí)際上指的是用戶地址空間),因?yàn)閮?nèi)核線程總是運(yùn)行在內(nèi)核態(tài)訪問的是內(nèi)核地址空間,而內(nèi)核地址空間是所有的進(jìn)程共享的。在arm64架構(gòu)中,內(nèi)核地址空間是通過(guò)ttbr1_el1來(lái)訪問,而它的主內(nèi)核頁(yè)表在內(nèi)核初始化的時(shí)候已經(jīng)填充好了,也就是我們常說(shuō)的swapper_pg_dir頁(yè)表,后面所有對(duì)內(nèi)核地址空間的訪問,無(wú)論是內(nèi)核線程也好還是用戶任務(wù),統(tǒng)統(tǒng)通過(guò)swapper_pg_dir頁(yè)表來(lái)訪問,而在內(nèi)核初始化期間swapper_pg_dir頁(yè)表地址已經(jīng)加載到ttbr1_el1中。

需要說(shuō)明一點(diǎn)的是:這里會(huì)做“借用” prev->active_mm的處理,借用的目的是為了避免切換屬于同一個(gè)進(jìn)程的地址空間。舉例說(shuō)明:Ua -> Ka -> Ua ,Ua表示用戶進(jìn)程, Ka表示內(nèi)核線程,當(dāng)進(jìn)行這樣的切換的時(shí)候,Ka 借用Ua地址空間,Ua -> Ka不需要做地址空間切換,而Ka -> Ua按理來(lái)說(shuō)需要做地址空間切換,但是由于切換的還是Ua 地址空間,所以也不需要真正的切換(判斷了Ka->active_mm == Ua->active_mm ),當(dāng)然還包括切換的是同一個(gè)進(jìn)程的多個(gè)線程的情況,這留給大家思考。

下面來(lái)看下真正的地址空間切換:

  1. switch_mm_irqs_off(prev->active_mm, next->mm, next); 
  2. ->switch_mm  //arch/arm64/include/asm/mmu_context.h 
  3.    -> if (prev != next)  
  4.         __switch_mm(next); 
  5.           ->check_and_switch_context(next
  6.                -> ...  //asid處理 
  7.               -> cpu_switch_mm(mm->pgd, mm) 
  8.                   ->cpu_do_switch_mm(virt_to_phys(pgd),mm) 
  9.                         -> unsigned long ttbr1 = read_sysreg(ttbr1_el1);   
  10.                             unsigned long asid = ASID(mm);                  
  11.                             unsigned long ttbr0 = phys_to_ttbr(pgd_phys);   
  12.                             ... 
  13.                             write_sysreg(ttbr1, ttbr1_el1);   //設(shè)置asid到ttbr1_el1 
  14.                             isb();                             
  15.                             write_sysreg(ttbr0, ttbr0_el1);   //設(shè)置mm->pgd 到ttbr0_el1 

上面代碼是做真正的地址空間切換,實(shí)際的切換很簡(jiǎn)單,并沒有那么復(fù)雜和玄乎,僅僅設(shè)置頁(yè)表基地址寄存器即可,當(dāng)然這里還涉及到了為了防止頻繁無(wú)效tlb的ASID的設(shè)置。

主要做的工作就是設(shè)置next進(jìn)程的ASID到ttbr1_el1, 設(shè)置mm->pgd 到ttbr0_el1,僅此而已!

需要注意的是:1.寫到ttbr0_el1的值是進(jìn)程pgd頁(yè)表的物理地址。2.雖然做了這樣的切換,但是這個(gè)時(shí)候并不能訪問到next的用戶地址空間,因?yàn)檫€處在主調(diào)度器上下文中,屬于內(nèi)核態(tài),訪問的是內(nèi)核空間。

而一旦返回了用戶態(tài),next進(jìn)程就能正常訪問自己地址空間內(nèi)容:

  • 訪問一個(gè)用戶空間的虛擬地址va,首先通過(guò)va和記錄在ttbr1_el1的asid查詢tlb,如果找到相應(yīng)表項(xiàng)則獲得pa進(jìn)行訪問。
  • 如果tlb中沒有找到,通過(guò)ttbr0_el1來(lái)遍歷自己的多級(jí)頁(yè)表,找到相應(yīng)表項(xiàng)則獲得pa進(jìn)行訪問。
  • 如果發(fā)生中斷異常等訪問內(nèi)核地址空間,直接通過(guò)ttbr1_el1即可完成訪問。
  • 訪問沒有建立頁(yè)表映射的合法va,發(fā)生缺頁(yè)異常來(lái)建立映射關(guān)系,填寫屬于進(jìn)程自己的各級(jí)頁(yè)表,然后訪問。
  • 訪問無(wú)法地址,發(fā)生缺頁(yè)殺死進(jìn)程等等。

4.2 處理器狀態(tài)切換

來(lái)切換下一個(gè)進(jìn)程的執(zhí)行流,上一個(gè)進(jìn)程執(zhí)行狀態(tài)保存,讓下一個(gè)進(jìn)程恢復(fù)執(zhí)行狀態(tài)。

處理器狀態(tài)切換而后者讓進(jìn)程產(chǎn)生獨(dú)占系統(tǒng)cpu的錯(cuò)覺,使得系統(tǒng)中各個(gè)任務(wù)能夠并發(fā)(多個(gè)任務(wù)在多個(gè)cpu上運(yùn)行)或分時(shí)復(fù)用(多個(gè)任務(wù)在一個(gè)cpu上運(yùn)行)cpu資源。

下面給出代碼:

  1. context_switch 
  2. ->(last) = __switch_to((prev), (next)) 
  3.     -> fpsimd_thread_switch(next) //浮點(diǎn)寄存器切換 
  4.         ... 
  5.         last = cpu_switch_to(prev, next);  

處理器狀態(tài)切換會(huì)做浮點(diǎn)寄存器等切換,最終調(diào)用cpu_switch_to做真正切換。

  1. cpu_switch_to  //arch/arm64/kernel/entry.S 
  2. SYM_FUNC_START(cpu_switch_to) 
  3.         mov     x10, #THREAD_CPU_CONTEXT 
  4.         add     x8, x0, x10 
  5.         mov     x9, sp 
  6.         stp     x19, x20, [x8], #16             // store callee-saved registers 
  7.         stp     x21, x22, [x8], #16 
  8.         stp     x23, x24, [x8], #16 
  9.         stp     x25, x26, [x8], #16 
  10.         stp     x27, x28, [x8], #16 
  11.         stp     x29, x9, [x8], #16 
  12.         str     lr, [x8] 
  13.         add     x8, x1, x10 
  14.         ldp     x19, x20, [x8], #16             // restore callee-saved registers 
  15.         ldp     x21, x22, [x8], #16 
  16.         ldp     x23, x24, [x8], #16 
  17.         ldp     x25, x26, [x8], #16 
  18.         ldp     x27, x28, [x8], #16 
  19.         ldp     x29, x9, [x8], #16 
  20.         ldr     lr, [x8] 
  21.         mov     sp, x9 
  22.         msr     sp_el0, x1 
  23.         ptrauth_keys_install_kernel x1, x8, x9, x10 
  24.         scs_save x0, x8 
  25.         scs_load x1, x8 
  26.         ret 
  27. SYM_FUNC_END(cpu_switch_to) 

這里傳遞過(guò)來(lái)的是x0為prev進(jìn)程的進(jìn)程描述符(struct task_struct)地址, x1為next的進(jìn)程描述符地址。會(huì)就將prev進(jìn)程的 x19-x28,fp,sp,lr保存到prev進(jìn)程的tsk.thread.cpu_context中,next進(jìn)程的這些寄存器值從next進(jìn)程的tsk.thread.cpu_context中恢復(fù)到相應(yīng)寄存器。這里還做了sp_el0設(shè)置為next進(jìn)程描述符的操作,為了通過(guò)current宏找到當(dāng)前的任務(wù)。

需要注意的是:

  1. mov sp, x9 做了切換進(jìn)程內(nèi)核棧的操作。
  2. ldr lr, [x8] 設(shè)置了鏈接寄存器,然后ret的時(shí)候會(huì)將lr恢復(fù)到pc從而真正完成了執(zhí)行流的切換。

4.3 精美圖示

這里給出了進(jìn)程切換的圖示(以arm64處理器為例),這里從prev進(jìn)程切換到next進(jìn)程。

5.進(jìn)程再次被調(diào)度

當(dāng)進(jìn)程重新被調(diào)度的時(shí)候,從原來(lái)的調(diào)度現(xiàn)場(chǎng)恢復(fù)執(zhí)行。

5.1 關(guān)于lr地址的設(shè)置

1)如果切換的next進(jìn)程是剛fork的進(jìn)程,它并沒有真正的這些調(diào)度上下文的存在,那么lr是什么呢?這是在fork的時(shí)候設(shè)置的:

  1. do_fork 
  2.     ... 
  3.     copy_thread //arch/arm64/kernel/process.c 
  4.     ->memset(&p->thread.cpu_context, 0, sizeof(struct cpu_context)); 
  5.      p->thread.cpu_context.pc = (unsigned long)ret_from_fork; 
  6.     p->thread.cpu_context.sp = (unsigned long)childregs; 

設(shè)置為了ret_from_fork的地址,當(dāng)然這里也設(shè)置了sp等調(diào)度上下文(這里將進(jìn)程切換保存的寄存器稱之為調(diào)度上下文)。

  1. SYM_CODE_START(ret_from_fork) 
  2.         bl      schedule_tail 
  3.         cbz     x19, 1f                         // not a kernel thread 
  4.         mov     x0, x20 
  5.         blr     x19 
  6. 1:      get_current_task tsk 
  7.         b       ret_to_user 
  8. SYM_CODE_END(ret_from_fork) 

剛fork的進(jìn)程,從cpu_switch_to的ret指令執(zhí)行后返回,lr加載到pc。

于是執(zhí)行到ret_from_fork:這里首先調(diào)用schedule_tail對(duì)前一個(gè)進(jìn)程做清理工作,然后判斷是否為內(nèi)核線程如果是執(zhí)行內(nèi)核線程的執(zhí)行函數(shù),如果是用戶任務(wù)通過(guò)ret_to_user返回到用戶態(tài)。

2)如果是之前已經(jīng)被切換過(guò)的進(jìn)程,lr為cpu_switch_to調(diào)用的下一條指令地址(這里實(shí)際上是__schedule函數(shù)中調(diào)用barrier()的指令地址)。

5.2 關(guān)于__switch_to的參數(shù)和返回值

  1. switch_to(prev, next, prev) 
  2. >  ((last) = __switch_to((prev), (next))) 

這里做處理器狀態(tài)切換時(shí),傳遞了兩個(gè)參數(shù),返回了一個(gè)參數(shù):

prev和next很好理解就是 就是前一個(gè)進(jìn)程(當(dāng)前進(jìn)程)和下一個(gè)進(jìn)程的 task_struct結(jié)構(gòu)指針,那么last是什么呢?

一句話:返回的last是當(dāng)前重新被調(diào)度的進(jìn)程的上一個(gè)進(jìn)程的 task_struct結(jié)構(gòu)指針。

如:A ->B ->千山萬(wàn)水->D -> A 上面的切換過(guò)程:A切換到B 然后經(jīng)歷千山萬(wàn)水再?gòu)腄 -> A,這個(gè)時(shí)候A重新被調(diào)度時(shí),last即為D的 task_struct結(jié)構(gòu)指針。

獲得當(dāng)前重新被調(diào)度進(jìn)程的前一個(gè)進(jìn)程是為了回收前一個(gè)進(jìn)程資源,見后面分析。

5.3 關(guān)于finish_task_switch

進(jìn)程被重新調(diào)度時(shí)無(wú)論是否為剛fork出的進(jìn)程都會(huì)走到finish_task_switch這個(gè)函數(shù),下面我們來(lái)看它做了什么事情:

主要工作為:檢查回收前一個(gè)進(jìn)程資源,為當(dāng)前進(jìn)程恢復(fù)執(zhí)行做一些準(zhǔn)備工作。

  1. finish_task_switch 
  2. ->finish_lock_switch 
  3.     ->raw_spin_unlock_irq   //使能本地中斷 
  4. ->if (mm)  
  5.     mmdrop(mm)  //有借有還  借用的mm現(xiàn)在歸還 
  6.  ->if (unlikely(prev_state == TASK_DEAD)) {        //前一個(gè)進(jìn)程是死亡狀態(tài) 
  7.             put_task_stack(prev);    //如果內(nèi)核棧在task_struct中   釋放內(nèi)核棧                                       
  8.            put_task_struct_rcu_user(prev);  //釋放前一個(gè)進(jìn)程的task_struct占用內(nèi)存 
  9.    }                      

可以看到進(jìn)程被重新調(diào)度時(shí)首先需要做的主要是:

  • 重新使能本地中斷 ,進(jìn)程被重新調(diào)度時(shí),本地cpu中斷是被重新打開的!!!
  • 如果有借用mm的情況,現(xiàn)在歸還 如果前一個(gè)是內(nèi)核線程,在進(jìn)程地址空間切換時(shí)“借用了”某個(gè)進(jìn)程的mm_struct,現(xiàn)在切換到了下一個(gè)進(jìn)程,理應(yīng)歸還,歸還做的是遞減借用的mm_struct的引用計(jì)數(shù),引用計(jì)數(shù)為0就會(huì)釋放mm_struct占用的內(nèi)存。
  • 對(duì)于上一個(gè)死亡的進(jìn)程現(xiàn)在回收最后的資源, 注意這里是遞減引用計(jì)數(shù),當(dāng)引用計(jì)數(shù)為0時(shí)才會(huì)真正釋放。

6. 總結(jié) 

主調(diào)度器可以說(shuō)Linux內(nèi)核進(jìn)程管理中的核心組件,進(jìn)程管理的其他部分如搶占、喚醒、睡眠等都是圍繞它來(lái)運(yùn)作。在原子上下文不能發(fā)生調(diào)度,說(shuō)的就是調(diào)用主調(diào)度器,但是可以設(shè)置搶占標(biāo)志以至于在最近的搶占點(diǎn)發(fā)生調(diào)度,如中斷中喚醒高優(yōu)先級(jí)進(jìn)程的場(chǎng)景。主調(diào)度器所做的工作就是讓出cpu,內(nèi)核很多場(chǎng)景可以直接或間接調(diào)用它,而大體上可以分為兩種情況:即為主動(dòng)調(diào)度和搶占式調(diào)度。主調(diào)度器做了兩件事情:選擇下一個(gè)進(jìn)程和進(jìn)程進(jìn)程上下文切換。選擇下一個(gè)進(jìn)程解決選擇合適高優(yōu)先級(jí)進(jìn)程的問題。進(jìn)程進(jìn)程上下文切換又分為地址空間切換和處理器狀態(tài)切換,前者讓進(jìn)程產(chǎn)生獨(dú)自占用系統(tǒng)內(nèi)存的錯(cuò)覺,而后者讓進(jìn)程產(chǎn)生獨(dú)自占用系統(tǒng)cpu的錯(cuò)覺,讓系統(tǒng)各個(gè)進(jìn)程有條不紊的共享內(nèi)存和cpu等資源。

 

責(zé)任編輯:武曉燕 來(lái)源: Linux內(nèi)核遠(yuǎn)航者
相關(guān)推薦

2021-07-02 06:54:44

Linux內(nèi)核主調(diào)度器

2021-07-26 07:47:36

數(shù)據(jù)庫(kù)

2025-06-16 05:10:00

2021-05-19 07:56:26

Linux內(nèi)核搶占

2021-12-09 08:09:31

Linux內(nèi)核臟頁(yè)

2017-01-12 19:34:58

2021-07-20 08:02:41

Linux進(jìn)程睡眠

2020-09-28 08:44:17

Linux內(nèi)核

2022-11-09 08:12:07

2023-02-10 08:11:43

Linux系統(tǒng)調(diào)用

2025-10-28 04:25:00

2021-08-31 10:32:11

LinuxPage Cache命令

2013-06-20 10:25:56

2015-09-17 10:51:35

修改hostnameLinux

2016-12-08 15:36:59

HashMap數(shù)據(jù)結(jié)構(gòu)hash函數(shù)

2010-06-01 15:25:27

JavaCLASSPATH

2020-07-21 08:26:08

SpringSecurity過(guò)濾器

2025-04-28 02:00:00

2025-04-22 08:21:10

2016-11-07 21:59:52

threadpython
點(diǎn)贊
收藏

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

中文字幕人成人乱码| 1024在线看片你懂得| 毛片不卡一区二区| 欧美夫妻性视频| 91视频在线免费| 国模冰冰炮一区二区| 中文文精品字幕一区二区| 亚洲一区二区少妇| 午夜影院免费在线观看| 国产精品久久久久久影院8一贰佰| 日韩精品一区二区在线| 国产情侣av自拍| 日韩免费啪啪| 久久只精品国产| 91久久久久久久| 国产成人无码一区二区在线播放| 亚洲成人精品| 国产亚洲精品激情久久| 国产婷婷在线观看| 国产高清视频一区二区| 在线视频综合导航| 亚欧无线一线二线三线区别| 粗大黑人巨茎大战欧美成人| 欧美国产97人人爽人人喊| 国产伦精品一区二区三区视频孕妇| 色老头一区二区| 在线日韩视频| 精品自拍视频在线观看| 激情高潮到大叫狂喷水| 欧美猛男同性videos| 欧美成人激情免费网| 91亚洲精品久久久蜜桃借种| 欧美日韩国产v| 五月婷婷激情综合| 日韩亚洲欧美一区二区| 黄色精品免费看| 国产精品免费观看视频| 欧美精品成人一区二区在线观看| 少妇人妻精品一区二区三区| 国产一区在线观看视频| 成人欧美一区二区三区黑人孕妇| 欧美成人一区二区视频| 日本怡春院一区二区| 国产97人人超碰caoprom| 国产成人精品网| 一本久道综合久久精品| 国内成人精品一区| 性欧美疯狂猛交69hd| 久久精品99久久无色码中文字幕| 亚洲天堂第一页| 日韩丰满少妇无码内射| 久久成人av| 亚洲精品视频久久| 国产ts在线播放| 国产成人高清| 亚洲最新av网址| 大胸美女被爆操| 99re6这里只有精品| 色伦专区97中文字幕| 开心激情五月网| 亚洲一区欧美| 欧美激情亚洲一区| 日本网站在线播放| 久久蜜桃精品| 国产精品视频大全| 91午夜交换视频| 国产精品资源网| 国产aⅴ精品一区二区三区黄| 亚洲成熟女性毛茸茸| www.99精品| 欧美福利精品| 日本三级视频在线播放| 亚洲精品国产精华液| 日韩日韩日韩日韩日韩| 亚洲女同av| 欧美色窝79yyyycom| 中文字幕色网站| 丁香婷婷成人| 亚洲天堂开心观看| 婷婷激情四射网| 亚洲欧洲日本mm| 国产激情视频一区| 中文字字幕在线观看| 国产精品一区二区男女羞羞无遮挡 | 99久久国产免费免费| 人人妻人人澡人人爽人人欧美一区 | 免费av毛片在线看| 亚洲午夜av在线| 丁香婷婷激情网| 狂野欧美xxxx韩国少妇| 日韩激情视频在线| 我要看黄色一级片| 中文亚洲欧美| 91日本在线视频| 日本高清中文字幕二区在线| 国产精品不卡一区二区三区| 婷婷无套内射影院| 欧美jizz18| 亚洲国产天堂久久综合| 国产精品视频一区二区在线观看| 亚洲福利专区| 91精品国产综合久久香蕉最新版| 神马一区二区三区| 国产精品家庭影院| 18禁男女爽爽爽午夜网站免费| 96视频在线观看欧美| 亚洲欧美国产制服动漫| 欧美丰满艳妇bbwbbw| 奇米色一区二区| 精品无码久久久久国产| av网址在线| 欧美日本在线观看| 色婷婷在线影院| 影音先锋日韩资源| 91精品视频免费看| eeuss影院在线播放| 天天综合色天天| 免费观看一区二区三区| 欧美独立站高清久久| 日韩av黄色在线观看| 亚洲黄色片视频| 亚洲男女一区二区三区| 九色porny91| 先锋影音国产精品| 亚洲18私人小影院| 亚洲欧美高清视频| 亚洲欧美日韩一区二区三区在线观看| 欧美日韩大尺度| 妖精视频一区二区三区| 97人人做人人爱| 亚洲黄色在线观看视频| 一区二区三区不卡在线观看| 亚洲第一色av| 午夜影院欧美| 91精品视频网站| 久久久久久国产精品免费无遮挡 | 亚洲少妇最新在线视频| 少妇一级淫免费播放| 欧美日韩精品一区二区视频| 欧美中文在线观看| 欧美日韩影视| 疯狂做受xxxx欧美肥白少妇| 国产精品一区二区在线免费观看| 中国成人一区| 97国产超碰| 制服丝袜在线播放| 日韩午夜在线观看视频| 天天干中文字幕| 国产99精品视频| 9色porny| 日韩激情啪啪| 日本欧美精品在线| 精品电影在线| 精品视频一区三区九区| 男人晚上看的视频| 国产精品自拍在线| 国产夫妻自拍一区| 美女视频亚洲色图| 欧美专区在线视频| 国产高清一级毛片在线不卡| 在线视频中文字幕一区二区| 久久久久人妻一区精品色| 韩国一区二区三区| 97超碰在线视| 亚州综合一区| 国产精品久久久久久婷婷天堂 | 欧美激情a在线| 色香蕉在线视频| 色婷婷久久久亚洲一区二区三区| 日本少妇xxxxx| 久久精品久久久精品美女| 日本一级淫片演员| 国产主播性色av福利精品一区| 91精品国产成人| 国产精品一区二区婷婷| 欧美精品日韩一本| 亚洲国产精一区二区三区性色| 久久免费的精品国产v∧| 免费看污污网站| 欧美黄在线观看| 久久久久资源| 日韩三区四区| 国内精品视频久久| 国产经典自拍视频在线观看| 在线综合亚洲欧美在线视频| 日韩av男人天堂| 中文字幕乱码日本亚洲一区二区 | 国产毛片视频网站| 国产一区二区三区网| 亚洲影院高清在线| 中文字幕成在线观看| www.午夜精品| 先锋av资源站| 制服丝袜av成人在线看| 自拍偷拍欧美亚洲| 日韩理论片网站| 亚洲国产欧美视频| 国产一区二区导航在线播放| 国产黄色特级片| 欧美视频日韩| 亚洲视频在线观看日本a| 97久久综合精品久久久综合| 国产精品久久久久77777| 欧美videosex性极品hd| 中文字幕一区电影| 日本天堂在线| 精品国内二区三区| 一二三四区在线| 色婷婷综合久久久中文字幕| 精品少妇theporn| 国产精品久久久久婷婷二区次| 中文在线永久免费观看| 国产美女在线观看一区| 亚洲色图 在线视频| 国产精品一区毛片| 2019日韩中文字幕mv| 91精品国产91久久久久久密臀 | aa亚洲婷婷| 男人天堂a在线| 欧美黄色一级视频| 综合久久国产| 人人狠狠综合久久亚洲婷婷| 久久99导航| 久久久精品国产**网站| 97久草视频| 国产一区二区三区免费观看在线 | 超碰福利在线观看| 69久久夜色精品国产69蝌蚪网| 免费黄色一级大片| 一本色道久久综合亚洲91| 在线观看亚洲欧美| 精品人伦一区二区三区蜜桃网站| 丁香花五月激情| 最好看的中文字幕久久| 国产在线观看免费视频软件| 国产女同互慰高潮91漫画| 天天躁日日躁aaaxxⅹ | 日韩精品一区二区亚洲av性色| 中文字幕免费不卡在线| 波多野结衣一二三四区| 国产欧美精品一区二区三区四区| 一区二区三区免费在线观看视频| 99国产精品久久久| 熟女人妻在线视频| 91麻豆蜜桃一区二区三区| 手机在线看片日韩| 91网站黄www| 美女被到爽高潮视频| 国产丝袜美腿一区二区三区| 亚洲色成人网站www永久四虎| 国产亚洲欧美日韩在线一区| 亚洲国产日韩一区无码精品久久久| 久久嫩草精品久久久精品一| 免费看91的网站| 国产精品久久久久婷婷二区次| 国产尤物在线播放| 一卡二卡三卡日韩欧美| 国产精品成人aaaa在线| 日韩欧美国产成人| 中文字幕乱伦视频| 欧美美女bb生活片| 亚洲av色香蕉一区二区三区| 亚洲第一福利网| 欧美色图另类| 最新亚洲国产精品| 视频在线观看入口黄最新永久免费国产| 欧美成人性色生活仑片| 国产啊啊啊视频在线观看| 18一19gay欧美视频网站| av在线不卡精品| 91亚洲午夜在线| 卡通动漫国产精品| 亚洲高清视频一区| 欧美精品色网| 中文字幕乱码人妻综合二区三区 | 国产欧美日韩视频| 日韩一二三区| 欧美日韩一区综合| 一本一道久久综合狠狠老| 欧美不卡在线播放| 久久se这里有精品| 欧美双性人妖o0| 中文字幕欧美三区| 日本少妇久久久| 欧美日韩国产影片| 蜜桃视频久久一区免费观看入口 | 调教驯服丰满美艳麻麻在线视频| 亚洲人成小说网站色在线 | 日本精品600av| 国产成人精品久久二区二区| 久久综合偷偷噜噜噜色| 蜜桃视频在线观看91| 亚洲色图二区| 任你操这里只有精品| 国产成人亚洲精品青草天美 | 亚洲欧美一区二区三区极速播放 | 国产亚洲成人av| 欧美三级一区二区| 无码精品在线观看| 久久这里只有精品99| 成人美女黄网站| 国产精品国产精品国产专区蜜臀ah| 波多野结衣一区| 北条麻妃在线视频观看| 黄页视频在线91| 蜜臀久久99精品久久久久久| 亚洲国产sm捆绑调教视频| 伊人久久成人网| 亚洲色无码播放| 免费成人在线电影| 97久久天天综合色天天综合色hd| 欧洲乱码伦视频免费| 黄色免费观看视频网站| 国产成人在线观看| 伊人在线视频观看| 欧美性三三影院| 黄色片视频在线观看| 97在线观看免费高清| 91国内精品白嫩初高生| 一区二区精品免费视频| 丝袜亚洲另类欧美| 免费在线观看成年人视频| 午夜精品一区二区三区三上悠亚| 99国产精品久久久久久久成人 | 久久精品国产99精品国产亚洲性色| 在线国产一区| 91pony九色| 国产精品国产三级国产aⅴ无密码| 神马久久久久久久| 亚洲欧美日韩一区二区在线 | 91精品国产综合久久男男| 欧美色爱综合| www.色就是色| 国产拍欧美日韩视频二区| 日韩人妻精品中文字幕| 精品视频—区二区三区免费| 高清精品在线| 精品国产乱码一区二区三区四区| 精品成人久久| 亚洲熟女一区二区| 欧美日韩在线影院| 日本中文字幕电影在线观看| 欧美在线性爱视频 | 成人51免费| 在线观看污视频| 国产sm精品调教视频网站| 久久精品99久久久久久| 亚洲爱爱爱爱爱| 九色porny丨首页入口在线| 精品欧美日韩| 久热re这里精品视频在线6| 欧美日韩高清丝袜| 欧美午夜一区二区三区| 蜜桃av在线免费观看| 亚洲一区二区三区成人在线视频精品| 久久精品青草| 图片区偷拍区小说区| 亚洲精品欧美在线| 欧美一区二区三区激情| 欧美在线一区二区视频| 欧美日韩中字| 亚洲精品乱码久久久久久动漫| 亚洲乱码国产乱码精品精的特点 | 成人av网站在线播放| 在线观看成人黄色| 福利一区三区| 僵尸世界大战2 在线播放| 久久久亚洲午夜电影| 免费在线不卡av| 欧美成人第一页| 欧美一级三级| 日韩一区二区三区久久| 一区二区三区日韩在线观看| 欧洲成人一区二区三区| 国产成人久久久精品一区| 欧美大片aaaa| 国产精品无码在线| 欧美性生活一区| 色呦呦在线资源| 欧美一区二区三区成人久久片| 久久66热偷产精品| 午夜精品久久久久久久久久久久久蜜桃 | 国产福利视频一区二区| 欧美1区2区| 一区二区黄色片| 欧美一级免费大片| 玛雅亚洲电影| 日本久久久网站| 国产人成一区二区三区影院| 亚洲av无码片一区二区三区| 日本乱人伦a精品| 欧美激情日韩| 国产黄色大片免费看| 日韩美女视频一区二区在线观看| 激情开心成人网| 成年人深夜视频| 国产精品人成在线观看免费| 四虎永久在线观看| 91在线精品播放| 日本va欧美va欧美va精品|