精品欧美一区二区三区在线观看 _久久久久国色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| 少妇高潮久久久久久潘金莲| 麻豆tv在线观看| japanese23hdxxxx日韩| 亚洲欧美福利一区二区| 蜜桃视频在线观看91| 国产精品午夜福利| 日韩午夜av| 久久久电影免费观看完整版| a级片在线观看视频| a成人v在线| 激情久久av一区av二区av三区| 日韩av在线一区二区三区| 99免费在线视频| 日韩成人精品在线| 国模极品一区二区三区| 小泽玛利亚一区二区免费| 精品深夜福利视频| 日韩亚洲欧美在线| 欧美xxxxx在线视频| fc2ppv国产精品久久| 久久精品免视看| 国产精选在线观看91| 国产熟女一区二区三区四区| 日本伊人精品一区二区三区观看方式| 欧美精品www| 黄视频网站免费看| 色狮一区二区三区四区视频| 日韩精品视频免费在线观看| 91精品人妻一区二区三区四区| 国产精品久久久久77777丨| 狠狠躁夜夜躁人人躁婷婷91| 国产精品国产三级国产专区51| 欧美成人高清在线| 国产目拍亚洲精品99久久精品| 久久综合久久久| 天天操天天爱天天干| 丁香婷婷综合网| 97av影视网在线观看| 国产免费黄色录像| 精品写真视频在线观看| 国产久一一精品| 中文资源在线播放| 美国十次了思思久久精品导航| 欧美中文字幕在线视频| 欧美啪啪小视频| 免费精品视频| 日韩av片永久免费网站| 亚洲成人av影片| 久久精品九九| 国产精品国产亚洲伊人久久| 波多野结衣日韩| 日本免费新一区视频| 国产精品欧美日韩一区二区| 国产精品第六页| 日韩高清中文字幕一区| 国产精品国产三级国产aⅴ浪潮| 成人小视频在线播放| 免费在线观看日韩欧美| 91精品国产综合久久久久久蜜臀| 中文字幕av影视| 久久久久99| 国产精品一区二区三区免费视频 | 俄罗斯毛片基地| 成人影院在线| 美女啪啪无遮挡免费久久网站| 91成人福利视频| 激情亚洲网站| 欧美主播福利视频| 黄色一区二区视频| 国产综合色在线| 国模精品娜娜一二三区| 色视频在线观看| 欧美高清在线精品一区| 黄色免费高清视频| 国模私拍视频在线播放| 午夜精品久久久久久久久| 久久久久免费精品| 欧美黄色a视频| 日韩精品中午字幕| 天堂久久久久久| 日韩一区二区三区免费播放| 久久久国产精品亚洲一区| 欧美日韩国产精品综合| 亚洲一区黄色| 国产精品久久久久久久久男| 国产又粗又大又黄| 成人免费看的视频| 婷婷久久伊人| 色婷婷在线播放| 色噜噜狠狠色综合中国 | 精品一区二区精品| 国产精品成人一区二区三区| 色av男人的天堂免费在线| 国产精品久久夜| 韩日视频在线观看| 欧美成人黄色| 精品无人国产偷自产在线| 女性裸体视频网站| 亚洲综合国产| 不卡的av一区| 一级日本在线| 狠狠做深爱婷婷久久综合一区| 国产精品区在线| 色综合www| 欧美国产精品人人做人人爱| 小泽玛利亚一区二区三区视频| 国产成人综合亚洲91猫咪| 日本不卡二区高清三区| 精灵使的剑舞无删减版在线观看| 欧美在线观看一区| 国产三级视频网站| 影音先锋亚洲电影| 91久久久国产精品| 97人人在线| 日韩欧美主播在线| 日韩无码精品一区二区| 婷婷久久综合| 国产精品夜色7777狼人| 欧美精品少妇| 欧美日韩在线另类| av在线播放网址| 欧美日韩一区自拍| 亚洲一区二区免费| 欧美日本一道| 欧美性精品220| 天天躁日日躁狠狠躁av麻豆男男 | 国产黄色片免费在线观看| 视频91a欧美| 在线播放国产一区二区三区| 国产手机在线视频| 成人精品鲁一区一区二区| 18视频在线观看娇喘| 久久69成人| 自拍偷拍免费精品| 在线视频 91| 国产欧美va欧美不卡在线| 99视频精品免费| 岳的好大精品一区二区三区| 国内精品小视频| 高h调教冰块play男男双性文| 亚洲精品美国一| 人妻精油按摩bd高清中文字幕| 欧美韩国日本在线观看| 国产一区二区丝袜高跟鞋图片| 成黄免费在线| 欧美日韩日本视频| 四虎永久免费在线| 国产九九视频一区二区三区| 最新黄色av网站| 日本一区二区三区视频在线看 | 黄色漫画在线免费看| 亚洲成人网在线观看| 国产一级一级片| 99riav久久精品riav| 欧美在线观看www| 亚洲涩涩av| 国产精品免费电影| 黄色网址在线免费观看| 欧美一级在线免费| 久久久久99精品| 97精品久久久午夜一区二区三区| 久色视频在线播放| 国产一区二区三区日韩精品| 国产精品视频自拍| 国产福利在线播放麻豆| 精品精品欲导航| av午夜在线| 美女脱光内衣内裤视频久久影院| 日本一区二区三区在线视频| 97精品国产综合久久久动漫日韩 | 精品人妻二区中文字幕| 欧美日韩蜜桃| 久久久久资源| 成人1区2区| 欧美片一区二区三区| 黄色一级大片在线免费看国产一 | 日韩在线www| 午夜精品久久久久久久第一页按摩| 亚洲高清免费视频| 一级黄色录像毛片| 国产成人免费xxxxxxxx| 人妻内射一区二区在线视频| 欧美大黑bbbbbbbbb在线| 国产精品高潮粉嫩av| 自由的xxxx在线视频| 日韩大陆毛片av| 国产精品无码专区av免费播放| 亚洲成年人网站在线观看| 亚洲午夜精品久久久久久高潮| 国产精品一区二区无线| 成人午夜视频免费在线观看| 久久久久国产精品| 欧美激情视频一区二区三区| 亚洲精品大全| 日韩av男人的天堂| 国内在线免费视频| 视频在线观看一区二区| 亚洲aⅴ乱码精品成人区| 欧美人与z0zoxxxx视频| 色婷婷av国产精品| 亚洲三级免费电影| 久久久久久久久久久久| 成人毛片老司机大片| 亚洲天堂国产视频| 老牛影视一区二区三区| 日韩网站在线免费观看| 亚洲国产一区二区三区在线播放| 欧美日韩电影一区二区| 中文字幕久久精品一区二区 | 亚洲国产视频二区| 国产精品女视频| 台湾佬中文娱乐久久久| 久久久久亚洲精品| 伊人手机在线| 精品国产一区二区三区四区在线观看 | 偷拍自拍亚洲| 国产精品久久91| 深夜成人福利| 欧洲日韩成人av| 激情视频网站在线播放色| 欧美国产一区二区三区| 国产在线激情| 日韩中文字幕在线视频| 成黄免费在线| 中文字幕亚洲自拍| 番号集在线观看| 亚洲桃花岛网站| 欧美日韩视频精品二区| 日韩高清不卡av| 色噜噜在线播放| 亚洲福利在线播放| 黄片毛片在线看| 欧美v日韩v国产v| 亚洲国产视频一区二区三区| 91精品国产综合久久蜜臀| 亚洲一区二区激情| 欧美日本韩国一区二区三区视频| 中文字幕自拍偷拍| 欧美三级一区二区| 亚洲综合网av| 91精品国产色综合久久不卡蜜臀| 成人免费一区二区三区| 欧美日韩aaaaaa| av中文在线观看| 精品国产一区二区三区久久久蜜月 | 国产美女高潮在线观看| 午夜精品久久久久久久白皮肤| 成人在线高清免费| 欧美亚洲成人精品| 欧美日韩国产v| 国产精品小说在线| 国产原创一区| 91成人理论电影| 999久久精品| 久久久久久久久久码影片| 亚洲色图丝袜| 伊人久久99| 欧美精品aa| av之家在线观看| 欧美亚洲网站| 农村妇女精品一二区| 美女视频黄频大全不卡视频在线播放| 天天干天天爽天天射| 国产一区亚洲一区| 国产精品麻豆入口| 国产区在线观看成人精品| 羞羞在线观看视频| 亚洲一本大道在线| 免费看一级视频| 8x8x8国产精品| 欧美一级性视频| 最近2019免费中文字幕视频三| 精品欧美色视频网站在线观看| 久久久久久久久久久av| 欧美××××黑人××性爽| 国产欧美久久一区二区| 中文字幕日韩在线| 日本欧美色综合网站免费| 国产精品99一区二区三区| 无码日本精品xxxxxxxxx| 美女久久网站| 国产农村妇女精品久久| 99久久婷婷国产精品综合| 欧美三级视频网站| 亚洲国产精品自拍| 国产一级精品毛片| 精品精品欲导航| av在线免费观看网| 久久久在线视频| 久久亚洲国产精品尤物| 国产综合色一区二区三区| 久久亚洲国产| 久久精品国产精品亚洲色婷婷| 久久精品国产亚洲aⅴ| 欧亚乱熟女一区二区在线| 国产精品人人做人人爽人人添| 国产一级在线观看视频| 欧美日韩精品三区| 天堂中文字幕在线| 大胆欧美人体视频| 99欧美精品| 久久er99热精品一区二区三区| 亚洲欧美色图| 欧美亚洲日本在线观看| 99精品视频免费在线观看| av黄色免费在线观看| 色哟哟精品一区| 好男人www在线视频| 蜜臀久久99精品久久久久久宅男| 一区二区视频免费完整版观看| 国产精品一区二区欧美黑人喷潮水| 日本欧美视频| 欧美一级片中文字幕| 99热在这里有精品免费| 青春草免费视频| 制服丝袜激情欧洲亚洲| av影片免费在线观看| 欧美怡春院一区二区三区| 给我免费播放日韩视频| 警花观音坐莲激情销魂小说| 全国精品久久少妇| 日本一级免费视频| 色综合欧美在线视频区| 色婷婷av一区二区三区之红樱桃| 久久不射热爱视频精品| 亚洲二区av| 五月天色婷婷综合| 极品少妇xxxx精品少妇偷拍| 女人十八毛片嫩草av| 91极品美女在线| 久久国产精品高清一区二区三区| 91av在线免费观看| 日韩中文av| 啊啊啊一区二区| 久久综合色播五月| 亚洲婷婷综合网| 亚洲美女喷白浆| 欧美电影网址| 日韩欧美电影一区二区| 日本va欧美va瓶| 亚欧精品视频一区二区三区| 欧美三区免费完整视频在线观看| 成人午夜电影在线观看| 国产精品一区二区久久精品| 日韩精品影视| 日本中文字幕在线不卡| 一区二区三区色| 日韩中文字幕免费在线观看| 国产69精品久久久久99| 先锋影音国产精品| 午夜视频在线瓜伦| 国产精品久久综合| 99精品免费观看| 性欧美视频videos6一9| 日韩三区视频| 亚洲国产精品三区| 亚洲视频免费观看| 亚洲男女视频在线观看| 性欧美长视频免费观看不卡| 日韩精品丝袜美腿| 91极品尤物在线播放国产| 亚洲欧美在线另类| 成人免费观看在线视频| 欧美性视频网站| 99视频精品视频高清免费| 真实乱偷全部视频| 懂色av影视一区二区三区| 狠狠色伊人亚洲综合网站l | 国产精品自在| 国产精品97在线| 亚洲色图欧美在线| 午夜影院免费视频| 国产九九精品视频| 日韩午夜av| 欧美一区二区三区观看| 亚洲国模精品私拍| 亚洲精品成人一区| 精品人妻一区二区三区四区在线| 亚洲国产精品成人综合| h片在线免费看| 国产不卡av在线免费观看| 1024精品久久久久久久久| 国产激情视频网站| 在线成人免费观看| 中文字幕这里只有精品| 国产三级中文字幕| www一区二区| 国产不卡av在线播放| 国产精品久久二区| 亚洲先锋成人| 亚洲 欧美 国产 另类| 亚洲美女黄色片| 国产精品极品国产中出|