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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux 进程地址空间 进程内存布局

發(fā)布時(shí)間:2025/3/15 linux 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux 进程地址空间 进程内存布局 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一 進(jìn)程空間分布概述
? ? 對于一個(gè)進(jìn)程,其空間分布如下圖所示:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?



程序段(Text):程序代碼在內(nèi)存中的映射,存放函數(shù)體的二進(jìn)制代碼。

初始化過的數(shù)據(jù)(Data):在程序運(yùn)行初已經(jīng)對變量進(jìn)行初始化的數(shù)據(jù)。

未初始化過的數(shù)據(jù)(BSS):在程序運(yùn)行初未對變量進(jìn)行初始化的數(shù)據(jù)。

棧?(Stack):存儲(chǔ)局部、臨時(shí)變量,函數(shù)調(diào)用時(shí),存儲(chǔ)函數(shù)的返回指針,用于控制函數(shù)的調(diào)用和返回。在程序塊開始時(shí)自動(dòng)分配內(nèi)存,結(jié)束時(shí)自動(dòng)釋放內(nèi)存,其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧。

堆?(Heap):存儲(chǔ)動(dòng)態(tài)內(nèi)存分配,需要程序員手工分配,手工釋放.注意它與數(shù)據(jù)結(jié)構(gòu)中的堆是兩回事,分配方式類似于鏈表。



注:1.Text, BSS, Data段在編譯時(shí)已經(jīng)決定了進(jìn)程將占用多少VM ? ? ? ? 可以通過size,知道這些信息:
? ? ? ? ? 2. 正常情況下,Linux進(jìn)程不能對用來存放程序代碼的內(nèi)存區(qū)域執(zhí)行寫操作,即程序代碼是以只讀的方式加載到內(nèi)存中,但它可以被多個(gè)進(jìn)程安全的共享。
二 ?內(nèi)核空間和用戶空間
? ?????Linux的虛擬地址空間范圍為0~4G,Linux內(nèi)核將這4G字節(jié)的空間分為兩部分,將最高的1G字節(jié)(從虛擬地址0xC0000000到0xFFFFFFFF)供內(nèi)核使用,稱為“內(nèi)核空間”。而將較低的3G字節(jié)(從虛擬地址0x00000000到0xBFFFFFFF)供各個(gè)進(jìn)程使用,稱為“用戶空間。因?yàn)槊總€(gè)進(jìn)程可以通過系統(tǒng)調(diào)用進(jìn)入內(nèi)核,因此,Linux內(nèi)核由系統(tǒng)內(nèi)的所有進(jìn)程共享。于是,從具體進(jìn)程的角度來看,每個(gè)進(jìn)程可以擁有4G字節(jié)的虛擬空間。 ? ? Linux使用兩級保護(hù)機(jī)制:0級供內(nèi)核使用,3級供用戶程序使用,每個(gè)進(jìn)程有各自的私有用戶空間(0~3G),這個(gè)空間對系統(tǒng)中的其他進(jìn)程是不可見的,最高的1GB字節(jié)虛擬內(nèi)核空間則為所有進(jìn)程以及內(nèi)核所共享。
? ? 內(nèi)核空間中存放的是內(nèi)核代碼和數(shù)據(jù),而進(jìn)程的用戶空間中存放的是用戶程序的代碼和數(shù)據(jù)。不管是內(nèi)核空間還是用戶空間,它們都處于虛擬空間中。 雖然內(nèi)核空間占據(jù)了每個(gè)虛擬空間中的最高1GB字節(jié),但映射到物理內(nèi)存卻總是從最低地址(0x00000000),另外, 使用虛擬地址可以很好的保護(hù) 內(nèi)核空間被用戶空間破壞,虛擬地址到物理地址轉(zhuǎn)換過程有操作系統(tǒng)和CPU共同完成(操作系統(tǒng)為CPU設(shè)置好頁表,CPU通過MMU單元進(jìn)行地址轉(zhuǎn)換)。
? ? ?? ? ? ? ? 多任務(wù)操作系統(tǒng)中的每一個(gè)進(jìn)程都運(yùn)行在一個(gè)屬于它自己的內(nèi)存沙盒中,這個(gè)沙盒就是虛擬地址空間(virtual address space),在32位模式下,它總是一個(gè)4GB的內(nèi)存地址塊。這些虛擬地址通過頁表(page table)映射到物理內(nèi)存,頁表由操作系統(tǒng)維護(hù)并被處理器引用。每個(gè)進(jìn)程都擁有一套屬于它自己的頁表。
? 進(jìn)程內(nèi)存空間分布如下圖所示:
? ? ? ? ? ? ? ? ? ? ? ? ? ?


????通常32位Linux內(nèi)核地址空間劃分0~3G為用戶空間,3~4G為內(nèi)核空間
? ? ?: 1.這里是32位內(nèi)核地址空間劃分,64位內(nèi)核地址空間劃分是不同的 ? ? ? ? ? 2.現(xiàn)代的操作系統(tǒng)都處于32位保護(hù)模式下。每個(gè)進(jìn)程一般都能尋址4G的物理空間。但是我們的物理內(nèi)存一般都是幾百M(fèi),進(jìn)程怎么能獲得4G?的物理空間呢?這就是使用了虛擬地址的好處,通常我們使用一種叫做虛擬內(nèi)存的技術(shù)來實(shí)現(xiàn),因?yàn)榭梢允褂糜脖P中的一部分來當(dāng)作內(nèi)存使用? ?? ? ? ? ? Linux系統(tǒng)對自身進(jìn)行了劃分,一部分核心軟件獨(dú)立于普通應(yīng)用程序,運(yùn)行在較高的特權(quán)級別上,它們駐留在被保護(hù)的內(nèi)存空間上,擁有訪問硬件設(shè)備的所有權(quán)限,Linux將此稱為內(nèi)核空間。
? ? ? ? 相對地,應(yīng)用程序則是在“用戶空間”中運(yùn)行。運(yùn)行在用戶空間的應(yīng)用程序只能看到允許它們使用的部分系統(tǒng)資源,并且不能使用某些特定的系統(tǒng)功能,也不能直接訪問內(nèi)核空間和硬件設(shè)備,以及其他一些具體的使用限制。
? ? ? ? 將用戶空間和內(nèi)核空間置于這種非對稱訪問機(jī)制下有很好的安全性,能有效抵御惡意用戶的窺探,也能防止質(zhì)量低劣的用戶程序的侵害,從而使系統(tǒng)運(yùn)行得更穩(wěn)定可靠。
? ? ? ? ? ??內(nèi)核空間在頁表中擁有較高的特權(quán)級(ring2或以下),因此只要用戶態(tài)的程序試圖訪問這些頁,就會(huì)導(dǎo)致一個(gè)頁錯(cuò)誤(page fault)。在Linux中,內(nèi)核空間是持續(xù)存在的,并且在所有進(jìn)程中都映射到同樣的物理內(nèi)存,內(nèi)核代碼和數(shù)據(jù)總是可尋址的,隨時(shí)準(zhǔn)備處理中斷和系統(tǒng)調(diào)用。與之相反,用戶模式地址空間的映射隨著進(jìn)程切換的發(fā)生而不斷的變化,如下圖所示:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? ? ??上圖中藍(lán)色區(qū)域表示映射到物理內(nèi)存的虛擬地址,而白色區(qū)域表示未映射的部分。可以看出,Firefox使用了相當(dāng)多的虛擬地址空間,因?yàn)樗加脙?nèi)存較多。


?三 ?進(jìn)程內(nèi)存布局
? ? ? ?Linux進(jìn)程標(biāo)準(zhǔn)的內(nèi)存段布局,如下圖所示,地址空間中的各個(gè)條帶對應(yīng)于不同的內(nèi)存段(memory segment),如:堆、棧之類的。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

q ????? ? ? ? ? ? 這些段只是簡單的虛擬內(nèi)存地址空間范圍,與Intel處理器的段沒有任何關(guān)系。
? ? ??幾乎每個(gè)進(jìn)程的虛擬地址空間中各段的分布都與上圖完全一致,這就給遠(yuǎn)程發(fā)掘程序漏洞的人打開了方便之門。一個(gè)發(fā)掘過程往往需要引用絕對內(nèi)存地址:棧地址,庫函數(shù)地址等。遠(yuǎn)程攻擊者必須依賴地址空間分布的一致性,來探索出這些地址。如果讓他們猜個(gè)正著,那么有人就會(huì)被整了。因此,地址空間的隨機(jī)排布方式便逐漸流行起來,Linux通過對棧、內(nèi)存映射段、堆的起始地址加上隨機(jī)的偏移量來打亂布局。但不幸的是,32位地址空間相當(dāng)緊湊,這給隨機(jī)化所留下的空間不大,削弱了這種技巧的效果。

? ? ?進(jìn)程地址空間中最頂部的段是棧,大多數(shù)編程語言將之用于存儲(chǔ)函數(shù)參數(shù)和局部變量。調(diào)用一個(gè)方法或函數(shù)會(huì)將一個(gè)新的棧幀(stack frame)壓入到棧中,這個(gè)棧幀會(huì)在函數(shù)返回時(shí)被清理掉。由于棧中數(shù)據(jù)嚴(yán)格的遵守FIFO的順序,這個(gè)簡單的設(shè)計(jì)意味著不必使用復(fù)雜的數(shù)據(jù)結(jié)構(gòu)來追蹤棧中的內(nèi)容,只需要一個(gè)簡單的指針指向棧的頂端即可,因此壓棧(pushing)和退棧(popping)過程非常迅速、準(zhǔn)確。進(jìn)程中的每一個(gè)線程都有屬于自己的棧。

? ? ? 通過不斷向棧中壓入數(shù)據(jù),超出其容量就會(huì)耗盡棧所對應(yīng)的內(nèi)存區(qū)域,這將觸發(fā)一個(gè)頁故障(page fault),而被Linux的expand_stack()處理,它會(huì)調(diào)用acct_stack_growth()來檢查是否還有合適的地方用于棧的增長。如果棧的大小低于RLIMIT_STACK(通常為8MB),那么一般情況下棧會(huì)被加長,程序繼續(xù)執(zhí)行,感覺不到發(fā)生了什么事情。這是一種將棧擴(kuò)展到所需大小的常規(guī)機(jī)制。然而,如果達(dá)到了最大棧空間的大小,就會(huì)棧溢出(stack overflow),程序收到一個(gè)段錯(cuò)誤(segmentation fault)


? ? ?:動(dòng)態(tài)棧增長是唯一一種訪問未映射內(nèi)存區(qū)域而被允許的情形,其他任何對未映射內(nèi)存區(qū)域的訪問都會(huì)觸發(fā)頁錯(cuò)誤,從而導(dǎo)致段錯(cuò)誤。一些被映射的區(qū)域是只讀的,因此企圖寫這些區(qū)域也會(huì)導(dǎo)致段錯(cuò)誤
內(nèi)存映射段? ? ? ? ? ?在棧的下方是內(nèi)存映射段內(nèi)核將文件的內(nèi)容直接映射到內(nèi)存。任何應(yīng)用程序都可以通過Linux的mmap()系統(tǒng)調(diào)用或者Windows的CreateFileMapping()/MapViewOfFile()請求這種映射。內(nèi)存映射是一種方便高效的文件I/O方式,所以它被用來加載動(dòng)態(tài)庫。創(chuàng)建一個(gè)不對應(yīng)于任何文件的匿名內(nèi)存映射也是可能的,此方法用于存放程序的數(shù)據(jù)。在Linux中,如果你通過malloc()請求一大塊內(nèi)存,C運(yùn)行庫將會(huì)創(chuàng)建這樣一個(gè)匿名映射而不是使用堆內(nèi)存。“大塊”意味著比MMAP_THRESHOLD還大,缺省128KB,可以通過mallocp()調(diào)整。
? ? ? 與棧一樣,堆用于運(yùn)行時(shí)內(nèi)存分配;但不同的是,堆用于存儲(chǔ)那些生存期與函數(shù)調(diào)用無關(guān)的數(shù)據(jù)。大部分語言都提供了堆管理功能。在C語言中,堆分配的接口是malloc()函數(shù)。如果堆中有足夠的空間來滿足內(nèi)存請求,它就可以被語言運(yùn)行時(shí)庫處理而不需要內(nèi)核參與,否則,堆會(huì)被擴(kuò)大,通過brk()系統(tǒng)調(diào)用來分配請求所需的內(nèi)存塊。堆管理是很復(fù)雜的,需要精細(xì)的算法來應(yīng)付我們程序中雜亂的分配模式,優(yōu)化速度和內(nèi)存使用效率。處理一個(gè)堆請求所需的時(shí)間會(huì)大幅度的變動(dòng)。實(shí)時(shí)系統(tǒng)通過特殊目的分配器來解決這個(gè)問題。堆在分配過程中可能會(huì)變得零零碎碎,如下圖所示: ? ? ? ? ? ? ? ? ? ? ? ? ??


? ? ???一般由程序員分配釋放,?若程序員不釋放,程序結(jié)束時(shí)可能由OS回收?。注意它與數(shù)據(jù)結(jié)構(gòu)中的堆是兩回事,分配方式類似于鏈表。 ? ? ? ? ?
BBS和數(shù)據(jù)段 ? ? ? 在C語言中,BSS和數(shù)據(jù)段保存的都是靜態(tài)(全局)變量的內(nèi)容。區(qū)別在于BSS保存的是未被初始化的靜態(tài)變量內(nèi)容,他們的值不是直接在程序的源碼中設(shè)定的。BSS內(nèi)存區(qū)域是匿名的,它不映射到任何文件。如果你寫static intcntActiveUsers,則cntActiveUsers的內(nèi)容就會(huì)保存到BSS中去。 ? ? ??數(shù)據(jù)段保存在源代碼中已經(jīng)初始化的靜態(tài)變量的內(nèi)容。數(shù)據(jù)段不是匿名的,它映射了一部分的程序二進(jìn)制鏡像,也就是源代碼中指定了初始值的靜態(tài)變量。所以,如果你寫static int cntActiveUsers=10,則cntActiveUsers的內(nèi)容就保存在了數(shù)據(jù)段中,而且初始值是10。盡管數(shù)據(jù)段映射了一個(gè)文件,但它是一個(gè)私有內(nèi)存映射,這意味著更改此處的內(nèi)存不會(huì)影響被映射的文件。

? ? ? 你可以通過閱讀文件/proc/pid_of_process/maps來檢驗(yàn)一個(gè)linux進(jìn)程中的內(nèi)存區(qū)域。記住:一個(gè)段可能包含許多區(qū)域。比如,每個(gè)內(nèi)存映射文件在mmap段中都有屬于自己的區(qū)域,動(dòng)態(tài)庫擁有類似BSS和數(shù)據(jù)段的額外區(qū)域。有時(shí)人們提到“數(shù)據(jù)段”,指的是全部的數(shù)據(jù)段+BSS+堆。

? ? ?你還可以通過nm和objdump命令來察看二進(jìn)制鏡像,打印其中的符號,它們的地址,段等信息。最后需要指出的是,前文描述的虛擬地址布局在linux中是一種“靈活布局”,而且作為默認(rèn)方式已經(jīng)有些年頭了,它假設(shè)我們有值RLIMT_STACK。但是,當(dāng)沒有該值得限制時(shí),Linux退回到“經(jīng)典布局”,如下圖所示:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?


C語言程序?qū)嵗治鋈缦滤?#xff1a;


[cpp] view plaincopy print?
  • ?#include<stdio.h>????
  • ?#include?<malloc.h>????
  • ?????
  • ?void?print(char?*,int);????
  • ?int?main()????
  • {????
  • ??????char?*s1?=?"abcde";??//"abcde"作為字符串常量存儲(chǔ)在常量區(qū)?s1、s2、s5擁有相同的地址??
  • ??????char?*s2?=?"abcde";????
  • ??????char?s3[]?=?"abcd";????
  • ??????long?int?*s4[100];????
  • ??????char?*s5?=?"abcde";????
  • ??????int?a?=?5;????
  • ??????int?b?=6;//a,b在棧上,&a>&b地址反向增長????
  • ?????
  • ?????printf("variables?address?in?main?function:?s1=%p??s2=%p?s3=%p?s4=%p?s5=%p?a=%p?b=%p?\n",?????
  • ?????????????s1,s2,s3,s4,s5,&a,&b);???
  • ?????printf("variables?address?in?processcall:n");????
  • ????????print("ddddddddd",5);//參數(shù)入棧從右至左進(jìn)行,p先進(jìn)棧,str后進(jìn)?&p>&str????
  • ?????printf("main=%p?print=%p?\n",main,print);????
  • ?????//打印代碼段中主函數(shù)和子函數(shù)的地址,編譯時(shí)先編譯的地址低,后編譯的地址高main<print????
  • ?}????
  • ??
  • ?void?print(char?*str,int?p)????
  • {????
  • ?????char?*s1?=?"abcde";??//abcde在常量區(qū),s1在棧上????
  • ?????char?*s2?=?"abcde";??//abcde在常量區(qū),s2在棧上?s2-s1=6可能等于0,編譯器優(yōu)化了相同的常量,只在內(nèi)存保存一份????
  • ?????//而&s1>&s2????
  • ?????char?s3[]?=?"abcdeee";//abcdeee在常量區(qū),s3在棧上,數(shù)組保存的內(nèi)容為abcdeee的一份拷貝????
  • ????long?int?*s4[100];????
  • ?????char?*s5?=?"abcde";????
  • ?????int?a?=?5;????
  • ?????int?b?=6;????
  • ?????int?c;????
  • ?????int?d;???????????//a,b,c,d均在棧上,&a>&b>&c>&d地址反向增長????
  • ????char?*q=str;???
  • ????int?m=p;???????????
  • ????char?*r=(char?*)malloc(1);????
  • ????char?*w=(char?*)malloc(1)?;??//?r<w?堆正向增長????
  • ????
  • ????printf("s1=%p?s2=%p?s3=%p?s4=%p?s5=%p?a=%p?b=%p?c=%p?d=%p?str=%p?q=%p?p=%p?m=%p?r=%p?w=%p?\n",????
  • ????????????s1,s2,s3,s4,s5,&a,&b,&c,&d,&str,q,&p,&m,r,w);???
  • ????/*?棧和堆是在程序運(yùn)行時(shí)候動(dòng)態(tài)分配的,局部變量均在棧上分配。?
  • ????????棧是反向增長的,地址遞減;malloc等分配的內(nèi)存空間在堆空間。堆是正向增長的,地址遞增。???
  • ????????r,w變量在棧上(則&r>&w),r,w所指內(nèi)容在堆中(即r<w)。*/???
  • ?}????
  • ???
  • #include<stdio.h> #include <malloc.h> void print(char *,int); int main() { char *s1 = "abcde"; //"abcde"作為字符串常量存儲(chǔ)在常量區(qū) s1、s2、s5擁有相同的地址char *s2 = "abcde"; char s3[] = "abcd"; long int *s4[100]; char *s5 = "abcde"; int a = 5; int b =6;//a,b在棧上,&a>&b地址反向增長 printf("variables address in main function: s1=%p s2=%p s3=%p s4=%p s5=%p a=%p b=%p \n", s1,s2,s3,s4,s5,&a,&b); printf("variables address in processcall:n"); print("ddddddddd",5);//參數(shù)入棧從右至左進(jìn)行,p先進(jìn)棧,str后進(jìn) &p>&str printf("main=%p print=%p \n",main,print); //打印代碼段中主函數(shù)和子函數(shù)的地址,編譯時(shí)先編譯的地址低,后編譯的地址高main<print } void print(char *str,int p) { char *s1 = "abcde"; //abcde在常量區(qū),s1在棧上 char *s2 = "abcde"; //abcde在常量區(qū),s2在棧上 s2-s1=6可能等于0,編譯器優(yōu)化了相同的常量,只在內(nèi)存保存一份 //而&s1>&s2 char s3[] = "abcdeee";//abcdeee在常量區(qū),s3在棧上,數(shù)組保存的內(nèi)容為abcdeee的一份拷貝 long int *s4[100]; char *s5 = "abcde"; int a = 5; int b =6; int c; int d; //a,b,c,d均在棧上,&a>&b>&c>&d地址反向增長 char *q=str; int m=p; char *r=(char *)malloc(1); char *w=(char *)malloc(1) ; // r<w 堆正向增長 printf("s1=%p s2=%p s3=%p s4=%p s5=%p a=%p b=%p c=%p d=%p str=%p q=%p p=%p m=%p r=%p w=%p \n", s1,s2,s3,s4,s5,&a,&b,&c,&d,&str,q,&p,&m,r,w); /* 棧和堆是在程序運(yùn)行時(shí)候動(dòng)態(tài)分配的,局部變量均在棧上分配。棧是反向增長的,地址遞減;malloc等分配的內(nèi)存空間在堆空間。堆是正向增長的,地址遞增。 r,w變量在棧上(則&r>&w),r,w所指內(nèi)容在堆中(即r<w)。*/ } 附錄:
    棧與堆的區(qū)別 新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎(jiǎng)!定制產(chǎn)品紅包拿不停!

    總結(jié)

    以上是生活随笔為你收集整理的Linux 进程地址空间 进程内存布局的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 草草影院1| 免费欧美一级视频 | 女女av在线 | 特级丰满少妇一级aaa爱毛片 | 一区在线免费 | 秋霞国产精品 | 午夜激情在线视频 | 伊人一二三| 中文永久免费观看 | 51福利视频 | 欧美日韩 一区二区三区 | 岳睡了我中文字幕日本 | 蜜桃视频久久一区免费观看入口 | 色婷婷av777| 中文字幕三级电影 | 精品国产鲁一鲁一区二区三区 | 好吊色欧美一区二区三区视频 | 黄片毛片视频 | 国产免费一区二区三区在线播放 | 国产小视频免费观看 | 蜜桃成熟时李丽珍在线观看 | 中日一级片 | 亚洲一区在线免费观看 | 男女日屁视频 | 黄色精品视频在线观看 | 亚洲无码一区二区三区 | 黄瓜污视频 | 老司机深夜福利网站 | 男ji大巴进入女人的视频 | 三级无遮挡 | 男男做的视频 | 国内精久久久久久久久久人 | 能看av的网址 | 日干夜操| 一区二区三区国产精品视频 | 狠狠人妻久久久久久 | 欧美性视频在线 | 国产精品jizz视频 | 黄色一级一片免费播放 | 大乳女喂男人吃奶视频 | 国产精品国产三级国产三级人妇 | 国产精品12p| 特级黄毛片 | 伊人久久成人网 | 性色av一区二区三区四区 | 亚洲激情在线观看视频 | 激情青青草 | 亚洲无人区码一码二码三码 | 福利视频99| 亚洲aaaa级特黄毛片 | 日韩在线观看免费高清 | 俺去操 | 上原亚衣在线 | 天天操欧美 | 朱竹清到爽高潮痉挛 | 一区二区三区在线免费观看视频 | 国产精品一区二区在线观看 | 在线欧美视频 | 女人床技48动态图 | 欧美不卡一区二区三区 | 欧美综合视频在线观看 | 98超碰在线 | 日韩一区二区免费在线观看 | 我们俩电影网mp4动漫官网 | 欧美日韩女优 | 久久青青操 | 日韩欧美黄 | 国产精品4 | 欧美mv日韩mv国产网站 | 福利在线免费 | 青少年xxxxx性开放hg | 性高潮久久久久久 | 欧类av怡春院| 亚洲成在人 | 日韩av一区二区三区在线 | 日本黄色录象 | 精品久久久久久久无码 | 非洲黑人狂躁日本妞 | 国产成人+综合亚洲+天堂 | 少妇又色又紧又爽又刺激视频 | 夜色视频网站 | 亚洲αv | 色婷婷av一区二区三区软件 | 理论片久久 | 国产aⅴ精品一区二区果冻 台湾性生生活1 | 成人在线视频播放 | 国产一区二区视频网站 | 日本一区二区三区久久 | 色av影院| 嫩草视频在线观看免费 | 在线免费看av网站 | 饥渴少妇色诱水电工 | 91免费观看网站 | 国产精品无码一区二区桃花视频 | 脱女学生小内内摸了高潮 | 精品视频无码一区二区三区 | 亚洲一区二区黄 | 夫妻自拍偷拍 | 综合色视频 |