日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

保护模式 对CPL,RPL,DPL 的总结

發布時間:2025/6/15 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 保护模式 对CPL,RPL,DPL 的总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

先說下特權級的概念,在保護模式下,系統依靠特權級來實施代碼和數據的保護,相當于權限
啦。特權級共有4 個級別,0,1,2,3,數字越小表示權限越高。如圖:


較為核心的代碼和數據放在較高(靠內)的層級中,處理器用此來防止較低特權的任務在不被
允許的情況下訪問處于高特權級的段。為了防止概念混淆,我們不用特權級大小來說明,改
為內層(高),外層(低)來講。
特權級有3 種:CPL,DPL 和RPL,每個都是有4 個等級。
我對他們的關系理解是這樣:一般來說,CPL 代表當前代碼段的權限,如果它想要去訪問
一個段或門,首先要看看對方的權限如何,也就是檢查對方的DPL,如果滿足當前的權限
比要訪問的權限高,則有可能允許去訪問,有些情況我們還要檢查選擇子的權限,即RPL,
因為我們通過選擇子:偏移量的方式去訪問一個段,這算是一個訪問請求動作,因此稱為請
求訪問權限RPL(Requst Privilege Level)。當請求權限也滿足條件,那么訪問就被
允許了。
CPL(Current Privilege Level)
CPL 是當前執行的任務的特權等級,它存儲在CS 和SS 的第0 位和第1 位上。(兩位表示0~3
四個等級)
通常情況下,CPL 等于代碼所在段的特權等級,當程序轉移到不同的代碼段時,處理器將改變
CPL。
注意:在遇到一致代碼段時,情況特殊,一致代碼段的特點是:可以被等級相同或者更低特權級
的代碼訪問,當處理器訪問一個與當前代碼段CPL 特權級不同的一致代碼段時,CPL 不會改
變。
DPL(Descriptor Privilege Level)
表示門或者段的特權級,存儲在門或者段的描述符的DPL 字段中。正如上面說的那樣,當當前
代碼段試圖訪問一個段或者門時,其DPL 將會和當前特權級CPL 以及段或門的選擇子比較,
根據段或者門的類型不同,DPL 的含義不同:
1.數據段的DPL:規定了訪問此段的最低權限。比如一個數據段的DPL 是1,那么只有運
行在CPL 為0 或1 的程序才可能訪問它。為什么說可能呢?因為還有一個比較的因素是RPL。
訪問數據段要滿足有效特權級別(上述)高于數據段的DPL.
2.非一致代碼段的DPL(不使用調用門的情況):DPL 規定訪問此段的特權,只有CPL 與
之相等才有可能訪問。
3.調用門的DPL,規定了程序或任務訪問該門的最低權限。與數據段同。
4.一致代碼段和通過調用門訪問的非一致代碼段,DPL 規定訪問此段的最高權限。
比如一個段的DPL 為2,那么CPL 為0 或者1 的程序都無法訪問。
5. TSS 的DPL,同數據段。
RPL(Rquest Privilege Level)
RPL 是通過選擇子的低兩位來表現出來的(這么說來,CS 和SS 也是存放選擇子的,同時CPL
存放在CS 和SS 的低兩位上,那么對CS 和SS 來說,選擇子的RPL=當前段的CPL)。處理
器通過檢查RPL 和CPL 來確認一個訪問是否合法。即提出訪問的段除了有足夠的特權級CPL,
如果RPL 不夠也是不行的(有些情況會忽略RPL 檢查)。
為什么要有RPL?
操作系統往往通過設置RPL 的方法來避免低特權級的應用程序訪問高特權級的內層數據。
例子情景:調用者調用操作系統的某過程去訪問一個段。
當操作系統(被調用過程)從應用程序(調用者)接受一個選擇子時,會把選擇子的RPL 設置稱調
用者的權限等級,于是操作系統用這個選擇子去訪問相應的段時(這時CPL 為操作系統的等級,
因為正在運行操作系統的代碼),處理器會使用調用者的特權級去進行特權級檢查,而不是正在
實施訪問動作的操作系統的特權級(CPL),這樣操作系統就不用以自己的身份去訪問(就防止了
應用去訪問需要高權限的內層數據,除非應用程序本身的權限就足夠高)。
那么RPL 的作用就比較明顯了:因為同一時刻只能有一個CPL,而當低權限的應用去調用擁
有至高權限的操作系統的功能來訪問一個目標段時,進入操作系統代碼段時CPL 變成了操作系
統的CPL,如果沒有RPL,那么權限檢查的時候就會用CPL,而這個CPL 權限比應用程序高,
也就可能去訪問需要高權限才能訪問的數據,這就不安全了。所以引入RPL,讓它去代表訪問
權限,因此在檢查CPL 的同時,也會檢查RPL.一般來說如果RPL 的數字比CPL 大(權限比
CPL 的低),那么RPL 會起決定性作用。
說這么多不明白都不行啦~真累
下面是引用的一個超棒的關于權限控制的總結:
引用地址
還有一篇文章在此。
數據訪問時的權限check
一、 訪問data segment 時(ds、es、fs 及gs)
1、 程序指令要訪問數據時,data segment selector 被加載進 data segment register
(ds、es、fs 和 gs)前,處理器會進行一系列的權限檢查,通過了才能被加載進入segment
register。處理器分為兩步進行檢查:
★ CPL(當前程序運行的權限級別)與RPL(位于selector 中的 RPL)作比較,并設置
有效權限級別為低權限的一個。
★ 得出的有效權限級別與DPL(segment descriptor 中的DPL)作比較,有效權限級
別高于DPL,那么就通過。低于就不允許訪問。
2、舉個例子:
如果:CPL = 3、RPL = 2、DPL = 2。那么
EPL = CPL > RPL ? CPL : RPL;
if (EPL <= DPL) {
/* 允許訪問 */
} else {
/* 失敗,#GP 異常生產,執行異常 */
}
或者:
if ((CPL <= DPL) && (RPL <= DPL)) {
/* 允許訪問 */
} else {
/* 失敗,#GP 異常生產,執行異常 */
}
也就是要訪問目標data segment,那么必須要有足夠的權限,這個足夠的權限就是:
當前運行的權限級別及選擇子的請求權限級別要高于等于目標data segment 的權限級
別。
二、 訪問stack segment 時
1、 該問stack 時的權限檢查更嚴格,CPL、RPL 及DPL 三者必須相等才能通過該問請
求。
2、 舉個例子:
if (CPL == RPL && RPL == DPL && CPL == DPL) {
/* 允許訪問 */
} else {
/* 失敗,#GP 異常生產,執行異常 */
}
也就是說每個權限級別有相對應的statck segment。不能越權訪問,即使高權限訪問低權
限也是被拒絕的
控制權的轉移及權限檢查。
權限檢查的4 個要素:
★ CPL:處理器當前運行的級別,也就是:當前 CS 的級別,在 CS 的 BIT0 ~ Bit1
★ DPL:訪問目標代碼段所需的級別。定義在 segment descriptor 的 DPL 域中
★ RPL: 通過 selector 進行訪問時,selector 內定義的級別。
★ conforming/nonconforming:目標代碼屬于 nonconforming 還是 conforming
定義在segment descritptor 的 C 標志位中
x86 的各方面檢查依賴于目標代碼段是 nonconforming(不一致) 還是
conforming(一致) 類型
一、 直接轉移(far call 及 far jmp)
1、 直接轉移定義為不帶gate selector 或 taskselector 的遠調用。當執行一條 call
cs:eip 或 jmp cs:eip 指令時,cs 是目標代碼段的selector,處理器在加載指令操作數
中的cs 進cs register 前,要進行一系列的權限檢查,控制權的轉移權限分兩部分,根據
目標代碼段descriptor 定義的兩種情況:
1)、nonconforming target code segment
★ 直接轉移后的權限級別是不能必改變的。因此,CPL 必須要等于目標代碼段的 DPL。
★ 要有足夠的請求權限進行訪問。因此,目標代碼段選擇子的RPL <= CPL
2)、conforming target code segment
★ conforming code segment 允許訪問高權限級別的代碼。這里只需檢
查 CPL >= DPL 即可,RPL 忽略不檢查。
★ 轉移后CPL 不會改變。
2、 以上兩步通過后,處理器加載目標代碼段的CS 進入CS register,但權限級別不
改變,繼而RPL 被忽略。
★ 處理器根據CS selector 在相應的descriptor table 找到 code segment
descriptor。CS 的Bit2(TI 域) 指示在哪個descriptor table 表查找,CS.TI = 0 時
在GDT 查找,CS.TI = 1 時在LDT 查找。
★ CS 的Bit15~Bit3 是selector index 值,處理器基于GDT 或LDT 來查找segment
descriptor。具體是:GDTR.base 或 LDTR.base + CS.SI × 8 得出code segment
descritpro。
★ 處理器自動加載code segment descriptor 的 base address、segment limit 及
attribute 域進入 CS register 的相應的隱藏域。
★ 轉到CS.base + eip 處執行指令
總結:用代碼形式來說明直接轉移 call cs:eip 這條指令
例: call 1a:804304c (即cs = 1a, eip = 804304c)
target_cs = 1a;
target_eip = 0x0804304c;
CPL = CS.RPL; /* 當前執行的代碼段的權限級別就是CPL */
RPL = target_cs.RPL; /* 目標段 selector 的低3位是RPL */
target_si = target_cs.SI; /* 目標段 selector 的索引是Bit15~Bit3 */
target_ti = target_cs.TI; /* 目標段selector的描述符表索引是Bit2 */
CODESEG_DESCRIPTOR target_descriptor;
if (target_ti == 0) { /* target_cs.TI為0 就是參考到 GDT(全局描述符表) */
/* 以GDTR寄存器的base 為基地址加上selector的索引乘以8即得出目標
段描述符,目標描述符的DPL就是目標段所需的訪問權限 */
target_descriptor = GDTR.base + target_si * 8
} else { /* 否則就是參考 LDT (局部描述符表)*/
/* 以 LDTR寄存器的base 為基地址得出目標段描述符 */
target_descriptor = LDTR.base + target_si * 8;
}
DPL = target_descriptor.DPL; /* 獲取DPL */
if (target_descriptor.type & 0x06) { /* conforming */
if (CPL >= DPL) { /* 允許執行高權限代碼 */
/* go ahead */
} else {
/* 引發 #GP 異常 */
goto DO_GP_EXCEPTION;
}
} else { /* nonconforming */
if (CPL == DPL && RPL <= CPL) {
/* go ahead */
} else {
/* 引發 #GP 異常 */
goto DO_GP_EXCEPTION;
}
}
/****** go ahead ? ?******/
CS = target_cs; /* 加載目標段CS 進入 CS 寄存器 */
EIP = target_eip; /* 加載目標指令EIP 進入 EIP 寄存器 */
/* 當前執行權限 CPL 不改變 */
goto target_descriptor.base + target_eip; /* 跳轉到目標地址執行 */
DO_GP_EXCEPTION: /* 執行 #GP異常點 */
? ?
二、 使用call gate 進行控制權的轉移
使用call gate 進行轉移控制,目的是建立一個利用gate 進行向高權限代碼轉移的一種保
護機制。gate 符相當一個進入高權限代碼的一個通道。
對于指令 call cs:eip 來說:
★ 目標代碼的selector 是一個門符的選擇子。用來獲取門描述符。
★ 門描述符含目標代碼段的selector 及目標代碼的偏移量。
★ 目標代碼的ip 值被忽略。因為門符已經提供了目標代碼的偏移量。
1、 權限的檢查
★ 首先,必須要有足夠的權限來訪問gate 符,所以:CPL <= DPLg(門符的DPL)且:
RPL <= DPLg
★ 進前代碼向高權限代碼轉移,所以,對于conforming 類型的代碼段來說,必須CPL >=
DPLs(目標代碼段的DPL)
★ 對于nonconforming 類型代碼段來說,必須CPL = DPLs
★ call 指令改變當前權限,而jmp 指令不改變當前權限。
總結:
if ((CPL <= DPLg) && (RPL <= DPLg)) { /* 足夠的權限訪問門符 */
if (target.C == CONFORMING) { /* 目標代碼屬于 conforming類型 */
/* 向高權限級別代碼轉移控制 */
if (CPL >= DPLs) {
/* 通過訪問 */
} else {
/* 失敗,#Gp異常發生 */
}
} else { /* 目標代碼屬于 nonconforming 類型 */
/* 平級轉移 */
if (CPL == DPLs) {
/* 通過訪問 */
} else {
/* 失敗,#GP 異常發生 */
}
}
} else { /* 沒有足夠權限訪問門符 */
/* #GP 異常發生 */
}
2、 控制權的轉移
指令:call 1a:804304c (其中1a 是call gate selector)
gate_selector = 0x1a; /* call gate selector */
RPL = gate_selector.RPL; /* 門符選擇子RPL */
CPL = CS.RPL; /* 當前代碼段低3位是CPL*/
CALLGATE_DESCRIPTOR call_gate_descriptor; /* 門符的描述符 */
CODESEG_DESCRIPTOR target_cs_descritpor; /* 目標代碼段的描述符 */
call_gate_si = gate_selector.SI; /* 門符 selector 的索引 */
call_gate_ti = gate_selector.TI; /* 門符selector的描述符表索引 */
/* 獲取call gate descriptor */
if (call_gate_ti == 0) { /* TI為0 就是參考到 GDT(全局描述符表) */
/* 以GDTR寄存器的base 為基地址加上selector的索引乘以8即得出門符的描述符,
門符的DPL就是門符的訪問權限 */
call_gate_descriptor = GDTR.base + call_gate_si * 8;
} else { /* 否則就是參考 LDT (局部描述符表)*/
/* 以 LDTR寄存器的base 為基地址得出目標段描述符 */
call_gate_descriptor = LDTR.base + call_gate_si * 8;
}
/* 獲取 target code segment descriptor */
target_cs = call_gate_descriptor.selector; /* 獲取門符的目標代碼段選擇子
*/
target_cs_si = target_cs.SI; /* 目標代碼段的索引 */
target_cs_ti = target_cs.TI; /* 目標代碼描述符表索引 */
if (target_cs_ti == 0)
target_cs_descriptor = GDTR.base + target_cs_si * 8;
else
target_cs_descriptor = LDTR.base + target_cs_si * 8;
DPLg = call_gate_descriptor.DPL; /* 獲取門符的DPL */
DPLs = target_cs_descriptor.DPL; /* 獲取目標代碼段的DPL */
if (CPL <= DPLg && RPL <= DPLg) { /* 有足夠權限訪問門符 */
if (target_cs_descriptor.type & 0x06) { /* conforming */
if (CPL >= DPLs) {
/* 允許訪問目標代碼段 */
} else {
/* #GP 異常產生 */
}
} else if (CPL == DPLs) { /* nonconforming */
/* 允許訪問目標代碼段 */
} else {
/* 拒絕訪問,#GP 異常發生 */
goto DO_GP_EXCEPTION;
}
} else { /* 無權限訪問門符 */
/* 拒絕訪問, #GP異常發生 */
goto DO_GP_EXCEPTION;
}
/* 允許訪問 */
current_CS = target_cs; /* 加載目標代碼段進入CS 寄存器 */
current_CS.RPL = DPLs; /* 改變當前執行段權限 */
current_EIP = call_gate_descriptor.offset; /* 加載EIP */
/* 跳轉到目標代碼執行 */
/* goto current_CS:current_EIP */
goto target_cs_descriptor.base + call_gate_descriptor.offset;
return;
DO_GP_EXCEPTION: /* 執行異常 */
三、 使用中斷門或陷井門進行轉移
中斷門符及陷井門必須存放在IDT 中,IDT 表也可以存放call gate。
1、 中斷調用時的權限檢查
用中斷門符進行轉移時,所作的權限檢查同call gate 相同,區別在于intterrupt gate 轉
移不需要檢查RPL,因為,沒有RPL 需要檢查。
★ 必須有足夠的權限訪問門符,CPL <= DPLg
★ 向同級權限代碼轉移時,CPL == DPLs,向高權限代碼轉移時,CPL > DPLs
總結
if (CPL <= DPLg) { /* 有足夠權限訪問門符 */
if (CPL >= DPLs) {
/* 允許訪問目標代碼頭 */
} else {
/* 失敗,#GP異常發生 */
}
} else {
/* 失敗,#GP異常發生 */
}
2、 控制權的轉移
發生異常或中斷調用時
★ 用中斷向量在中斷描述符表查找描述符:中斷向量×8,然后加上IDT 表基址得出描述
符表。
★ 從查找到的描述符中得到目標代碼段選擇子,并在相應的GDT 或LDT 中獲取目標代碼
段描述符。
★ 目標代碼段描述符的基址加上門符中的offset,確定最終執行入口點。
中斷或陷井門符轉移的總結:
例: int 0x80 指令發生的情況
vector = 0x80;
INTGATE_DESCRIPTOR gate_descriptor = IDTR.base + vector * 8;
CODESEG_DESCRIPTOR target_descriptor;
TSS tss = TR.base; /* 得到TSS 內存塊 */
DPLg = gate_descriptor.DPL;
target_cs = gate_descriptor.selector;
if (CPL <= DPLg) { /* 允許訪問門符 */
if (target_cs.TI == 0) { /* index on GDT */
target_descriptor = GDTR.base + target_cs.SI * 8;
} else { /* index on LDT */
target_descriptor = LDTR.base + target_cs.SI * 8;
}
DPLs = target_descriptor.DPL;
if (CPL > DPLs) { /* 向高權限代碼轉移 */
/* 根據目標代碼段的DPL值來選取相應權限的stack結構 */
switch (DPLs) {
case 0 : /* 假如目標代碼處理0級,則選0級的stack結構 */
SS = tss.ss0;
ESP = tss.esp0;
break;
case 1:
SS = tss.ss1;
ESP = tss.esp1;
break;
case 2:
SS = tss.ss2;
ESP = tss.esp2;
break;
}
/* 以下必須保護舊的stack結構,以便返回 */
*--esp = SS; /* 將當前SS入棧保護 */
*--esp = ESP; /* 將當前ESP入棧保護 */
} else if (CPL == DPLs) {
/* 同級轉移,繼續向下執行 */
} else {
/* 失敗,#GP異常產生,轉去處理異常 */
}
*--esp = EFLAGS; /* eflags 寄存器入棧 */
/* 分別將 NT、NT、RF及VM標志位清0 */
EFLAGS.TF = 0;
EFLAGS.NT = 0;
EFLAGS.RF = 0;
EFLAGS.VM = 0;
if (gate_descriptor.type == I_GATE32) { /* 假如是中斷門符 */
EFLAGS.IF = 0; /* 也將IF標志位清0,屏蔽響應中斷 */
}
*--esp = CS; /* 當前段選擇子入棧 */
*--esp = EIP; /* 當前EIP 入棧 */
CS = target_selector; /* 加載目標代碼段 */
CS.RPL = DPLs; /* 改變當前執行權限級別 */
EIP = gate_descriptor.offset; /* 加載進入EIP */
/* 執行中斷例程 */
goto target_descritptor.base + gate_descriptor.offset;
} else {
/* 失敗,#GP 異常產生,轉去處理異常 */
}
堆棧的切換
控制權發生轉移后,處理器自動進行相應的堆棧切換。
1、 當轉向到同權限級別的代碼時,不會進行堆棧級別的調整,也就是不進行堆棧切換。
2、 當轉向高權限級別時,將發生相應級別的堆棧切換。從TSS 塊獲取相應級別的stack
結構。
例:假如當前運行級別CPL 為2 時,發生了向0 級代碼轉移時:
TSS tss = TR.base; /* 從TR寄存器中獲取TSS 塊 */
CPL = 2; /* 當前運行級別為2 級*/
DPL = 0; /* 目標代碼需要級別為 0 級 */
/* 根據目標代碼需要的級別進行選取相應的權限級別的stack結構 */
switch (DPL) {
case 0:
SS = tss.ss0;
ESP = tss.esp0;
break;
case 1:
SS = tss.ss1;
ESP = tss.esp1;
break;
case 2:
SS = tss.ss2;
ESP = tss.esp2;
break;
}
*--esp = SS; /* 保存舊的stack結構 */
*--esp = ESP;
/* 然后再作相當的保存工作,如保存參數等 */
*--esp = CS; /* 最后保存返回地址 */
*--esp = EIP;
控制權的返回
當目標代碼執行完畢,需要返回控制權給原代碼時,將產生返回控制權行為。返回控制權行
為,比轉移控制權行為簡單得多。因為,一切條件已經在交出控制權之前準備完畢,返回時
僅需出棧就行了。
1、 near call 的返回
近調用情況下,段不改變,即CS 不改變,權限級別不改變。僅需從棧中pop 返回地址就
可以了。
2、 直接控制權轉移的返回(far call 或far jmp)
直接控制權的轉移是一種不改變當前運行級別的行為。只是發生跨段的轉移。這時,CS
被從棧中pop 出來的CS 值加載進去,處理器會檢查CPL 與這個pop 出來的選擇子中的
RPL 進行檢查,相符則返回。不相符則發生 #GP 異常。
總結:假如當前運行的目標代碼執行完畢后,將要返回。這時CPL 為2
CPL = 2; /* 當前代碼運行級別為 2 */
? ?
EIP = *esp++; /* pop出原EIP 值 */
CS = *esp++; /* pop出原CS值 */
if (CPL == CS.RPL) {
/* CS.RPL 代表是原來的運行級別,與CPL相符則返回 */
return ;
} else {
/* #GP異常產生,執行異常處理 */
}
3、 利用各種門符進行向高權限代碼轉移后的返回
從高權限代碼返回低權限代碼,須從stack 中pop 出原來的stack 結構。這個stack 結構
屬于低權限代碼的stack 結構。然后直接pop 出原返回地址就可以了。
總結:
CPL = 0; /* 當前運行級別為 0 級 */
? ?
EIP = *esp++; /* 恢復原地址 */
CS = *esp++; /* 恢復原地址及運行級別 */
ESP = *esp ++; /* 恢復原stack結構 */
SS = *esp++; /* 恢復原stack 結構,同時恢復了原stack訪問級別 */
return ; /* 返回 */

總結

以上是生活随笔為你收集整理的保护模式 对CPL,RPL,DPL 的总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 天堂网8| 久久久久久久久久成人 | 五月天六月婷 | 国内视频一区二区三区 | 久久国产精品偷 | 亚洲视频在线观看免费视频 | 国产在线精品二区 | 成人做爰69片免费观看 | 久久av一区二区三区 | 日韩女优网站 | 青青草国产在线播放 | 老女人网站 | 日韩国产区 | 开心激情五月婷婷 | 李宗瑞91在线正在播放 | 久久久久久久久免费看无码 | 久久黄色小视频 | 99国产成人精品 | 国产美女一级片 | 亚洲黄色在线 | 亚洲男人影院 | www.chengren | 国外av网站| 91精品国产综合久久精品 | 九九九在线视频 | 日韩夜夜| 综合色在线视频 | 天天干天天噜 | 色播亚洲 | 黄色一级小视频 | 美女扒开内裤让男人捅 | 欧美精品少妇 | 免费三级网站 | 久久永久免费 | 久久精品国产久精国产 | va婷婷在线免费观看 | 亚洲第一女人av | 精品久久九九 | 天天搞天天搞 | 国产精品黄色 | 国产精品国产三级国产在线观看 | 激情五月深爱五月 | 女人脱下裤子让男人捅 | 成年人黄色免费视频 | 99免费精品 | 嫩草视频在线观看 | 99热成人| av色欲无码人妻中文字幕 | 九九综合九九综合 | 天堂中文在线观看视频 | 欧美视频一区二区三区 | 无遮挡毛片 | 涩涩资源网 | 天天爽网站 | 国产精品成人va在线观看 | 欧美色性视频 | 欧美一区二区三区四 | 扩阴视频| 婷婷激情综合 | 欧美性猛交xxxx乱大交蜜桃 | 日本天堂网在线观看 | 国产欧美久久一区二区三区 | 三级视频在线 | 91看片免费版 | 日本在线天堂 | 可以免费看的av网站 | 一区二区三区视频在线 | 日本少妇xxxx软件 | 蜜臀久久99静品久久久久久 | 国产又粗又爽视频 | 黄色精品视频在线观看 | 6080av| 极品人妻一区二区三区 | 天天看夜夜看 | 国产精品成人无码专区 | 日本东京热一区二区 | 欧美激情视频在线播放 | 天天色天天插 | 久久久精品视频在线 | 特大黑人巨人吊xxxx | aaaaa级片 | 欧美色噜噜 | 亚洲福利社 | 欧美性猛交xxxx乱大交俱乐部 | 俺也去在线视频 | 在线视频精品一区 | 天天爽天天爽天天爽 | 精品一区二区三区成人免费视频 | 成年人免费观看视频网站 | 四虎黄色影院 | 在线观看黄色国产 | 精品在线视频免费观看 | 亚洲男人在线 | 乱子伦一区二区 | 国产黄色在线网站 | 999久久久国产 | 波多野结衣久久久久 | 艳妇av| 美女写真福利视频 |