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

WebAssembly取代JavaScript時代來臨?

開發 前端
總結就是,V8通過樁入口進入到Builtins相對應的實現預定好的執行函數,進行執行,其中的解釋,編譯,以及執行,跟其它語言比如Rust/Java等沒有什么分別。

前言

V8除了解釋和編譯JS之外,其它的功能如還可以編譯WebAssembly。屬于雙引擎性質的組件,功能天然強大,有谷歌的支撐微軟協助,背景也夠硬。

WebAssembly(后面簡稱:Wasm)這幾年的火爆程序不亞于AI,它以短小,精悍,緊湊的二進制格式。在游戲,音視頻,云,區塊鏈等方面幾乎全方位的秒殺了JS那笨重和簡陋的設計。甚至一些久經考驗的,聲名遠揚的桌面軟件比如AutoCAD、Photoshop通過Wasm部分移植到了web端。nodejs也用到了v8組件進行js解析。

同時可以把Rust,C++,Go的代碼編譯成Wasm,然后運行在瀏覽器上。因Wasm字節碼是一個偽C形式的代碼,但更接近匯編,它天然在對抗逆向方面有強效作用。

本篇來看下它的核心所在。

詳情

取代JS是否可行?看例子

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>WASM Demo</title>
</head>
<body>
<h1>WASM</h1>
<script>
(async () => {
    const Wasm = "AGFzbQEAAAABBwFgAn9/AX8DAgEABwcBA2FkZAAACgkBBwAgACABags=";
    const bytes = Uint8Array.from(atob(Wasm), c => c.charCodeAt(0)); 
    const { instance } = await WebAssembly.instantiate(bytes.buffer);
    const result = instance.exports.add(60, 60);
    const p = document.createElement('p');
    p.textContent = `60 + 60 = ${result}`;
    document.body.appendChild(p);
})();
</script>
</body>
</html>

給Script腳本進行了Wasm的操作,沒有用JS。我們看下純Wasm。

const Wasm = "AGFzbQEAAAABBwFgAn9/AX8DAgEABwcBA2FkZAAACgkBBwAgACABags=";


function base64ToArrayBuffer(base64) {
  const binary_string = (function() {


    const b = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    let s = "";
    let i = 0;
    while (i < base64.length) {
      const e1 = b.indexOf(base64.charAt(i++));
      const e2 = b.indexOf(base64.charAt(i++));
      const e3 = b.indexOf(base64.charAt(i++));
      const e4 = b.indexOf(base64.charAt(i++));
      const c1 = (e1 << 2) | (e2 >> 4);
      const c2 = ((e2 & 15) << 4) | (e3 >> 2);
      const c3 = ((e3 & 3) << 6) | e4;
      s += String.fromCharCode(c1);
      if (e3 != 64) s += String.fromCharCode(c2);
      if (e4 != 64) s += String.fromCharCode(c3);
    }
    return s;
  })();


  const len = binary_string.length;
  const bytes = new Uint8Array(len);
  for (let i = 0; i < len; i++) {
    bytes[i] = binary_string.charCodeAt(i);
  }
  return bytes.buffer;
}


(async () => {
  const buffer = base64ToArrayBuffer(Wasm);
  const { instance } = await WebAssembly.instantiate(buffer);
  const result = instance.exports.add(60, 60);
  print(`60 + 60 = ${result}`);
})();

看Wasm變量;

const Wasm = "AGFzbQEAAAABBwFgAn9/AX8DAgEABwcBA2FkZAAACgkBBwAgACABags=";

這一串代碼的Wasm如下,實際上就實現了一個加法運算;

(module
  (func (param i32 i32) (result i32)
    local.get 0
    local.get 1
    i32.add)
  (export "add" (func 0)))

我們后面通過:

awaitWebAssembly.instantiate(buffer)實例化了一個句柄,然后通過句柄計算兩個整數:instance.exports.add(60, 60)。當然這些表面上的代碼不是我們的重點,我們需要知道的是Add這個函數代碼在內存,在V8(Chromium)引擎里面是怎么被執行的。

先看下它初次的匯編:

D:\chromium\src\out\Debug>d8 --allow-natives-syntax --print-wasm-code "C:\Users\Administrator\Desktop\wasm.js"
--- WebAssembly code ---
name: wasm-function[0]
index: 0
kind: wasm function
compiler: Liftoff
Body (size = 256 = 196 + 60 padding)
Instructions (size = 180)
0xa448f51900     0  4531e4               xorl r12,r12
0xa448f51903     3  e868f8ffff           call 000000A448F51170  (jump table)
0xa448f51908     8  4881ec08000000       REX.W subq rsp,0x8
0xa448f5190f     f  8bc0                 movl rax,rax
0xa448f51911    11  8bd2                 movl rdx,rdx
0xa448f51913    13  8b4eff               movl rcx,[rsi-0x1]
0xa448f51916    16  4903ce               REX.W addq rcx,r14
0xa448f51919    19  0fb74907             movzxwl rcx,[rcx+0x7]
0xa448f5191d    1d  81f9be000000         cmpl rcx,0xbe
0xa448f51923    23  0f8421000000         jz 000000A448F5194A  <+0x4a>
0xa448f51929    29  b94c000000           movl rcx,000000000000004C
0xa448f5192e    2e  4989e2               REX.W movq r10,rsp
0xa448f51931    31  4883ec28             REX.W subq rsp,0x28
0xa448f51935    35  4883e4f0             REX.W andq rsp,0xf0
0xa448f51939    39  4c89542420           REX.W movq [rsp+0x20],r10
0xa448f5193e    3e  48b86022bcc3fc7f0000 REX.W movq rax,00007FFCC3BC2260
0xa448f51948    48  ffd0                 call rax
0xa448f5194a    4a  493b65a0             REX.W cmpq rsp,[r13-0x60]
0xa448f5194e    4e  0f8640000000         jna 000000A448F51994  <+0x94>
//這里即是相加的地方
0xa448f51954    54  8d0c10               leal rcx,[rax+rdx*1]
//中間省略,便于觀看
0xa448f519b2    b2  ebb4                 jmp 000000A448F51968  <+0x68>
Source positions:
 pc offset  position
        96         0  statement
        a6         6  statement
Safepoints (stack slots = 9, entries = 1, byte size = 15)
0xa448f5199b     9b  slots (sp->fp): 000000000
RelocInfo (size = 0)
--- End code ---
60 + 60 = 120

對于add函數,它用的匯編不是add指令,也不是簡單的相加,而是lea指令

0xa448f51954 54  8d0c10  leal rcx,[rax+rdx*1]

用lea的好處,可以在不影響標志位的情況下把寄存器+寄存器的地址求出來。它生成此段匯編的地方如下:

//src\v8\src\wasm\baseline\x64\liftoff-assembler-x64-inl.h
void LiftoffAssembler::emit_i32_add(Register dst, Register lhs, Register rhs) {
  if (lhs != dst) {
    leal(dst, Operand(lhs, rhs, times_1, 0));
  } else {
    addl(dst, rhs);
  }
}

為了定位到emit_i32_add這個函數,我們需要在以下函數下斷點;

void Decode() {
  //省略便于觀看
  DecodeFunctionBody();
  }

以及;

//src\v8\src\wasm\function-body-decoder-impl.h
void DecodeFunctionBody() {
  TRACE("wasm-decode %p...%p (module+%u, %d bytes)\n", this->start(),
        this->end(), this->pc_offset(),
        static_cast<int>(this->end() - this->start()));
  {


  if (V8_LIKELY(this->current_inst_trace_->first == 0)) {
    // Decode the function body.
    while (this->pc_ < this->end_) {
      // Most operations only grow the stack by at least one element (unary
      // and binary operations, local.get, constants, ...). Thus check that
      // there is enough space for those operations centrally, and avoid any
      // bounds checks in those operations.
      stack_.EnsureMoreCapacity(1, this->zone_);
      uint8_t first_byte = *this->pc_;
      WasmOpcode opcode = static_cast<WasmOpcode>(first_byte);
      CALL_INTERFACE_IF_OK_AND_REACHABLE(NextInstruction, opcode);
      int len;
      // Allowing two of the most common decoding functions to get inlined
      // appears to be the sweet spot.
      // Handling _all_ opcodes via a giant switch-statement has been tried
      // and found to be slower than calling through the handler table.
      if (opcode == kExprLocalGet) {
        len = WasmFullDecoder::DecodeLocalGet(this, opcode);
      } else if (opcode == kExprI32Const) {
        len = WasmFullDecoder::DecodeI32Const(this, opcode);
      } else {
        //這里下斷點
        OpcodeHandler handler = GetOpcodeHandler(first_byte);
        len = (*handler)(this, opcode);
      }
      this->pc_ += len;
    }


  }

最終會把生成的機器碼賦值給下面;

jit_allocation的address變量進行執行。這個地方如果是.NET它會直接用生成機器碼地址進行跳轉執行,而不會再次賦值或者拷貝到其它地址。

//src\v8\src\wasm\wasm-code-manager.cc
WritableJitAllocation jit_allocation = ThreadIsolation::LookupJitAllocation(
    reinterpret_cast<Address>(dst_code_bytes.begin()),
    dst_code_bytes.size(), ThreadIsolation::JitAllocationType::kWasmCode,
    true);
jit_allocation.CopyCode(0, desc.buffer, desc.instr_size);

由于以上代碼都在RUNTIME_FUNCTION宏;

RUNTIME_FUNCTION(Runtime_WasmCompileLazy) {
  DCHECK_EQ(2, args.length());
  Tagged<WasmTrustedInstanceData> trusted_instance_data =
      TrustedCast<WasmTrustedInstanceData>(args[0]);
  int func_index = args.smi_value_at(1);


  TRACE_EVENT1("v8.wasm", "wasm.CompileLazy", "func_index", func_index);
  DisallowHeapAllocation no_gc;
  SealHandleScope scope(isolate);


  DCHECK(isolate->context().is_null());
  if (trusted_instance_data->has_native_context()) {
    isolate->set_context(trusted_instance_data->native_context());
  }
  bool success = wasm::CompileLazy(isolate, trusted_instance_data, func_index);
  if (!success) {
    DCHECK(v8_flags.wasm_lazy_validation);
    AllowHeapAllocation throwing_unwinds_the_stack;
    wasm::ThrowLazyCompilationError(
        isolate, trusted_instance_data->native_module(), func_index);
    DCHECK(isolate->has_exception());
    return ReadOnlyRoots{isolate}.exception();
  }


  return Smi::FromInt(
      wasm::JumpTableOffset(trusted_instance_data->module(), func_index));
}

最終是由v8.dll!Builtins_XXXX函數調比如下面的Builtins_WasmCEntry堆棧;

>	v8.dll!Builtins_WasmCEntry()	C++
 	v8.dll!Builtins_WasmCompileLazy()	C++
 	v8.dll!Builtins_JSToWasmWrapperAsm()	C++
 	v8.dll!Builtins_JSToWasmWrapper()	C++
 	v8.dll!Builtins_InterpreterEntryTrampoline()	C++
 	v8.dll!Builtins_AsyncFunctionAwaitResolveClosure()	C++
 	v8.dll!Builtins_PromiseFulfillReactionJob()	C++
 	v8.dll!Builtins_RunMicrotasks()	C++
 	v8.dll!Builtins_JSRunMicrotasksEntry()	C++
 	[內聯框架] v8.dll!v8::internal::GeneratedCode<unsigned long long,unsigned long long,v8::internal::MicrotaskQueue *>::Call(unsigned __int64 args, v8::internal::MicrotaskQueue * args) 行 212	C++
 	v8.dll!v8::internal::`anonymous namespace'::Invoke(v8::internal::Isolate * isolate, const v8::internal::`anonymous namespace'::InvokeParams & params) 行 556	C++

v8.dll!Builtins_WasmCEntry()調用

RUNTIME_FUNCTION宏的地方和返回的地方

00007FFCAC47D6DC FF D3 call rbx   //調用的地方
//調用之后返回的地方
00007FFCAC47D6DE 49 3B 85 C8 03 00 00 cmp rax,qword ptr [r13+3C8h]

當然最終的Wasm代碼執行在

Builtins_WasmCompileLazy

00007FFCAC4449A0 41 FF E7 jmp r15

經過兩個jmp的跳轉終于來到了wasm代碼匯編地方

0000078B48441900 45 31 E4             xor         r12d,r12d  
0000078B48441903 E8 68 F8 FF FF       call        0000078B48441170  
0000078B48441908 48 81 EC 08 00 00 00 sub         rsp,8  
0000078B4844190F 8B C0                mov         eax,eax  
0000078B48441911 8B D2                mov         edx,edx  
//此處省略

結尾

總結就是,V8通過樁入口進入到Builtins相對應的實現預定好的執行函數,進行執行,其中的解釋,編譯,以及執行,跟其它語言比如Rust/Java等沒有什么分別。

無論是V8的JS引擎和Wasm引擎,本質上都屬于編譯范疇,并不難。難點在于其龐大的外圍組件和技術。

比如(以下參考網路)

Browser 進程

(瀏覽器主進程)

所有其它進程的“調度者”。負責窗口管理、地址欄/書簽/下載管理、網絡堆棧(大部分 HTTP 請求)、磁盤緩存、權限控制、插件/子進程生命周期管理等。UI(標簽欄、工具欄)也在這里渲染。

Renderer 進程

(渲染進程)

每個標簽頁(或 iframe group / 站點隔離單元)對應一個渲染進程。負責解析 HTML/CSS/JS,排版布局、執行 JavaScript、構建 DOM 樹和 Render Tree,合成圖層(Compositing)等。崩潰時只影響該標簽頁。

GPU 進程

把各個 Renderer 的圖層交給 GPU 進行加速合成、WebGL、Canvas、視頻解碼等工作。減少 CPU 占用,提高流暢度。

Network Service 進程

(較新版本)

原本在 Browser 進程里的網絡堆棧現在拆出來單獨進程,用于安全隔離和更高性能的網絡請求、DNS 解析、緩存處理。

Extension/插件進程

每個擴展/插件(非 PPAPI 的也可能共用)有自己的進程,執行擴展 JS、后臺頁面、content script 與 UI 通信等。

Utility 進程

輔助工作進程,如音視頻解碼、文件讀寫、打印、索引等獨立模塊。崩潰也不會影響主瀏覽器。

Crashpad / 報錯進程

負責崩潰報告、日志收集,保證即便崩潰也能上傳 dump。

Sandboxed Service Worker / Isolated Origin 進程

在站點隔離、service worker、shared worker 下可能單獨拉起的子進程,進一步隔離不同域或 worker。

這些組件導致了Chromium異常的龐大,一個level-symbols one和two的compile結果高達200多個G。

責任編輯:武曉燕 來源: 江湖平淡
相關推薦

2022-06-15 12:48:14

WebAssemblDockerKubernetes

2021-02-15 15:28:38

機器人人工智能春晚

2012-10-24 13:42:04

2012-05-24 11:23:45

開源云計算

2015-11-16 13:21:01

客服

2013-12-04 10:40:23

華為存儲全閃存陣列高端存儲

2010-01-19 22:07:24

2021-06-07 15:27:34

機器人人工智能AI

2021-04-15 11:04:13

云計算分布式邊緣計算邊緣計算

2013-10-23 09:26:56

虛擬桌面DaaS桌面基礎設施

2012-06-28 09:33:07

Google Glas谷歌眼鏡

2011-09-07 11:40:44

2012-11-07 09:11:50

2021-04-15 17:39:39

大數據互聯網大數據應用

2015-10-30 13:38:45

阿里財報DT

2012-06-06 16:56:13

2015-08-07 10:09:54

AWS亞馬遜機器學習

2017-11-06 15:03:55

2009-02-04 19:41:12

網絡拓撲管理Mocha BSM摩卡
點贊
收藏

51CTO技術棧公眾號

亚洲制服丝袜av| 国产精品自产自拍| www国产精品视频| 波多野结衣网页| 午夜欧美激情| 最新成人av在线| 久久天天狠狠| 国产精品嫩草影院精东| 国产日韩免费| 久久视频免费在线播放| 国产制服丝袜在线| av日韩在线免费观看| 精品久久久香蕉免费精品视频| 亚洲国产精品一区二区第一页| 亚洲国产精品欧美久久| 日韩av中文在线观看| 欧美精品18videos性欧| 中文字幕在线观看免费高清| 91精品入口| 91久久一区二区| 国产欧美日韩网站| 91精品久久| 欧美国产一区视频在线观看| 国产精品一区二区a| 岳乳丰满一区二区三区| 免费欧美日韩| 久久久久久中文字幕| 美女网站视频色| 午夜先锋成人动漫在线| 欧美成人精品二区三区99精品| 亚洲xxxx2d动漫1| 激情视频网站在线播放色| 亚洲乱码国产乱码精品精98午夜| 亚洲高清视频一区| 日本一本草久在线中文| 成人美女在线视频| 亚洲一区中文字幕在线观看| 中文资源在线播放| 丝袜美腿亚洲综合| 538国产精品一区二区在线| 国产在线观看你懂的| 欧美二区视频| 麻豆一区二区在线观看| 亚洲一二三四五六区| 精品精品久久| 国产一区二区三区在线视频| 毛茸茸多毛bbb毛多视频| www.神马久久| 亚洲精品一区二区三区在线观看| 不卡的一区二区| 亚洲精品国产九九九| 91精品国产麻豆国产自产在线| 午夜久久福利视频| 日韩福利影视| 91麻豆精品国产自产在线观看一区 | 天堂网在线观看视频| 国产精品一区二区在线看| 国产色视频一区| 91精品中文字幕| 久久99国产精品久久99| 成人美女免费网站视频| 99热这里只有精品66| 国产不卡在线视频| 国产a一区二区| 天堂在线资源8| 97精品电影院| 欧美视频1区| 国产永久免费高清在线观看| 欧美国产丝袜视频| 亚洲在线色站| 色在线视频网| 激情成人中文字幕| 国产精品免费观看久久| 欧美一级二级视频| 欧美一区二区视频在线观看2020 | 成人18视频在线播放| 黄色国产精品一区二区三区| 涩涩视频在线观看免费| 中日韩av电影| 成年在线观看视频| 国产污视频在线播放| 在线一区二区三区四区| 激情文学亚洲色图| 超碰精品在线| 在线日韩av观看| 一区二区视频免费看| 欧美视频亚洲视频| 国产98色在线| 999久久久久| 91麻豆6部合集magnet| 亚洲春色综合另类校园电影| 亚洲奶水xxxx哺乳期| 丁香五六月婷婷久久激情| 日本黄大片一区二区三区| 欧美成人精品一级| 亚洲欧洲视频在线| 色欲人妻综合网| 一区二区激情| 成人免费在线网址| 午夜影院免费视频| **欧美大码日韩| 欧美老熟妇喷水| 伊人亚洲精品| 国产丝袜一区二区三区| 永久久久久久久| 天堂va蜜桃一区二区三区 | 黄色国产小视频| 亚洲国产aⅴ精品一区二区| 亚洲欧洲视频在线| 国产无遮挡又黄又爽又色| 奇米一区二区三区av| 国产成人精品福利一区二区三区| 国产高清美女一级毛片久久| 香蕉加勒比综合久久| 成人亚洲免费视频| 国产一区二区三区91| 久久久久久中文字幕| 国产精品毛片久久久久久久av| 91亚洲精品久久久蜜桃网站 | 熟女少妇内射日韩亚洲| 亚洲国产91| 91日本在线视频| jizz日韩| 色婷婷久久一区二区三区麻豆| 国产一级二级av| 久久综合成人| 国产精品xxx视频| 人成在线免费视频| 亚洲一区在线免费观看| 亚洲熟女乱综合一区二区| 99热在线成人| 国产免费成人av| 国产一区二区三区不卡在线| 欧美性生活大片免费观看网址| 少妇献身老头系列| 欧美一区成人| 91精品在线一区| 日本中文字幕在线看| 在线欧美日韩国产| 中文字幕免费高清| 久久一区亚洲| 欧美日本亚洲| 国产不卡网站| 亚洲欧美激情另类校园| 性无码专区无码| 26uuu国产电影一区二区| 亚洲熟妇无码一区二区三区| 成人影院中文字幕| 午夜精品一区二区三区视频免费看| 精品国产九九九| 亚洲精品国产无天堂网2021| 在线视频观看一区二区| 欧美黄在线观看| www.成人av| 黄网站在线观| 欧美精品一区二| 久久久国产高清| 国产香蕉久久精品综合网| 久久午夜夜伦鲁鲁一区二区| 欧美限制电影| 国产日韩在线视频| 性xxxfreexxxx性欧美| 欧美大胆一级视频| 97免费在线观看视频| 久久久久久亚洲综合影院红桃| 大肉大捧一进一出好爽动态图| 国产传媒欧美日韩成人精品大片| 国产精品久久久久久久久久99| 1769视频在线播放免费观看| 91精品国产麻豆国产自产在线| 久久久久久久9999| 99国产精品国产精品毛片| chinese少妇国语对白| 国产精品欧美在线观看| 国产精品丝袜视频| 中文字幕免费高清电视剧网站在线观看 | 91精品短视频| 国产91精品青草社区| 国产区在线视频| 欧美一区二区三区在线观看| www.天天色| 亚洲国产精品二十页| 91热视频在线观看| 99视频精品| 午夜视频久久久| 蜜桃在线一区| 欧美资源在线观看| 成人a在线视频免费观看| 亚洲激情在线观看视频免费| 成人一二三四区| 一区二区三区在线免费播放| 亚洲午夜久久久久久久久红桃 | 亚洲综合激情在线| 精品中文字幕人| 看片一区二区| 欧美怡春院一区二区三区| 美女黄视频在线观看| 亚洲精品wwww| 国产麻豆精品一区| 在线免费精品视频| 国产在线拍揄自揄拍| 欧美国产视频在线| 日韩综合第一页| 黄页网站大全一区二区| 成人免费观看视频在线观看| 天天做天天爱天天综合网| 久久久久久一区| 日本一区精品视频| 国产精品精品国产| 激情aⅴ欧美一区二区欲海潮| 久久久av一区| 国产精品秘入口| 日韩av在线电影网| www.av导航| 欧美另类高清zo欧美| 中文字幕一区在线播放| 亚洲一二三级电影| 久草综合在线视频| 中文字幕亚洲视频| 亚洲精品成人无码| 91视视频在线观看入口直接观看www| 亚洲精品乱码久久久久久9色| 男女男精品视频| 18岁网站在线观看| 亚洲婷婷在线| 特级西西人体www高清大胆| 青青草91久久久久久久久| 欧美在线视频一区二区三区| 精品自拍偷拍| 国产日韩欧美二区| 电影一区二区在线观看| 亚洲va欧美va国产综合久久| 九七电影院97理论片久久tvb| 国产福利精品在线| 免费成人美女女| 欧美最顶级丰满的aⅴ艳星| а√天堂8资源中文在线| 久久久久久国产精品三级玉女聊斋| √天堂8在线网| 久久人人爽亚洲精品天堂| 麻豆网站视频在线观看| 中文字幕亚洲激情| 色视频在线免费观看| 一本色道久久88综合亚洲精品ⅰ | 久久久亚洲精品一区二区三区| 成人在线电影网站| 不卡电影免费在线播放一区| 中国黄色片视频| 97久久精品人人做人人爽50路| 亚洲综合自拍网| 久久久综合视频| 国产黄色大片免费看| 国产日韩欧美a| 欧美a在线播放| 日韩一区欧美小说| 欧美成人精品欧美一| 亚洲国产精品视频| 久久国产精品系列| 日韩欧美在线视频免费观看| 无码人妻aⅴ一区二区三区有奶水| 在线精品观看国产| 一本色道久久综合亚洲| 日韩一二三区视频| 偷拍精品一区二区三区| 亚洲欧美成人网| eeuss影院在线播放| www.xxxx欧美| 999精品网| 国产不卡视频在线| 亚洲精品成人一区| 成人欧美一区二区三区在线观看| 99精品国产一区二区三区2021 | 亚洲精品国产手机| 亚洲精品美女在线观看| 国产黄在线播放| 久久影院中文字幕| а√在线天堂官网| 国产精品久久91| 97品白浆高清久久久久久| 久久青青草原一区二区| 久久高清免费| 人人干视频在线| 日本在线观看不卡视频| 深夜做爰性大片蜜桃| 26uuu欧美| www.99re6| 亚洲成人动漫一区| 中文字幕乱码在线观看| 欧美成人一区二区三区在线观看| 香蕉国产在线视频| 久久久av亚洲男天堂| 日本在线啊啊| 91在线观看欧美日韩| 久久99国产精一区二区三区| 精品无码av无码免费专区| 天堂av在线一区| 国产人成视频在线观看| 国产精品国产自产拍在线| 亚洲免费在线观看av| 777午夜精品免费视频| 日本福利片在线| 欧美高跟鞋交xxxxhd| 99热播精品免费| 精品高清视频| 欧美高清不卡| www.超碰97.com| 久久亚洲免费视频| 久久精品视频9| 91精品久久久久久久99蜜桃| 色视频在线观看福利| 欧美人在线视频| 国产香蕉久久| 欧美一区二区综合| 日韩视频三区| 免费看91视频| 亚洲免费在线看| 96日本xxxxxⅹxxx17| 亚洲日本成人女熟在线观看| 91桃色在线观看| 亚洲一区二区三区sesese| 久久影院100000精品| 又色又爽又高潮免费视频国产| jiyouzz国产精品久久| 青青草原在线免费观看| 911精品产国品一二三产区| 国产黄在线播放| 国产成人在线播放| 久久不卡国产精品一区二区| 黄页网站大全在线观看| 成人国产在线观看| 国产一级做a爰片在线看免费 | 人操人视频在线观看| 久久久久一本一区二区青青蜜月 | 麻豆一区二区99久久久久| 欧美熟妇一区二区| 欧美午夜片在线免费观看| 人人妻人人澡人人爽人人欧美一区| 欧美黑人国产人伦爽爽爽| 九九99久久精品在免费线bt| 免费观看黄色大片| 狠狠色丁香久久婷婷综合丁香| 黄色激情小视频| 欧美日韩另类国产亚洲欧美一级| 大地资源中文在线观看免费版| 青青青国产精品一区二区| 五月国产精品| 日韩视频在线免费看| 国产三级精品在线| 中文在线字幕av| xvideos亚洲人网站| 国产精品久久久久久av公交车| 中文字幕在线亚洲三区| 黄页视频在线91| 久久久久99精品成人片毛片| 精品久久久网站| 瑟瑟视频在线看| 色综合视频二区偷拍在线| 久久精品国产一区二区三 | 欧美性69xxxx肥| 国产午夜在线视频| 成人激情视频小说免费下载| 亚洲91中文字幕无线码三区| 人妻巨大乳一二三区| 亚洲国产wwwccc36天堂| 日本国产在线| 国产日韩欧美在线视频观看| 欧美激情日韩| 日本黄色动态图| 色狠狠一区二区三区香蕉| 91九色在线porn| 成人自拍爱视频| 久久久国产精品一区二区中文| 国产黄色大片免费看| 欧美一卡二卡三卡四卡| av日韩中文| 日本一区二区三区视频在线播放| 麻豆成人av在线| 久久免费视频99| 亚洲视频在线观看| 动漫一区二区三区| 欧美激情 国产精品| 国产精品久久久久久久久晋中| 亚洲精品久久久久久久久久久久久久 | 亚洲精品久久久久久国| 精品久久人人做人人爰| 成人午夜精品| www.日本在线视频| 欧美激情综合网| 亚洲卡一卡二卡三| 国产精品精品国产| 亚洲久久在线| 少妇高潮一区二区三区喷水| 亚洲电影免费观看高清完整版在线| 四虎4545www精品视频| 男人天堂网站在线| 中文字幕欧美国产| 少妇喷水在线观看| 国产一区玩具在线观看| 国产欧美综合一区二区三区| 欧美另类videoxo高潮|