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

詳解 Go 程序的啟動流程,你知道 g0,m0 是什么嗎?

開發 后端
真是非常的好奇,今天我們就一起來探一探 Go 程序的啟動流程。其中涉及到 Go Runtime 的調度器啟動,g0,m0 又是什么?

[[392746]]

大家好,我是煎魚。

自古應用程序均從 Hello World 開始,你我所寫的 Go 語言亦然:

  1. import "fmt" 
  2.  
  3. func main() { 
  4.  fmt.Println("hello world."

這段程序的輸出結果為 hello world.,就是這么的簡單又直接。但這時候又不禁思考了起來,這個 hello world. 是怎么輸出來,經歷了什么過程。

真是非常的好奇,今天我們就一起來探一探 Go 程序的啟動流程。其中涉及到 Go Runtime 的調度器啟動,g0,m0 又是什么?

車門焊死,正式開始吸魚之路。

Go 引導階段

查找入口

首先編譯上文提到的示例程序:

  1. $ GOFLAGS="-ldflags=-compressdwarf=false" go build  

在命令中指定了 GOFLAGS 參數,這是因為在 Go1.11 起,為了減少二進制文件大小,調試信息會被壓縮。導致在 MacOS 上使用 gdb 時無法理解壓縮的 DWARF 的含義是什么(而我恰恰就是用的 MacOS)。

因此需要在本次調試中將其關閉,再使用 gdb 進行調試,以此達到觀察的目的:

  1. $ gdb awesomeProject  
  2. (gdb) info files 
  3. Symbols from "/Users/eddycjy/go-application/awesomeProject/awesomeProject"
  4. Local exec file: 
  5.  `/Users/eddycjy/go-application/awesomeProject/awesomeProject', file type mach-o-x86-64. 
  6.  Entry point: 0x1063c80 
  7.  0x0000000001001000 - 0x00000000010a6aca is .text 
  8.  ... 
  9. (gdb) b *0x1063c80 
  10. Breakpoint 1 at 0x1063c80: file /usr/local/Cellar/go/1.15/libexec/src/runtime/rt0_darwin_amd64.s, line 8. 

通過 Entry point 的調試,可看到真正的程序入口在 runtime 包中,不同的計算機架構指向不同。例如:

  • MacOS 在 src/runtime/rt0_darwin_amd64.s。
  • Linux 在 src/runtime/rt0_linux_amd64.s。

其最終指向了 rt0_darwin_amd64.s 文件,這個文件名稱非常的直觀:

Breakpoint 1 at 0x1063c80: file /usr/local/Cellar/go/1.15/libexec/src/runtime/rt0_darwin_amd64.s, line 8.

rt0 代表 runtime0 的縮寫,指代運行時的創世,超級奶爸:

  • darwin 代表目標操作系統(GOOS)。
  • amd64 代表目標操作系統架構(GOHOSTARCH)。

同時 Go 語言還支持更多的目標系統架構,例如:AMD64、AMR、MIPS、WASM 等:

源碼目錄

若有興趣可到 src/runtime 目錄下進一步查看,這里就不一一介紹了。

入口方法

在 rt0_linux_amd64.s 文件中,可發現 _rt0_amd64_darwin JMP 跳轉到了 _rt0_amd64 方法:

  1. TEXT _rt0_amd64_darwin(SB),NOSPLIT,$-8 
  2.  JMP _rt0_amd64(SB) 
  3. ... 

緊接著又跳轉到 runtime·rt0_go 方法:

  1. TEXT _rt0_amd64(SB),NOSPLIT,$-8 
  2.  MOVQ 0(SP), DI // argc 
  3.  LEAQ 8(SP), SI // argv 
  4.  JMP runtime·rt0_go(SB) 

該方法將程序輸入的 argc 和 argv 從內存移動到寄存器中。

棧指針(SP)的前兩個值分別是 argc 和 argv,其對應參數的數量和具體各參數的值。

開啟主線

程序參數準備就緒后,正式初始化的方法落在 runtime·rt0_go 方法中:

  1. TEXT runtime·rt0_go(SB),NOSPLIT,$0 
  2.  ... 
  3.  CALL runtime·check(SB) 
  4.  MOVL 16(SP), AX  // copy argc 
  5.  MOVL AX, 0(SP) 
  6.  MOVQ 24(SP), AX  // copy argv 
  7.  MOVQ AX, 8(SP) 
  8.  CALL runtime·args(SB) 
  9.  CALL runtime·osinit(SB) 
  10.  CALL runtime·schedinit(SB) 
  11.  
  12.  // create a new goroutine to start program 
  13.  MOVQ $runtime·mainPC(SB), AX  // entry 
  14.  PUSHQ AX 
  15.  PUSHQ $0   // arg size 
  16.  CALL runtime·newproc(SB) 
  17.  POPQ AX 
  18.  POPQ AX 
  19.  
  20.  // start this M 
  21.  CALL runtime·mstart(SB) 
  22.  ... 
  • runtime.check:運行時類型檢查,主要是校驗編譯器的翻譯工作是否正確,是否有 “坑”。基本代碼均為檢查 int8 在 unsafe.Sizeof 方法下是否等于 1 這類動作。
  • runtime.args:系統參數傳遞,主要是將系統參數轉換傳遞給程序使用。
  • runtime.osinit:系統基本參數設置,主要是獲取 CPU 核心數和內存物理頁大小。
  • runtime.schedinit:進行各種運行時組件的初始化,包含調度器、內存分配器、堆、棧、GC 等一大堆初始化工作。會進行 p 的初始化,并將 m0 和某一個 p 進行綁定。
  • runtime.main:主要工作是運行 main goroutine,雖然在runtime·rt0_go 中指向的是$runtime·mainPC,但實質指向的是 runtime.main。
  • runtime.newproc:創建一個新的 goroutine,且綁定 runtime.main 方法(也就是應用程序中的入口 main 方法)。并將其放入 m0 綁定的p的本地隊列中去,以便后續調度。
  • runtime.mstart:啟動 m,調度器開始進行循環調度。
  • 在 runtime·rt0_go 方法中,其主要是完成各類運行時的檢查,系統參數設置和獲取,并進行大量的 Go 基礎組件初始化。

初始化完畢后進行主協程(main goroutine)的運行,并放入等待隊列(GMP 模型),最后調度器開始進行循環調度。

小結

根據上述源碼剖析,可以得出如下 Go 應用程序引導的流程圖:

Go 程序引導過程

在 Go 語言中,實際的運行入口并不是用戶日常所寫的 main func,更不是 runtime.main 方法,而是從 rt0_*_amd64.s 開始,最終再一路 JMP 到 runtime·rt0_go 里去,再在該方法里完成一系列 Go 自身所需要完成的絕大部分初始化動作。

其中整體包括:

  • 運行時類型檢查、系統參數傳遞、CPU 核數獲取及設置、運行時組件的初始化(調度器、內存分配器、堆、棧、GC 等)。
  • 運行 main goroutine。
  • 運行相應的 GMP 等大量缺省行為。
  • 涉及到調度器相關的大量知識。

后續將會繼續剖析將進一步剖析 runtime·rt0_go 里的愛與恨,尤其像是 runtime.main、runtime.schedinit 等調度方法,都有非常大的學習價值,有興趣的小伙伴可以持續關注。

Go 調度器初始化

知道了 Go 程序是怎么引導起來的之后,我們需要了解 Go Runtime 中調度器是怎么流轉的。

runtime.mstart

這里主要關注 runtime.mstart 方法:

  1. func mstart() { 
  2.  // 獲取 g0 
  3.  _g_ := getg() 
  4.  
  5.  // 確定棧邊界 
  6.  osStack := _g_.stack.lo == 0 
  7.  if osStack { 
  8.   size := _g_.stack.hi 
  9.   if size == 0 { 
  10.    size = 8192 * sys.StackGuardMultiplier 
  11.   } 
  12.   _g_.stack.hi = uintptr(noescape(unsafe.Pointer(&size))) 
  13.   _g_.stack.lo = _g_.stack.hi - size + 1024 
  14.  } 
  15.  _g_.stackguard0 = _g_.stack.lo + _StackGuard 
  16.  _g_.stackguard1 = _g_.stackguard0 
  17.    
  18.   // 啟動 m,進行調度器循環調度 
  19.  mstart1() 
  20.  
  21.  // 退出線程 
  22.  if mStackIsSystemAllocated() { 
  23.   osStack = true 
  24.  } 
  25.  mexit(osStack) 
  • 調用 getg 方法獲取 GMP 模型中的 g,此處獲取的是 g0。
  • 通過檢查 g 的執行棧 _g_.stack 的邊界(堆棧的邊界正好是 lo, hi)來確定是否為系統棧。若是,則根據系統棧初始化 g 執行棧的邊界。
  • 調用 mstart1 方法啟動系統線程 m,進行調度器循環調度。
  • 調用 mexit 方法退出系統線程 m。

runtime.mstart1

這么看來其實質邏輯在 mstart1 方法,我們繼續往下剖析:

  1. func mstart1() { 
  2.  // 獲取 g,并判斷是否為 g0 
  3.  _g_ := getg() 
  4.  if _g_ != _g_.m.g0 { 
  5.   throw("bad runtime·mstart"
  6.  } 
  7.  
  8.  // 初始化 m 并記錄調用方 pc、sp 
  9.  save(getcallerpc(), getcallersp()) 
  10.  asminit() 
  11.  minit() 
  12.  
  13.  // 設置信號 handler 
  14.  if _g_.m == &m0 { 
  15.   mstartm0() 
  16.  } 
  17.  // 運行啟動函數 
  18.  if fn := _g_.m.mstartfn; fn != nil { 
  19.   fn() 
  20.  } 
  21.  
  22.  if _g_.m != &m0 { 
  23.   acquirep(_g_.m.nextp.ptr()) 
  24.   _g_.m.nextp = 0 
  25.  } 
  26.  schedule() 
  • 調用 getg 方法獲取 g。并且通過前面綁定的 _g_.m.g0 判斷所獲取的 g 是否 g0。若不是,則直接拋出致命錯誤。因為調度器僅在 g0 上運行。
  • 調用 minit 方法初始化 m,并記錄調用方的 PC、SP,便于后續 schedule 階段時的復用。
  • 若確定當前的 g 所綁定的 m 是 m0,則調用 mstartm0 方法,設置信號 handler。該動作必須在 minit 方法之后,這樣 minit 方法可以提前準備好線程,以便能夠處理信號。
  • 若當前 g 所綁定的 m 有啟動函數,則運行。否則跳過。
  • 若當前 g 所綁定的 m 不是 m0,則需要調用 acquirep 方法獲取并綁定 p,也就是 m 與 p 綁定。
  • 調用 schedule 方法進行正式調度。

忙活了一大圈,終于進入到開題的主菜了,原來潛伏的很深的 schedule 方法才是真正做調度的方法,其他都是前置處理和準備數據。

由于篇幅問題,schedule 方法會放到下篇再繼續剖析,我們先聚焦本篇的一些細節點。

問題深剖

不過到這里篇幅也已經比較長了,積累了不少問題。我們針對在 Runtime 中出鏡率最高的兩個元素進行剖析:

  1. m0 是什么,作用是?
  2. g0 是什么,作用是?

m0

m0 是 Go Runtime 所創建的第一個系統線程,一個 Go 進程只有一個 m0,也叫主線程。

從多個方面來看:

  • 數據結構:m0 和其他創建的 m 沒有任何區別。
  • 創建過程:m0 是進程在啟動時應該匯編直接復制給 m0 的,其他后續的 m 則都是 Go Runtime 內自行創建的。
  • 變量聲明:m0 和常規 m 一樣,m0 的定義就是 var m0 m,沒什么特別之處。

g0

  • g 一般分為三種,分別是:
  • 執行用戶任務的叫做 g。
  • 執行 runtime.main 的 main goroutine。

執行調度任務的叫 g0。。

g0 比較特殊,每一個 m 都只有一個 g0(僅此只有一個 g0),且每個 m 都只會綁定一個 g0。在 g0 的賦值上也是通過匯編賦值的,其余后續所創建的都是常規的 g。

從多個方面來看:

數據結構:g0 和其他創建的 g 在數據結構上是一樣的,但是存在棧的差別。在 g0 上的棧分配的是系統棧,在 Linux 上棧大小默認固定 8MB,不能擴縮容。而常規的 g 起始只有 2KB,可擴容。

運行狀態:g0 和常規的 g 不一樣,沒有那么多種運行狀態,也不會被調度程序搶占,調度本身就是在 g0 上運行的。

變量聲明:g0 和常規 g,g0 的定義就是 var g0 g,沒什么特別之處。

小結

在本章節中我們講解了 Go 調度器初始化的一個過程,分別涉及:

  • runtime.mstart。
  • runtime.mstart1。

基于此也了解到了在調度器初始化過程中,需要準備什么,初始化什么。另外針對調度過程中最常提到的 m0、g0 的概念我們進行了梳理和說明。

總結

在今天這篇文章中,我們詳細的介紹了 Go 語言的引導啟動過程中的所有流程和初始化動作。

同時針對調度器的初始化進行了初步分析,詳細介紹了 m0、g0 的用途和區別。在下一篇文章中我們將進一步對真正調度的 schedule 方法進行詳解,這塊也是個硬骨頭了。

 

責任編輯:武曉燕 來源: 腦子進煎魚了
相關推薦

2015-08-24 09:23:25

2021-10-09 07:10:32

Shell腳本linux

2024-09-02 00:30:41

Go語言場景

2018-08-20 20:46:07

2024-04-30 09:02:48

2025-02-18 08:11:17

2024-10-10 16:53:53

守護線程編程

2024-08-20 08:29:55

2022-10-24 09:57:02

runeGo語言

2023-01-04 11:39:45

2025-03-11 00:35:00

Spring事件機制

2021-11-10 15:37:49

Go源碼指令

2022-12-06 10:04:59

5G網絡C波段

2021-04-11 11:20:26

數字人民幣數字貨幣區塊鏈

2025-02-27 08:09:52

2015-03-17 09:39:05

2023-05-05 09:04:41

文本數據ChatGPT

2021-03-29 14:12:41

云計算區塊鏈

2021-08-26 21:55:38

DPU架構數據

2009-12-07 16:46:56

Windows SDK
點贊
收藏

51CTO技術棧公眾號

国产午夜精品福利视频| 国产1区2区在线| 亚洲免费视频网| 激情久久久久久| 日韩精品在线视频观看| 日本美女高潮视频| а√资源新版在线天堂| caoporen国产精品视频| 国产精品美女视频网站| 欧美成人精品一区二区免费看片| 欧美日韩另类图片| 欧美午夜免费电影| 免费看毛片的网址| 在线视频91p| 风流少妇一区二区| 国产精品电影一区| 久久综合久久鬼| 欧美日韩一二| 亚洲第一视频网站| 欧美男女交配视频| 三妻四妾完整版在线观看电视剧 | 亚洲成人av综合| 国产婷婷精品| 不卡中文字幕av| xxxx日本免费| 国产精品天天看天天狠| 91麻豆精品国产91久久久久| 国产成人精品视频免费看| 毛片免费不卡| 中文字幕av资源一区| 动漫美女被爆操久久久| 国产精品国产av| 日韩中文字幕1| 高清在线视频日韩欧美| 国产精品国产精品88| 精品久久网站| 亚洲免费福利视频| 毛茸茸free性熟hd| 日韩欧美中文字幕一区二区三区 | 美女精品久久久| 久久久免费看片| 丝袜美腿综合| 日韩av影院在线观看| 香蕉视频在线观看黄| 日日夜夜精品| 欧美日韩精品一区二区| 国产一区亚洲二区三区| 亚洲最大网站| 日韩欧美第一页| 精品这里只有精品| 国产传媒在线观看| 精品国产成人在线| 97视频久久久| 国内精彩免费自拍视频在线观看网址 | 主播国产精品| 国产精品xvideos88| 日韩小视频网址| 国产精品酒店视频| 欧美色女视频| 少妇激情综合网| 欧美性受xxxx黑人| 欧美精品久久久久久| 国产一区二区黄| 成人午夜剧场视频网站| 欧美美乳视频| 亚洲香蕉成人av网站在线观看 | 欧美黑人在线观看| 污视频网站在线免费| 亚洲另类在线一区| 国产精品va在线观看无码| 青春草在线视频| 亚洲一二三四久久| 久久香蕉av| 一区二区三区四区五区在线| 久久久久久久久久久亚洲| 久久久久香蕉视频| 国产一区二区你懂的| 日韩女优人人人人射在线视频| 婷婷激情五月综合| 久久99热这里只有精品| 成人9ⅰ免费影视网站| 好男人www在线视频| 99免费精品视频| 日本在线观看一区| 久久久久久久久免费视频| 一区二区三区在线观看国产| 激情综合在线观看| 丰满少妇一区| 欧美大片在线观看一区二区| 手机在线看片日韩| 日韩激情免费| 久久噜噜噜精品国产亚洲综合 | 日韩a在线观看| 国产精品女同一区二区三区| 国产人妻人伦精品| 一根才成人网| 欧美一区二区三区色| 欧美熟妇精品一区二区蜜桃视频| 国产精品探花在线观看| 欧美成年人在线观看| wwwwww国产| 狠狠狠色丁香婷婷综合久久五月| 国产一区二区不卡视频在线观看| 粉嫩一区二区三区国产精品| 亚洲精品网站在线观看| 久久精品免费一区二区| 97精品资源在线观看| 亚洲精品91美女久久久久久久| 亚洲色图日韩精品| 日韩一级不卡| 成人免费淫片视频软件| 头脑特工队2免费完整版在线观看| 国产精品激情偷乱一区二区∴| 欧美图片激情小说| 国产成人福利夜色影视| 亚洲国内精品在线| 免费在线观看a级片| 久久电影一区| 国产伦精品一区二区三区四区视频| 99re6热在线精品视频| 国产精品视频在线观看免费| 久久成人免费网站| 久久精品日产第一区二区三区| 国产一二三区在线观看| 欧美性生交大片免费| 91精品人妻一区二区三区四区| 欧美久久精品一级c片| 久久露脸国产精品| 午夜精品久久久久久久99老熟妇| 国产欧美精品一区aⅴ影院| 国产 日韩 亚洲 欧美| 91精品网站在线观看| 国产小视频国产精品| 国产午夜视频在线| 国产成人综合自拍| 国产美女视频免费| se69色成人网wwwsex| 亚洲精品资源美女情侣酒店| 久久久久久久久久久网| 久草精品在线观看| 亚洲国产欧洲综合997久久| 中文字幕人成乱码在线观看 | 久久久久久这里只有精品| 91免费视频播放| 国产精品久久久久久久久果冻传媒 | 国产精品永久在线| 国产二区视频在线观看| 在线一区二区三区做爰视频网站| 一级性生活大片| 国产一区二区高清| 欧美日韩成人一区二区三区| 在线看片国产福利你懂的| 亚洲精品福利免费在线观看| 日韩免费视频网站| aaa亚洲精品| 免费在线观看亚洲视频| 偷拍一区二区| 555www成人网| 你懂的视频在线免费| 一本大道久久a久久综合婷婷| www.免费av| 久久久亚洲一区| 日韩精品久久久| 国产精品久久久久久久久久齐齐| 尤物yw午夜国产精品视频| 中国a一片一级一片| 中文字幕一区二区三区不卡| 欧美一级小视频| 欧美日本亚洲韩国国产| 国产精品久久精品视| 在线视频超级| 在线看国产精品| 国产免费一区二区三区免费视频| 一区二区三区鲁丝不卡| 美女黄色一级视频| 香蕉av777xxx色综合一区| 日韩国产在线一区| 亚洲一区av| 国模精品视频一区二区三区| 日漫免费在线观看网站| 欧美色综合久久| 午夜69成人做爰视频| av综合在线播放| 国产视频手机在线播放| 欧美精品九九| 蜜桃视频在线观看成人| 日韩欧乱色一区二区三区在线| 欧美成人免费全部| 手机福利在线| 欧美日韩www| 中文在线观看免费网站| 中文字幕第一区| 在线播放国产视频| 久久精品女人天堂| 日本高清xxxx| 亚洲日本三级| 95av在线视频| 成人性生交大片免费观看网站| 久久视频国产精品免费视频在线| 天天综合网天天综合| 欧美日韩亚洲综合在线| 国产无套粉嫩白浆内谢| 国产精品久久久久久久久搜平片| 制服丝袜在线第一页| 青青草国产成人99久久| 成人黄色大片网站| 欧美肥老太太性生活| 久久99精品久久久久久久青青日本| 日韩精品第一| 国内精品久久久久影院 日本资源 国内精品久久久久伊人av | 欧美系列日韩一区| 国产午夜福利精品| 亚洲人123区| 香蕉视频久久久| 成人h精品动漫一区二区三区| 日韩在线不卡一区| 亚洲在线视频| 日韩黄色片在线| 国产精品99一区二区三| 人偷久久久久久久偷女厕| 动漫av一区| 99久久一区三区四区免费| 粉嫩91精品久久久久久久99蜜桃| 欧美在线观看网址综合| 麻豆av在线免费观看| 日韩一区二区欧美| 国产高清一区在线观看| 精品性高朝久久久久久久| xxxwww在线观看| 这里是久久伊人| 中文字字幕在线中文乱码| 色综合天天综合网国产成人综合天| 免费人成视频在线| 亚洲精品一二三区| 青青操在线视频观看| 国产日韩欧美综合一区| 野花社区视频在线观看| 99久久99久久久精品齐齐| 国产麻豆剧传媒精品国产| 国产伦精品一区二区三区免费| 狠狠躁狠狠躁视频专区| 日韩激情一二三区| 欧美黑人又粗又大又爽免费| 久久香蕉精品| 999精品视频在线| 久久三级视频| wwwwxxxx日韩| 日韩av中文字幕一区二区 | 潘金莲一级黄色片| 国产精品狼人久久影院观看方式| 在线免费看视频| 中文字幕五月欧美| 亚洲波多野结衣| 亚洲欧美另类在线| 黄色一级视频免费| 亚洲一区二区美女| 一区二区三区视频免费看| 黄色一区二区三区| 欧美精品一二三四区| 在线一区二区观看| 亚洲午夜在线播放| 欧美日韩国产首页| 国产精品久久久久毛片| 91精品国产入口在线| 性欧美18一19性猛交| 亚洲精品一区二区三区99| 亚洲av成人精品毛片| 亚洲男人天堂网| 在线观看a视频| y97精品国产97久久久久久| h片在线播放| 91精品国产高清久久久久久| 国模一区二区| 成人xxxx视频| 国产精品网址| 日韩区国产区| 综合色一区二区| 欧美不卡在线播放| 青草av.久久免费一区| av噜噜在线观看| 成人深夜视频在线观看| 日韩精品卡通动漫网站| 国产精品乱码一区二区三区软件 | 伊人网在线综合| 粉嫩av一区二区三区粉嫩| 中文字幕高清视频| 亚洲婷婷综合色高清在线| 国产精品第108页| 91福利视频久久久久| 国产理论视频在线观看| 日韩av一区在线| 三区四区电影在线观看| 久久久久五月天| 亚洲精品一区三区三区在线观看| 亚洲最大的av网站| 欧美激情在线精品一区二区三区| 欧美性极品xxxx做受| 亚洲精品成人无码熟妇在线| 成人欧美一区二区三区| 国产视频91在线| 欧美男同性恋视频网站| 五月婷婷丁香花| 久久精品亚洲精品| 午夜影院在线播放| 91在线免费网站| 国产精品一区二区99| 激情五月六月婷婷| 奇米综合一区二区三区精品视频| 秘密基地免费观看完整版中文| 国产免费成人在线视频| 久久精品国产亚洲AV无码麻豆| 欧美图区在线视频| 香蕉视频国产在线| 美女国内精品自产拍在线播放| 成人免费影院| 国产精品二区三区四区| 婷婷精品进入| 欧美丰满熟妇xxxxx| 成人18视频日本| 超碰在线国产97| 欧美日韩精品福利| 你懂得在线网址| 久久乐国产精品| 不卡精品视频| 亚洲福利av| 久久精品官网| aaaaaav| 一区二区三区日本| 国产又黄又粗又猛又爽| 亚洲性xxxx| 成人免费看视频网站| 久久99精品久久久水蜜桃| 亚洲欧美综合国产精品一区| 日本中文字幕影院| 日本一二三不卡| 91久久国产综合久久91| 亚洲精品一区在线观看香蕉| 欧美激情网站| 精品一区二区三区国产| 亚洲久久成人| xfplay5566色资源网站| 亚洲国产日韩精品| 隣の若妻さん波多野结衣| 欧美高清电影在线看| 亚洲国产精品免费视频| 奇米777四色影视在线看| 国产美女精品人人做人人爽| 老熟妇高潮一区二区三区| 欧美夫妻性生活| 精品自拍一区| 亚洲a区在线视频| 欧美不卡一区| 成人一区二区三区仙踪林| 亚洲综合一区二区三区| 性一交一乱一精一晶| 欧美激情欧美激情在线五月| 久久久久久久久成人| 9色视频在线观看| 国产成人免费av在线| 精品小视频在线观看| 亚洲国产古装精品网站| 国产在线观看www| 欧美另类网站| 麻豆高清免费国产一区| 亚洲综合图片一区| 欧美一区午夜视频在线观看| av影片在线看| 亚洲精品欧美极品| 亚洲性图久久| www.色天使| 欧美日韩精品一区二区在线播放 | 欧美影院视频| 亚洲熟妇无码一区二区三区导航| 26uuu国产日韩综合| 亚洲欧美日韩激情| www.欧美免费| av毛片精品| 男女高潮又爽又黄又无遮挡| 国产日韩欧美综合一区| 国产欧美日韩综合精品一区二区三区| 欧美片一区二区三区| 欧美三级自拍| 欧美伦理片在线观看| 一区二区三区色| 日本福利片高清在线观看| 成人黄色大片在线免费观看| 韩日在线一区| 影音先锋制服丝袜| 欧美一卡2卡三卡4卡5免费| 日本不卡网站| gogogo免费高清日本写真| 97精品超碰一区二区三区| 一区二区精品视频在线观看| 国内精久久久久久久久久人| 精品久久成人| 95视频在线观看| 精品久久久久久久久久ntr影视 | 欧美亚洲国产激情| 成人在线播放av| 国自产拍偷拍福利精品免费一 |