3atv精品不卡视频,97人人超碰国产精品最新,中文字幕av一区二区三区人妻少妇,久久久精品波多野结衣,日韩一区二区三区精品

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux驱动程序设计21 Linux设备驱动的调试

發布時間:2023/12/8 linux 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux驱动程序设计21 Linux设备驱动的调试 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本章導讀
“工欲善其事,必先利其器”,為了方便進行Linux設備驅動的開發和調試,建立良好的開發環境很重
要,還要使用必要的工具軟件以及掌握常用的調試技巧等。
21.1節講解了Linux下調試器GDB的基本用法和技巧。
21.2節講解了Linux內核的調試方法。
21.3~21.10節對21.3節的概述展開了講解,內容有:Linux內核調試用的printk()、BUG_ON()、
WARN_ON()、/proc、Oops、strace、KGDB,以及使用仿真器進行調試的方法。
21.11節講解了Linux應用程序的調試方法,驅動工程師往往需要編寫用戶空間的應用程序以對自身編
寫的驅動進行驗證和測試,因此,掌握應用程序調試方法對驅動工程師而言也是必需的。
21.12節講解了Linux常用的一些穩定性、性能分析和調優工具。
21.1 GDB調試器的用法
21.1.1 GDB的基本用法
GDB是GNU開源組織發布的一個強大的UNIX下的程序調試工具,GDB主要可幫助工程師完成下面4
個方面的功能。
·啟動程序,可以按照工程師自定義的要求運行程序。
·讓被調試的程序在工程師指定的斷點處停住,斷點可以是條件表達式。
·當程序被停住時,可以檢查此時程序中所發生的事,并追蹤上文。
·動態地改變程序的執行環境。
不管是調試Linux內核空間的驅動還是調試用戶空間的應用程序,都必須掌握GDB的用法。而且,在
調試內核和調試應用程序時使用的GDB命令是完全相同的,下面以代碼清單21.1的應用程序為例演示
GDB調試器的用法。
代碼清單21.1 GDB調試器用法的演示程序
1int add(int a, int b)
2{
3 return a + b;
4}
5
6main()
7{
8 int sum[10] =
9 {
10 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
11 };
12 int i;
13
14 int array1[10] =
15 {
16 48, 56, 77, 33, 33, 11, 226, 544, 78, 90
17 };
18 int array2[10] =
19 {
20 85, 99, 66, 0x199, 393, 11, 1, 2, 3, 4
21 };
22
23 for (i = 0; i < 10; i++)
24 {
25 sum[i] = add(array1[i], array2[i]);
26 }
27}
使用命令gcc–g gdb_example.c–o gdb_example編譯上述程序,得到包含調試信息的二進制文件
example,執行gdb gdb_example命令進入調試狀態,如下所示:
$ gdb gdb_example
GNU gdb (Ubuntu 7.7-0ubuntu3.1) 7.7
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word".
(gdb)
1.list命令
在GDB中運行list命令(縮寫l)可以列出代碼,list的具體形式如下。
·list<linenum>,顯示程序第linenum行周圍的源程序,如下所示:
(gdb) list 15
10
11 int array1[10] =
12 {
13 48, 56, 77, 33, 33, 11, 226, 544, 78, 90
14 };
15 int array2[10] =
16 {
17 85, 99, 66, 0x199, 393, 11, 1, 2, 3, 4
18 };
19
·list<function>,顯示函數名為function的函數的源程序,如下所示:
(gdb) list main
2 {
3 return a + b;
4 }
56
main()
7 {
8 int sum[10];
9 int i;
10
11 int array1[10] =
·list,顯示當前行后面的源程序。
·list-,顯示當前行前面的源程序。
下面演示了使用GDB中的run(縮寫為r)、break(縮寫為b)、next(縮寫為n)命令控制程序的運
行,并使用print(縮寫為p)命令打印程序中的變量sum的過程:
(gdb) break add
Breakpoint 1 at 0x80482f7: file gdb_example.c, line 3.
(gdb) run
Starting program: /driver_study/gdb_example
Breakpoint 1, add (a=48, b=85) at gdb_example.c:3
warning: Source file is more recent than executable.
3 return a + b;
(gdb) next
4 }
(gdb) next
main () at gdb_example.c:23
23 for (i = 0; i < 10; i++)
(gdb) next
25 sum[i] = add(array1[i], array2[i]);
(gdb) print sum
$1 = {133, 0, 0, 0, 0, 0, 0, 0, 0, 0}
2.run命令
在GDB中,運行程序使用run命令。在程序運行前,我們可以設置如下4方面的工作環境。
(1)程序運行參數
用set args可指定運行時參數,如set args 10 20 30 40 50;用show args命令可以查看設置好的運行參
數。
(2)運行環境
用path<dir>可設定程序的運行路徑;用how paths可查看程序的運行路徑;用set environment
varname[=value]可設置環境變量,如set env USER=baohua;用show environment[varname]則可查看環境變
量。
(3)工作目錄
cd<dir>相當于shell的cd命令,pwd可顯示當前所在的目錄。
(4)程序的輸入輸出
info terminal用于顯示程序用到的終端的模式;在GDB中也可以使用重定向控制程序輸出,如
run>outfile;用tty命令可以指定輸入輸出的終端設備,如tty/dev/ttyS1。
3.break命令
在GDB中用break命令來設置斷點,設置斷點的方法如下。
(1)break<function>
在進入指定函數時停住,在C++中可以使用class::function或function(type,type)格式來指定函數
名。
(2)break<linenum>
在指定行號停住。
(3)break+offset/break-offset。
在當前行號的前面或后面的offset行停住,offiset為自然數。
(4)break filename:linenum
在源文件filename的linenum行處停住。
(5)break filename:function
在源文件filename的function函數的入口處停住。
(6)break*address
在程序運行的內存地址處停住。
(7)break
break命令沒有參數時,表示在下一條指令處停住。
(8)break…if<condition>
…可以是上述的break<linenum>、break+offset/break–offset中的參數,condition表示條件,在條件成立
時停住。比如在循環體中,可以設置break if i=100,表示當i為100時停住程序。
查看斷點時,可使用info命令,如info breakpoints[n]、info break[n](n表示斷點號)。
4.單步命令
在調試過程中,next命令用于單步執行,類似于VC++中的step over。next的單步不會進入函數的內
部,與next對應的step(縮寫為s)命令則在單步執行一個函數時,進入其內部,類似于VC++中的step
into。下面演示了step命令的執行情況,在第23行的add()函數調用處執行step會進入其內部的return
a+b;語句:
(gdb) break 25
Breakpoint 1 at 0x8048362: file gdb_example.c, line 25.
(gdb) run
Starting program: /driver_study/gdb_example
Breakpoint 1, main () at gdb_example.c:25
25 sum[i] = add(array1[i], array2[i]);
(gdb) step
add (a=48, b=85) at gdb_example.c:3
3 return a + b;
單步執行的更復雜用法如下。
(1)step<count>
單步跟蹤,如果有函數調用,則進入該函數(進入函數的前提是,此函數被編譯有debug信息)。step
后面不加count表示一條條地執行,加count表示執行后面的count條指令,然后再停住。
(2)next<count>
單步跟蹤,如果有函數調用,它不會進入該函數。同理,next后面不加count表示一條條地執行,加
count表示執行后面的count條指令,然后再停住。
(3)set step-mode
set step-mode on用于打開step-mode模式,這樣,在進行單步跟蹤(運行step指令)時,若跨越某沒有
調試信息的函數,程序的執行則會在該函數的第一條指令處停住,而不會跳過整個函數。這樣我們可以查
看該函數的機器指令。
(4)finish
運行程序,直到當前函數完成返回,并打印函數返回時的堆棧地址、返回值及參數值等信息。
(5)until(縮寫為u)
一直在循環體內執行單步而退不出來是一件令人煩惱的事情,用until命令可以運行程序直到退出循環
體。
(6)stepi(縮寫為si)和nexti(縮寫為ni)
stepi和nexti用于單步跟蹤一條機器指令。比如,一條C程序代碼有可能由數條機器指令完成,stepi和
nexti可以單步執行機器指令,相反,step和next是C語言級別的命令。
另外,運行display/i$pc命令后,單步跟蹤會在打出程序代碼的同時打出機器指令,即匯編代碼。
5.continue命令
當程序被停住后,可以使用continue命令(縮寫為c,fg命令同continue命令)恢復程序的運行直到程序
結束,或到達下一個斷點,命令格式為:
continue [ignore-count]
c [ignore-count]
fg [ignore-count]
ignore-count表示忽略其后多少次斷點。
假設我們設置了函數斷點add(),并觀察i,則在continue過程中,每次遇到add()函數或i發生變
化,程序就會停住,如下所示:
(gdb) continue
Continuing.
Hardware watchpoint 3: i
Old value = 2
New value = 3
0x0804838d in main () at gdb_example.c:23
23 for (i = 0; i < 10; i++)
(gdb) continue
Continuing.
Breakpoint 1, main () at gdb_example.c:25
25 sum[i] = add(array1[i], array2[i]);
(gdb) continue
Continuing.
Hardware watchpoint 3: i
Old value = 3
New value = 4
0x0804838d in main () at gdb_example.c:23
23 for (i = 0; i < 10; i++)
6.print命令
在調試程序時,當程序被停住時,可以使用print命令(縮寫為p),或是同義命令inspect來查看當前
程序的運行數據。print命令的格式如下:
print <expr>
print /<f> <expr>
<expr>是表達式,也是被調試的程序中的表達式,<f>是輸出的格式,比如,如果要把表達式按十六
進制的格式輸出,那么就是/x。在表達式中,有幾種GDB所支持的操作符,它們可以用在任何一種語言
中,@是一個和數組有關的操作符,::指定一個在文件或是函數中的變量,{<type>}<addr>表示一個指
向內存地址<addr>的類型為type的對象。
下面演示了查看sum[]數組的值的過程:
(gdb) print sum
$2 = {133, 155, 0, 0, 0, 0, 0, 0, 0, 0}
(gdb) next
Breakpoint 1, main () at gdb_example.c:25
25 sum[i] = add(array1[i], array2[i]);
(gdb) next
23 for (i = 0; i < 10; i++)
(gdb) print sum
$3 = {133, 155, 143, 0, 0, 0, 0, 0, 0, 0}
當需要查看一段連續內存空間的值時,可以使用GDB的@操作符,@的左邊是第一個內存地址,@的
右邊則是想查看內存的長度。例如如下動態申請的內存:
int *array = (int *) malloc (len * sizeof (int));
在GDB調試過程中這樣顯示這個動態數組的值:
p *array@len
print的輸出格式如下。
·x:按十六進制格式顯示變量。
·d:按十進制格式顯示變量。
·u:按十六進制格式顯示無符號整型。
·o:按八進制格式顯示變量。
·t:按二進制格式顯示變量。
·a:按十六進制格式顯示變量。
·c:按字符格式顯示變量。
·f:按浮點數格式顯示變量。
我們可用display命令設置一些自動顯示的變量,當程序停住時,或是單步跟蹤時,這些變量會自動顯
示。
如果要修改變量,如x的值,可使用如下命令:
print x=4
當用GDB的print查看程序運行時數據時,每一個print都會被GDB記錄下來。GDB會以$1,$2,$3…
這樣的方式為每一個print命令編號。我們可以使用這個編號訪問以前的表達式,如$1。
7.watch命令
watch一般用來觀察某個表達式(變量也是一種表達式)的值是否有了變化,如果有變化,馬上停止
程序運行。我們有如下幾種方法來設置觀察點。
watch<expr>:為表達式(變量)expr設置一個觀察點。一旦表達式值有變化時,馬上停止程序運行。
rwatch<expr>:當表達式(變量)expr被讀時,停止程序運行。
awatch<expr>:當表達式(變量)的值被讀或被寫時,停止程序運行。
info watchpoints:列出當前所設置的所有觀察點。
下面演示了觀察i并在連續運行next時一旦發現i變化,i值就會顯示出來的過程:
(gdb) watch i
Hardware watchpoint 3: i
(gdb) next
23 for (i = 0; i < 10; i++)
(gdb) next
Hardware watchpoint 3: i
Old value = 0
New value = 1
0x0804838d in main () at gdb_example.c:23
23 for (i = 0; i < 10; i++)
(gdb) next
Breakpoint 1, main () at gdb_example.c:25
25 sum[i] = add(array1[i], array2[i]);
(gdb) next
23 for (i = 0; i < 10; i++)
(gdb) next
Hardware watchpoint 3: i
Old value = 1
New value = 2
0x0804838d in main () at gdb_example.c:23
23 for (i = 0; i < 10; i++)
8.examine命令
我們可以使用examine命令(縮寫為x)來查看內存地址中的值。examine命令的語法如下所示:
x/<n/f/u> <addr>
<addr>表示一個內存地址。“x/”后的n、f、u都是可選的參數,n是一個正整數,表示顯示內存的長
度,也就是說從當前地址向后顯示幾個地址的內容;f表示顯示的格式,如果地址所指的是字符串,那么
格式可以是s,如果地址是指令地址,那么格式可以是i;u表示從當前地址往后請求的字節數,如果不指
定的話,GDB默認的是4字節。u參數可以被一些字符代替:b表示單字節,h表示雙字節,w表示四字節,
g表示八字節。當我們指定了字節長度后,GDB會從指定的內存地址開始,讀寫指定字節,并把其當作一
個值取出來。n、f、u這3個參數可以一起使用,例如命令x/3uh 0x54320表示從內存地址0x54320開始以雙
字節為1個單位(h)、16進制方式(u)顯示3個單位(3)的內存。
9.set命令
examine命令用于查看內存,而set命令用于修改內存。它的命令格式是“set*有類型的指針=value”。
比如,下列程序,在用gdb運行起來后,通過Ctrl+C停住。
main()
{
void *p = malloc(16);
while(1);
}
我們可以在運行中用如下命令來修改p指向的內存。
(gdb) set *(unsigned char *)p='h'
(gdb) set *(unsigned char *)(p+1)='e'
(gdb) set *(unsigned char *)(p+2)='l'
(gdb) set *(unsigned char *)(p+3)='l'
(gdb) set *(unsigned char *)(p+4)='o'
看看結果:
(gdb) x/s p
0x804b008: "hello"
也可以直接使用地址常數:
(gdb) p p
$2 = (void *) 0x804b008
(gdb) set *(unsigned char *)0x804b008='w'
(gdb) set *(unsigned char *)0x804b009='o'
(gdb) set *(unsigned char *)0x804b00a='r'
(gdb) set *(unsigned char *)0x804b00b='l'
(gdb) set *(unsigned char *)0x804b00c='d'
(gdb) x/s 0x804b008
0x804b008: "world"
10.jump命令
一般來說,被調試程序會按照程序代碼的運行順序依次執行,但是GDB也提供了亂序執行的功能,
也就是說,GDB可以修改程序的執行順序,從而讓程序隨意跳躍。這個功能可以由GDB的jump命令
jump<linespec>來指定下一條語句的運行點。<linespec>可以是文件的行號,可以是file:line格式,也可以
是+num這種偏移量格式,表示下一條運行語句從哪里開始。
jump <address>
這里的<address>是代碼行的內存地址。
注意:jump命令不會改變當前程序棧中的內容,如果使用jump從一個函數跳轉到另一個函數,當跳
轉到的函數運行完返回,進行出棧操作時必然會發生錯誤,這可能會導致意想不到的結果,因此最好只用
jump在同一個函數中進行跳轉。
11.signal命令
使用singal命令,可以產生一個信號量給被調試的程序,如中斷信號Ctrl+C。于是,可以在程序運行
的任意位置處設置斷點,并在該斷點處用GDB產生一個信號量,這種精確地在某處產生信號的方法非常
有利于程序的調試。
signal命令的語法是signal<signal>,UNIX的系統信號量通常為1~15,因此<signal>的取值也在這個范
圍內。
12.return命令
如果在函數中設置了調試斷點,在斷點后還有語句沒有執行完,這時候我們可以使用return命令強制
函數忽略還沒有執行的語句并返回。
return
return <expression>
上述return命令用于取消當前函數的執行,并立即返回,如果指定了<expression>,那么該表達式的值
會被作為函數的返回值。
13.call命令
call命令用于強制調用某函數:
call <expr>
表達式可以是函數,以此達到強制調用函數的目的,它會顯示函數的返回值(如果函數返回值不是
void)。比如在下列程序執行while(1)的時候:
main()
{
void *p = malloc(16);
while(1);
}
我們強制要求其執行strcpy()和printf():
(gdb) call strcpy(p, "hello world")
$3 = 134524936
(gdb) call printf("%s\n", p)
hello world
$4 = 12
14.info命令
info命令可以用來在調試時查看寄存器、斷點、觀察點和信號等信息。要查看寄存器的值,可以使用
如下命令:
info registers (查看除了浮點寄存器以外的寄存器)
info all-registers (查看所有寄存器,包括浮點寄存器)
info registers <regname ...> (查看所指定的寄存器)
要查看斷點信息,可以使用如下命令:
info break要列出當前所設置的所有觀察點,可使用如下命令:
info watchpoints
要查看有哪些信號正在被GDB檢測,可使用如下命令:
info signals
info handle
也可以使用info line命令來查看源代碼在內存中的地址。info line后面可以跟行號、函數名、文件名:行
號、文件名:函數名等多種形式,例如用下面的命令會打印出所指定的源碼在運行時的內存地址:
info line tst.c:func
15.disassemble
disassemble命令用于反匯編,可用它來查看當前執行時的源代碼的機器碼,實際上只是把目前內存中
的指令沖刷出來。下面的示例用于查看函數func的匯編代碼:
(gdb) disassemble func
Dump of assembler code for function func:
0x8048450 <func>: push %ebp
0x8048451 <func+1>: mov %esp,%ebp
0x8048453 <func+3>: sub $0x18,%esp
0x8048456 <func+6>: movl $0x0,0xfffffffc(%ebp)
...
End of assembler dump.
21.1.2 DDD圖形界面調試工具
GDB本身是一種命令行調試工具,但是通過DDD(Data Display Debugger,見
http://www.gnu.org/software/ddd/)可以被圖形界面化。DDD可以作為GDB、DBX、WDB、Ladebug、
JDB、XDB、Perl Debugger或Python Debugger的可視化圖形前端,其特有的圖形數據顯示功能(Graphical
Data Display)可以把數據結構按照圖形的方式顯示出來。
DDD最初源于1990年Andreas Zeller編寫的VSL結構化語言,后來經過一些程序員的努力,演化成今天
的模樣。DDD的功能非常強大,可以調試用C/C++、Ada、Fortran、Pascal、Modula-2和Modula-3編寫的程
序;能以超文本方式瀏覽源代碼;能夠進行斷點設置、回溯調試和歷史記錄;具有程序在終端運行的仿真
窗口,具備在遠程主機上進行調試的能力;能夠顯示各種數據結構之間的關系,并將數據結構以圖形形式
顯示;具有GDB/DBX/XDB的命令行界面,包括完整的文本編輯、歷史紀錄、搜尋引擎等。
DDD的主界面如圖21.1所示,它和Visual Studio等集成開發環境非常相近,而且DDD包含了Visual
Studio所不包含的部分功能。
圖21.1 DDD的主界面
在設計DDD的時候,設計人員決定把它與GDB之間的耦合度盡量降低。因為像GDB這樣的開源軟
件,更新的速度比商業軟件快,所以為了使GDB的變化不會影響到DDD,在DDD中,GDB是作為獨立的
進程運行的,通過命令行接口與DDD進行交互。
圖21.2顯示了用戶、DDD、GDB和被調試進程之間的關系,DDD和GDB之間的所有通信都是異步進
行的。在DDD中發出的GDB命令都會與一個回調函數相連,放入命令隊列中。這個回調函數在合適的時
間會處理GDB的輸出。例如,如果用戶手動輸入一條GDB的命令,DDD就會把這條命令與顯示GDB輸出
的一個回調函數連起來。一旦GDB命令完成,就會觸發回調函數,GDB的輸出就會顯示在DDD的命令窗
口中。
圖21.2 DDD運行機理
DDD在事件循環時等待用戶輸入和GDB輸出,同時等著GDB進入等待輸入狀態。當GDB可用時,下
一條命令就會從命令隊列中取出,送給GDB。GDB到達的輸出由上次命令的回調函數過程來處理。這種
異步機制避免了DDD在等待GDB輸出時發生阻塞現象,到達的事件可以在任何時間得到處理。
不可否認的是,DDD和GDB的分離使得DDD的運行速度相對來說比較慢,但是這種方法帶來了靈活
性和兼容性的好處。例如,用戶可以把GDB調試器換成其他調試器,如DBX等。另外,GDB和DDD的分
離使得用戶可以在不同的機器上分別運行GDB和DDD。
在DDD中,可以直接在底部的控制臺中輸入GDB命令,也可以通過菜單和鼠標以圖形方式觸發GDB
命令的運行,使用方法甚為簡單,因此這里不再贅述。
DDD不僅可用于調試PC上的應用程序,也可調試目標板子,方法是用如下命令啟動DDD(通過-
debugger選項指定一個針對ARM的GDB):
ddd --debugger arm-linux-gnueabihf-gdb <要調試的程序>
除了DDD以外,在Linux環境下,也可以使用廣受歡迎的Eclipse來編寫代碼并進行調試。安裝Eclipse
IDE for C/C++Developer后,在Eclipse中,可以設置Using GDB(DSF)Manual Remote Debugging Launcher
以及ARM的GDB等,如圖21.3所示。
圖21.3 在Eclipse中設置Remote調試模式和GDB
21.2 Linux內核調試
在嵌入式系統中,由于目標機資源有限,因此往往在主機上先編譯好程序,再在目標機上運行。用戶
所有的開發工作都在主機開發環境下完成,包括編碼、編譯、連接、下載和調試等。目標機和主機通過串
口、以太網、仿真器或其他通信手段通信,主機用這些接口控制目標機,調試目標機上的程序。
調試嵌入式Linux內核的方法如下。
1)目標機“插樁”,如打上KGDB補丁,這樣主機上的GDB可與目標機的KGDB通過串口或網口通
信。
2)使用仿真器,仿真器可直接連接目標機的JTAG/BDM,這樣主機的GDB就可以通過與仿真器的通
信來控制目標機。
3)在目標板上通過printk()、Oops、strace等軟件方法進行“觀察”調試,這些方法不具備查看和修
改數據結構、斷點、單步等功能。
21.4~21.7節將對這些調試方法進行一一講解。
不管是目標機“插樁”還是使用仿真器連接目標機JTAG/SWD/BDM,在主機上,調試工具一般都采用
GDB。
GDB可以直接把Linux內核當成一個整體來調試,這個過程實際上可以被QEMU模擬出來。進入本書
配套Ubuntu的/home/baohua/develop/linux/extra目錄下,修改run-nolcd.sh的腳本,將其從
qemu-system-arm -nographic -sd vexpress.img -M vexpress-a9 -m 512M -kernel
zImage -dtb vexpress-v2p-ca9.dtb -smp 4 -append "init=/linuxrc root=/dev/
mmcblk0p1 rw rootwait e arlyprintk console=ttyAMA0" 2>/dev/null
改為:
qemu-system-arm –s –S -nographic -sd vexpress.img -M vexpress-a9 -m 512M -kernel
zImage -dtb vexpress-v2p-ca9.dtb -smp 4 -append "init=/linuxrc root=/dev/
mmcblk0p1 rw rootwait e arlyprintk console=ttyAMA0" 2>/dev/null
即添加-s–S選項,則會使嵌入式ARM Linux系統等待GDB遠程連入。在終端1運行新的./run-nolcd.sh,
這樣嵌入式ARM Linux的模擬平臺在1234端口偵聽。開一個新的終端2,進入/home/baohua/develop/linux/,
執行如下代碼:
baohua@baohua-VirtualBox:~/develop/linux$ arm-linux-gnueabihf-gdb ./vmlinux
GNU gdb (crosstool-NG linaro-1.13.1-4.8-2013.05 - Linaro GCC 2013.05) 7.6-2013.05
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=i686-build_pc-linux-gnu --target=arm-linux-gnueabihf".
For bug reporting instructions, please see:
<https://bugs.launchpad.net/gcc-linaro>...
Reading symbols from /home/baohua/develop/linux/vmlinux...done.
(gdb)
接下來我們遠程連接127.0.0.1:1234
(gdb) target remote 127.0.0.1:1234
Remote debugging using 127.0.0.1:1234
0x60000000 in ?? ()
設置一個斷點到start_kernel()。
(gdb) b start_kernel
Breakpoint 1 at 0x805fd8ac: file init/main.c, line 490.
繼續運行:
(gdb) c
Continuing.
Breakpoint 1, start_kernel () at init/main.c:490
490 {
(gdb)
斷點停在了內核啟動過程中的start_kernel()函數,這個時候我們按下Ctrl+X,A鍵,可以看到代
碼,如圖21.4所示。
進一步,可以看看jiffies值之類的:
(gdb) p jiffies
$1 = 775612
(gdb) c
Continuing.
^C
Program received signal SIGINT, Interrupt.
cpu_v7_do_idle () at arch/arm/mm/proc-v7.S:74
74 ret lr
(gdb) p jiffies
$2 = 775687
(gdb)
圖21.4 GDB調試內核
盡管采用“插樁”和仿真器結合GDB的方式可以查看和修改數據結構、斷點、單步等,而printk()這
種最原始的方法卻應用得更廣泛。
printk()這種方法很原始,但是一般可以解決工程中95%以上的問題。因此具體何時打印,以及打
印什么東西,需要工程師逐步建立敏銳的嗅覺。加深對內核的認知,深入理解自己正在調試的模塊,這才
是快速解決問題的“王道”。工具只是一個輔助手段,無法代替工程師的思維。
工程師不能抱著得過且過的心態,也不能總是一知半解地進行低水平的重復建設。求知欲望對工程師
技術水平的提升有著最關鍵的作用。
21.3 內核打印信息——printk()
在Linux中,內核打印語句printk()會將內核信息輸出到內核信息緩沖區中,內核緩沖區是在
kernel/printk.c中通過如下語句靜態定義的:
static char __log_buf[__LOG_BUF_LEN] __aligned(LOG_ALIGN);
內核信息緩沖區是一個環形緩沖區(Ring Buffer),因此,如果塞入的消息過多,則就會將之前的消
息沖刷掉。
printk()定義了8個消息級別,分為級別0~7,級別越低(數值越大),消息越不重要,第0級是緊急
事件級,第7級是調試級,代碼清單21.2所示為printk()的級別定義。
代碼清單21.2 printk()的級別定義
1 #define KERN_EMERG "<0>" /* 緊急事件,一般是系統崩潰之前提示的消息 */
2 #define KERN_ALERT "<1>" /* 必須立即采取行動 */
3 #define KERN_CRIT "<2>" /* 臨界狀態,通常涉及嚴重的硬件或軟件操作失敗 */
4 #define KERN_ERR "<3>" /* 用于報告錯誤狀態,設備驅動程序會
5 經常使用KERN_ERR來報告來自硬件的問題 */
6 #define KERN_WARNING "<4>" /* 對可能出現問題的情況進行警告,
7 這類情況通常不會對系統造成嚴重的問題 */
8 #define KERN_NOTICE "<5>" /* 有必要進行提示的正常情形,
9 許多與安全相關的狀況用這個級別進行匯報 */
10#define KERN_INFO "<6>" /* 內核提示性信息,很多驅動程序
11 在啟動的時候,用這個級別打印出它們找到的硬件信息 */
12#define KERN_DEBUG "<7>" /* 用于調試信息 */
通過/proc/sys/kernel/printk文件可以調節printk()的輸出等級,該文件有4個數字值,如下所示。
·控制臺(一般是串口)日志級別:當前的打印級別,優先級高于該值的消息將被打印至控制臺。
·默認的消息日志級別:將用該優先級來打印沒有優先級前綴的消息,也就是在直接寫printk(“xxx”)
而不帶打印級別的情況下,會使用該打印級別。
·最低的控制臺日志級別:控制臺日志級別可被設置的最小值(一般都是1)。
·默認的控制臺日志級別:控制臺日志級別的默認值。
如在Ubuntu PC上,/proc/sys/kernel/printk的值一般如下:
$ cat /proc/sys/kernel/printk
4 4 1 7
而我們通過如下命令可以使得Linux內核的任何printk()都從控制臺輸出:
# echo 8 > /proc/sys/kernel/printk
在默認情況下,DEBUG級別的消息不會從控制臺輸出,我們可以通過在bootargs中設置ignore_loglevel
來忽略打印級別,以保證所有消息都被打印到控制臺。在系統啟動后,用戶還可以通過
寫/sys/module/printk/parameters/ignore_loglevel文件動態來設置是否忽略打印級別。
要注意的是,/proc/sys/kernel/printk并不控制內核消息進入__log_buf的門檻,因此無論消息級別是多
少,都會進入__log_buf中,但是最終只有高于當前打印級別的內核消息才會從控制臺打印。
用戶可以通過dmesg命令查看內核打印緩沖區,而如果使用dmesg-c命令,則不僅會顯示__log_buf,還
會清除該緩沖區的內容。也可以使用cat/proc/kmsg命令來顯示內核信息。/proc/kmsg是一個“永無休止的文
件”,因此,cat/proc/kmsg的進程只能通過“Ctrl+C”或kill終止。
在設備驅動中,經常需要輸出調試或系統信息,盡管可以直接采用printk(“<7>debug info…\n”)方式
的printk()語句輸出,但是通常可以使用封裝了printk()的更高級的宏,如pr_debug()、
dev_debug()等。代碼清單21.3所示為pr_debug()和pr_info()的定義。
代碼清單21.3 可替代printk()的宏pr_debug()和pr_info()的定義
1#ifdef DEBUG
2#define pr_debug(fmt,arg...) \
3 printk(KERN_DEBUG fmt,##arg)
4#else
5static inline int _ _attribute_ _ ((format (printf, 1, 2))) pr_debug(const char * fmt, ...)
6{
7 return 0;
8}
9#endif
10
11#define pr_info(fmt,arg...) \
12 printk(KERN_INFO fmt,##arg)
使用pr_xxx()族API的好處是,可以在文件最開頭通過pr_fmt()定義一個打印格式,比如在
kernel/watchdog.c的最開頭通過如下定義可以保證之后watchdog.c調用的所有pr_xxx()打印的消息都自動
帶有“NMI watchdog:”的前綴。
#define pr_fmt(fmt) "NMI watchdog: " fmt
#include <linux/mm.h>
#include <linux/cpu.h>
#include <linux/nmi.h>…
代碼清單21.4所示為dev_dbg()、dev_err()、dev_info()等的定義,使用dev_xxx()族API打印
的時候,設備名稱會被自動加到打印消息的前頭。
代碼清單21.4 包含設備信息的可替代printk()的宏
1#define dev_printk(level, dev, format, arg...) \
2 printk(level "%s %s: " format , dev_driver_string(dev) , (dev)->bus_id , ## arg)
3
4#ifdef DEBUG
5#define dev_dbg(dev, format, arg...) \
6 dev_printk(KERN_DEBUG , dev , format , ## arg)
7#else
8#define dev_dbg(dev, format, arg...) do { (void)(dev); } while (0)
9#endif
10
11#define dev_err(dev, format, arg...) \
12 dev_printk(KERN_ERR , dev , format , ## arg)
13#define dev_info(dev, format, arg...) \
14 dev_printk(KERN_INFO , dev , format , ## arg)
15#define dev_warn(dev, format, arg...) \
16 dev_printk(KERN_WARNING , dev , format , ## arg)
17#define dev_notice(dev, format, arg...) \
18 dev_printk(KERN_NOTICE , dev , format , ## arg)
在打印信息時,如果想輸出printk()調用所在的函數名,可以使用__func__;如果想輸出其所在代
碼的行號,可以使用__LINE__;想輸出源代碼文件名,可以使用__FILE__。例如drivers/block/sx8.c中的:
#ifdef CARM_NDEBUG
#define assert(expr)
#else
#define assert(expr) \
if(unlikely(!(expr))) { \
printk(KERN_ERR "Assertion failed! %s,%s,%s,line=%d\n", \
#expr, __FILE__, __func__, __LINE__); \
}
#endif
21.4 DEBUG_LL和EARLY_PRINTK
DEBUG_LL對應內核的Kernel low-level debugging功能,EARLY_PRINTK則對應內核中一個早期的控
制臺。為了在內核的drivers/tty/serial下的控制臺驅動初始化之前支持打印,可以選擇DEBUG_LL和
EARLY_PRINTK這兩個配置選項。另外,也需要在bootargs中設置earlyprintk的選項。
對于LDDD3_vexpress而言,沒有DEBUG_LL和EARLY_PRINTK的時候,我們看到的內核最早的打印
是:
Booting Linux on physical CPU 0x0
Initializing cgroup subsys cpuset
Linux version …
如果我們使能DEBUG_LL和EARLY_PRINTK,選擇如圖21.5所示的“Use PL011UART0at
0x10009000(V2P-CA9core tile)”這個低級別調試口,并在bootargs中設置earlyprintk,則我們看到了更早
的打印信息:
Uncompressing Linux... done, booting the kernel.
圖21.5 選擇低級別調試UART
21.5 使用“/proc”
在Linux系統中,“/proc”文件系統十分有用,它被內核用于向用戶導出信息。“/proc”文件系統是一個
虛擬文件系統,通過它可以在Linux內核空間和用戶空間之間進行通信。在/proc文件系統中,我們可以將
對虛擬文件的讀寫作為與內核中實體進行通信的一種手段,與普通文件不同的是,這些虛擬文件的內容都
是動態創建的。
“/proc”下的絕大多數文件是只讀的,以顯示內核信息為主。但是“/proc”下的文件也并不是完全只讀
的,若節點可寫,還可用于一定的控制或配置目的,例如前面介紹的寫/proc/sys/kernel/printk可以改變
printk()的打印級別。
Linux系統的許多命令本身都是通過分析“/proc”下的文件來完成的,如ps、top、uptime和free等。例
如,free命令通過分析/proc/meminfo文件得到可用內存信息,下面顯示了對應的meminfo文件和free命令的
結果。
1.meminfo文件
[root@localhost proc]# cat meminfo
MemTotal: 29516 kB
MemFree: 1472 kB
Buffers: 4096 kB
Cached: 12648 kB
SwapCached: 0 kB
Active: 14208 kB
Inactive: 8844 kB
HighTotal: 0 kB
HighFree: 0 kB
LowTotal: 29516 kB
LowFree: 1472 kB
SwapTotal: 265064 kB
SwapFree: 265064 kB
Dirty: 20 kB
Writeback: 0 kB
Mapped: 10052 kB
Slab: 3864 kB
CommitLimit: 279820 kB
Committed_AS: 13760 kB
PageTables: 444 kB
VmallocTotal: 999416 kB
VmallocUsed: 560 kB
VmallocChunk: 998580 kB
2. free命令
[root@localhost proc]# free
total used free shared buffers cached
Mem: 29516 28104 1412 0 4100 12700
-/+ buffers/cache: 11304 18212
Swap: 265064 0 265064
在Linux 3.9以及之前的內核版本中,可用如下函數創建“/proc”節點:
struct proc_dir_entry *create_proc_entry(const char *name, mode_t mode,
struct proc_dir_entry *parent);
struct proc_dir_entry *create_proc_read_entry(const char *name, mode_t mode,
struct proc_dir_entry *base, read_proc_t *read_proc, void * data);
create_proc_entry()函數用于創建“/proc”節點,而create_proc_read_entry()調用
create_proc_entry()創建只讀的“/proc”節點。參數name為“/proc”節點的名稱,parent/base為父目錄的節
點,如果為NULL,則指“/proc”目錄,read_proc是“/proc”節點的讀函數指針。當read()系統調用
在“/proc”文件系統中執行時,它映像到一個數據產生函數,而不是一個數據獲取函數。
下列函數用于創建“/proc”目錄:
struct proc_dir_entry *proc_mkdir(const char *name, struct proc_dir_entry *parent);
結合create_proc_entry()和proc_mkdir(),代碼清單21.5中的程序可用于先在/proc下創建一個目錄
procfs_example,而后在該目錄下創建一個文件example_file。
代碼清單21.5 proc_mkdir()和create_proc_entry()函數使用范例
1/* 創建/proc下的目錄 */
2example_dir = proc_mkdir("procfs_example", NULL);
3if (example_dir == NULL) {
4 rv = -ENOMEM;
5 goto out;
6}
7
8example_dir->owner = THIS_MODULE;
9
10/* 創建一個/proc文件 */
11example_file = create_proc_entry("example_file", 0666, example_dir);
12if (example_file == NULL) {
13 rv = -ENOMEM;
14 goto out;
15}
16
17example_file->owner = THIS_MODULE;
18example_file->read_proc = example_file_read;
19example_file->write_proc = example_file_write;
作為上述函數返回值的proc_dir_entry結構體包含了“/proc”節點的讀函數指針
(read_proc_t*read_proc)、寫函數指針(write_proc_t*write_proc)以及父節點、子節點信息等。
/proc節點的讀寫函數的類型分別為:
typedef int (read_proc_t)(char *page, char **start, off_t off,
int count, int *eof, void *data);
typedef int (write_proc_t)(struct file *file, const char __user *buffer,
unsigned long count, void *data);
讀函數中page指針指向用于寫入數據的緩沖區,start用于返回實際的數據并寫到內存頁的位置,eof是
用于返回讀結束標志,offset是讀的偏移,count是要讀的數據長度。start參數比較復雜,對于/proc只包含
簡單數據的情況,通常不需要在讀函數中設置*start,這意味著內核將認為數據保存在內存頁偏移0的地
方。
寫函數與file_operations中的write()成員函數類似,需要一次從用戶緩沖區到內存空間的復制過程。
在Linux系統中可用如下函數刪除/proc節點:
void remove_proc_entry(const char *name, struct proc_dir_entry *parent);
在Linux系統中已經定義好的可使用的/proc節點宏包括:proc_root_fs(/proc)、
proc_net(/proc/net)、proc_bus(/proc/bus)、proc_root_driver(/proc/driver)等,proc_root_fs實際上就是
NULL。
代碼清單21.6所示為一個簡單的“/proc”文件系統使用范例,這段代碼在模塊加載函數中創
建/proc/test_dir目錄,并在該目錄中創建/proc/test_dir/test_rw文件節點,在模塊卸載函數中撤銷“/proc”節
點,而/proc/test_dir/test_rw文件中只保存了一個32位的整數。
代碼清單21.6 /proc文件系統使用范例
1#include <linux/module.h>
2#include <linux/kernel.h>
3#include <linux/init.h>
4#include <linux/proc_fs.h>
5
6static unsigned int variable;
7static struct proc_dir_entry *test_dir, *test_entry;
8
9static int test_proc_read(char *buf, char **start, off_t off, int count,
10 int *eof, void *data)
11{
12 unsigned int *ptr_var = data;
13 return sprintf(buf, "%u\n", *ptr_var);
14}
15
16static int test_proc_write(struct file *file, const char *buffer,
17 unsigned long count, void *data)
18{
19 unsigned int *ptr_var = data;
20
21 *ptr_var = simple_strtoul(buffer, NULL, 10);
22
23 return count;
24}
25
26static __init int test_proc_init(void)
27{
28 test_dir = proc_mkdir("test_dir", NULL);
29 if (test_dir) {
30 test_entry = create_proc_entry("test_rw", 0666, test_dir);
31 if (test_entry) {
32 test_entry->nlink = 1;
33 test_entry->data = &variable;
34 test_entry->read_proc = test_proc_read;
35 test_entry->write_proc = test_proc_write;
36 return 0;
37 }
38 }
39
40 return -ENOMEM;
41}
42module_init(test_proc_init);
43
44static __exit void test_proc_cleanup(void)
45{
46 remove_proc_entry("test_rw", test_dir);
47 remove_proc_entry("test_dir", NULL);
48}
49module_exit(test_proc_cleanup);
50
51MODULE_AUTHOR("Barry Song <baohua@kernel.org>");
52MODULE_DESCRIPTION("proc exmaple");
53MODULE_LICENSE("GPL v2");
上述代碼第21行調用的simple_strtoul()用于將用戶輸入的字符串轉換為無符號長整數,第3個參數
10意味著轉化方式是十進制。
編譯上述簡單的proc.c為proc.ko,運行insmod proc.ko加載該模塊后,“/proc”目錄下將多出一個目錄
test_dir,該目錄下包含一個test_rw,ls–l的結果如下:
$ ls -l /proc/test_dir/test_rw
-rw-rw-rw- 1 root root 0 Aug 16 20:45 /proc/test_dir/test_rw
測試/proc/test_dir/test_rw的讀寫:
$ cat /proc/test_dir/test_rw
0$
echo 111 > /proc/test_dir/test_rw
$ cat /proc/test_dir/test_rw
說明我們上一步執行的寫操作是正確的。
在Linux 3.10及以后的版本中,“/proc”的內核API和實現架構變更較大,create_proc_entry()、
create_proc_read_entry()之類的API都被刪除了,取而代之的是直接使用proc_create()、
proc_create_data()API。同時,也不再存在read_proc()、write_proc()之類的針對proc_dir_entry的成
員函數了,而是直接把file_operations結構體的指針傳入proc_create()或者proc_create_data()函數中,
其原型為:
static inline struct proc_dir_entry *proc_create(
const char *name, umode_t mode, struct proc_dir_entry *parent,
const struct file_operations *proc_fops);
struct proc_dir_entry *proc_create_data(
const char *name, umode_t mode, struct proc_dir_entry *parent,
const struct file_operations *proc_fops, void *data);
我們把代碼清單21.6的范例改造為同時支持Linux 3.10以前的內核和Linux3.10以后的內核。改造結果
如代碼清單21.7所示。#if LINUX_VERSION_CODE<KERNEL_VERSION(3,10,0)中的部分是舊版本
的代碼,與21.6相同,所以省略了。
代碼清單21.7 支持Linux 3.10以后內核的/proc文件系統使用范例
1#include <linux/module.h>
2#include <linux/kernel.h>
3#include <linux/init.h>
4#include <linux/version.h>
5#include <linux/proc_fs.h>
6#include <linux/seq_file.h>
7
8static unsigned int variable;
9static struct proc_dir_entry *test_dir, *test_entry;
10
11#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0)
12...
13#else
14static int test_proc_show(struct seq_file *seq, void *v)
15{
16 unsigned int *ptr_var = seq->private;
17 seq_printf(seq, "%u\n", *ptr_var);
18 return 0;
19}
20
21static ssize_t test_proc_write(struct file *file, const char __user *buffer,
22 size_t count, loff_t *ppos)
23{
24 struct seq_file *seq = file->private_data;
25 unsigned int *ptr_var = seq->private;
26
27 *ptr_var = simple_strtoul(buffer, NULL, 10);
28 return count;
29}
30
31static int test_proc_open(struct inode *inode, struct file *file)
32{
33 return single_open(file, test_proc_show, PDE_DATA(inode));
34}
35
36static const struct file_operations test_proc_fops =
37{
38 .owner = THIS_MODULE,
39 .open = test_proc_open,
40 .read = seq_read,
41 .write = test_proc_write,
42 .llseek = seq_lseek,
43 .release = single_release,
44};
45#endif
46
47static __init int test_proc_init(void)
48{
49 test_dir = proc_mkdir("test_dir", NULL);
50 if (test_dir) {
51#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0)
52 ...
53#else
54 test_entry = proc_create_data("test_rw",0666, test_dir, &test_proc_fops, &variable);
55 if (test_entry)
56 return 0;
57#endif
58 }
59
60 return -ENOMEM;
61}
62module_init(test_proc_init);
63
64static __exit void test_proc_cleanup(void)
65{
66 remove_proc_entry("test_rw", test_dir);
67 remove_proc_entry("test_dir", NULL);
68}
69module_exit(test_proc_cleanup);
21.6 Oops
當內核出現類似用戶空間的Segmentation Fault時(例如內核訪問一個并不存在的虛擬地址),Oops會
被打印到控制臺和寫入內核log緩沖區。
我們在globalmem.c的globalmem_read()函數中加上下面一行代碼:
} else {
*ppos += count;
ret = count;
*(unsigned int *)0 = 1; /* a kernel panic */
printk(KERN_INFO "read %u bytes(s) from %lu\n", count, p);
}
假設這個字符設備對應的設備節點是/dev/globalmem,通過cat/dev/globalmem命令讀設備文件,將得到
如下Oops信息:
# cat /dev/globalmem
Unable to handle kernel NULL pointer dereference at virtual address 00000000
pgd = 9ec08000
[00000000] *pgd=7f733831, *pte=00000000, *ppte=00000000
Internal error: Oops: 817 [#1] SMP ARM
Modules linked in: globalmem
CPU: 0 PID: 609 Comm: cat Not tainted 3.16.0+ #13
task: 9f7d8000 ti: 9f722000 task.ti: 9f722000
PC is at globalmem_read+0xbc/0xcc [globalmem]
LR is at 0x0
pc : [<7f000200>] lr : [<00000000>] psr: 00000013
sp : 9f723f30 ip : 00000000 fp : 00000000
r10: 9f414000 r9 : 00000000 r8 : 00001000
r7 : 00000000 r6 : 00001000 r5 : 00001000 r4 : 00000000
r3 : 00000001 r2 : 00000000 r1 : 00001000 r0 : 7f0003cc
Flags: nzcv IRQs on FIQs on Mode SVC_32 ISA ARM Segment user
Control: 10c53c7d Table: 7ec08059 DAC: 00000015
Process cat (pid: 609, stack limit = 0x9f722240)
Stack: (0x9f723f30 to 0x9f724000)
3f20: 7ed5ff91 9f723f80 00000000 9f79ab40
3f40: 00001000 7ed5eb18 9f723f80 00000000 00000000 800cb114 00000020 9f722000
3f60: 9f5e4628 9f79ab40 9f79ab40 00001000 7ed5eb18 00000000 00000000 800cb2ec
3f80: 00001000 00000000 9f7168c0 00001000 7ed5eb18 00000003 00000003 8000e4e4
3fa0: 9f722000 8000e360 00001000 7ed5eb18 00000003 7ed5eb18 00001000 0000002f
3fc0: 00001000 7ed5eb18 00000003 00000003 7ed5eb18 00000001 00000003 00000000
3fe0: 0015c23c 7ed5eb00 0000f718 00008d8c 60000010 00000003 00000000 00000000
[<7f000200>] (globalmem_read [globalmem]) from [<800cb114>] (vfs_read+0x98/0x13c)
[<800cb114>] (vfs_read) from [<800cb2ec>] (SyS_read+0x44/0x84)
[<800cb2ec>] (SyS_read) from [<8000e360>] (ret_fast_syscall+0x0/0x30)
Code: e1a05008 e2a77000 e1c360f0 e3a03001 (e58c3000)
---[ end trace 5a36d6470da50d02 ]---
Segmentation fault
上述Oops的第一行給出了“原因”,即訪問了NULL pointer。Oops中的PC is at
globalmem_read+0xbc/0xcc這一行代碼也比較關鍵,給出了“事發現場”,即globalmem_read()函數偏移
0xbc字節的指令處。
通過反匯編globalmem.o可以尋找到globalmem_read()函數開頭位置偏移0xbc的指令,反匯編方法如
下:
drivers/char/globalmem$ arm-linux-gnueabihf-objdump -d -S globalmem.o
對應的反匯編代碼如下,global_read()開始于0x144,偏移0xbc的位置為0x200:
static ssize_t globalmem_read(struct file *filp, char __user * buf, size_t size,
loff_t * ppos)
{
144: e92d45f0 push {r4, r5, r6, r7, r8, sl, lr}
148: e24dd00c sub sp, sp, #12
unsigned long p = *ppos;
14c: e5934000 ldr r4, [r3]

*ppos += count;
1f4: e2a77000 adc r7, r7, #0
1f8: e1c360f0 strd r6, [r3]
ret = count;
*(unsigned int *)0 = 1; /* a kernel panic */
1fc: e3a03001 mov r3, #1
200: e58c3000 str r3, [ip]
printk(KERN_INFO "read %u bytes(s) from %lu\n", count, p);
204: …
return ret;
}
“str r3,[ip]”是引起Oops的指令。這里僅僅給出了一個例子,工程實踐中的“事發現場”并不全那么容
易找到,但方法都是類似的。
21.7 BUG_ON()和WARN_ON()
內核中有許多地方調用類似BUG()的語句,它非常像一個內核運行時的斷言,意味著本來不該執
行到BUG()這條語句,一旦執行即拋出Oops。BUG()的定義為:
#define BUG() do { \
printk("BUG: failure at %s:%d/%s()!\n", __FILE__, __LINE__, __func__); \
panic("BUG!"); \
} while (0)
其中的panic()定義在kernel/panic.c中,會導致內核崩潰,并打印Oops。比如arch/arm/kernel/dma.c中的
enable_dma()函數:
void enable_dma (unsigned int chan)
{
dma_t *dma = dma_channel(chan);
if (!dma->lock)
goto free_dma;
if (dma->active == 0) {
dma->active = 1;
dma->d_ops->enable(chan, dma);
}
return;
free_dma:
printk(KERN_ERR "dma%d: trying to enable free DMA\n", chan);
BUG();
}
上述代碼的含義是,如果在dma->lock不成立的情況下,驅動直接調用了enable_dma(),實際上意味
著內核的一個bug。
BUG()還有一個變體叫BUG_ON(),它的內部會引用BUG(),形式為:
#define BUG_ON(condition) do { if (unlikely(condition)) BUG(); } while (0)
對于BUG_ON()而言,只有當括號內的條件成立的時候,才拋出Oops。比如drivers/char/random.c中
的類似代碼:
static void push_to_pool(struct work_struct *work)
{
struct entropy_store *r = container_of(work, struct entropy_store,
push_work);
BUG_ON(!r);
_xfer_secondary_pool(r, random_read_wakeup_bits/8);
trace_push_to_pool(r->name, r->entropy_count >> ENTROPY_SHIFT,
r->pull->entropy_count >> ENTROPY_SHIFT);
}
除了BUG_ON()外,內核有個稍微弱一些WARN_ON(),在括號中的條件成立的時候,內核會拋
出棧回溯,但是不會panic(),這通常用于內核拋出一個警告,暗示某種不太合理的事情發生了。如在
kernel/locking/mutex-debug.c中的debug_mutex_unlock()函數發現mutex_unlock()的調用者和
mutex_lock()的調用者不是同一個線程的時候或者mutex的owner為空的時候,會拋出警告信息:
void debug_mutex_unlock(struct mutex *lock)
{
if (likely(debug_locks)) {
DEBUG_LOCKS_WARN_ON(lock->magic != lock);
if (!lock->owner)
DEBUG_LOCKS_WARN_ON(!lock->owner);
else
DEBUG_LOCKS_WARN_ON(lock->owner != current);
DEBUG_LOCKS_WARN_ON(!lock->wait_list.prev && !lock->wait_list.next);
mutex_clear_owner(lock);
}
}
有時候,WARN_ON()也可以作為一個調試技巧。比如,我們進到內核某個函數后,不知道這個函
數是怎么一級一級被調用進來的,那可以在該函數中加入一個WARN_ON(1)。
21.8 strace
在Linux系統中,strace是一種相當有效的跟蹤工具,它的主要特點是可以被用來監視系統調用。我們
不僅可以用strace調試一個新開始的程序,也可以調試一個已經在運行的程序(這意味著把strace綁定到一
個已有的PID上)。對于第6章的globalmem字符設備文件,以strace方式運行如代碼清單21.8所示的用戶空
間應用程序globalmem_test,運行的結果如下:
execve("./globalmem_test", ["./globalmem_test"], [/* 24 vars */]) = 0
...
open("/dev/globalmem", O_RDWR) = 3 /* 打開的/dev/globalmem的fd是3 */
ioctl(3, FIBMAP, 0) = 0
read(3, 0xbff17920, 200) = -1 ENXIO (No such device or address)/* 讀取失敗 */
fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f04000
write(1, "-1 bytes read from globalmem\n", 29-1 bytes read from globalmem
) = 29 /* 向標準輸出設備(fd為1)寫入printf中的字符串 */
write(3, "This is a test of globalmem", 27) = 27
write(1, "27 bytes written into globalmem\n", 3227 bytes written into globalmem
) = 32
...
輸出的每一行對應一次Linux系統調用,其格式為“左邊=右邊”,等號左邊是系統調用的函數名及其參
數,右邊是該調用的返回值。
代碼清單21.8 用戶空間應用程序globalmem_test
1#include ...
2
3#define MEM_CLEAR 0x1
4main()
5{
6 int fd, num, pos;
7 char wr_ch[200] = "This is a test of globalmem";
8 char rd_ch[200];
9 /* 打開/dev/globalmem */
10 fd = open("/dev/globalmem", O_RDWR, S_IRUSR | S_IWUSR);
11 if (fd != -1 ) { /* 清除globalmem */
12 if(ioctl(fd, MEM_CLEAR, 0) < 0)
13 printf("ioctl command failed\n");
14 /* 讀globalmem */
15 num = read(fd, rd_ch, 200);
16 printf("%d bytes read from globalmem\n",num);
17
18 /* 寫globalmem */
19 num = write(fd, wr_ch, strlen(wr_ch));
20 printf("%d bytes written into globalmem\n",num);
21 ...
22 close(fd);
23 }
24}
使用strace雖然無法直接追蹤到設備驅動中的函數,但是足以幫助工程師進行推演,如從
open(“/dev/globalmem”,O_RDWR)=3的返回結果知道/dev/globalmem的fd為3,之后對fd為3的文件進行
read()、write()和ioctl()系統調用,最終會使globalmem里file_operations中的相應函數被調用,通過
系統調用的結果就可以知道驅動中globalmem_read()、globalmem_write()和globalmem_ioctl()的運
行結果。
21.9 KGDB
Linux直接提供了對KGDB的支持,KGDB采用了典型的嵌入式系統“插樁”技巧,一般依賴于串口與調
試主機通信。為了支持KGDB,串口驅動應該實現純粹的輪詢收發單一字符的成員函數,以供
drivers/tty/serial/kgdboc.c調用,譬如drivers/tty/serial/8250/8250_core.c中的:
static struct uart_ops serial8250_pops = {

#ifdef CONFIG_CONSOLE_POLL
.poll_get_char = serial8250_get_poll_char,
.poll_put_char = serial8250_put_poll_char,
#endif
};
在編譯內核時,運行make ARCH=arm menuconfig時需選擇關于KGDB的編譯項目,如圖21.6所示。
圖21.6 KGDB編譯選項配置
對于目標板而言,需要在bootargs中設置與KGDB對應的串口等信息,如kgdboc=ttyS0,
115200kgdbcon。
如果想一開機內核就直接進入等待GDB連接的調試狀態,可以在bootargs中設置kgdbwait,kgdbwait的
含義是啟動時就等待主機的GDB連接。而若想在內核啟動后進入GDB調試模式,可運行echo
g>/proc/sysrq_trigger命令給內核傳入一個鍵值是g的magic_sysrq。
在調試PC上,依次運行如下命令就可以啟動調試并連接至目標機(假設串口在PC上對應的設備節點
是/dev/ttyS0):
# arm-eabi-gdb ./vmlinux
(gdb) set remotebaud 115200
(gdb) target remote /dev/ttyS0 //連接目標機
(gdb)
之后,在主機上,我們可以使用GDB像調試應用程序一樣調試使能了KGDB的目標機上的內核。
21.10 使用仿真器調試內核
在ARM Linux領域,目前比較主流的是采用ARM DS-5Development Studio方案。ARM DS-5是一個針
對基于Linux的系統和裸機嵌入式系統的專業軟件開發解決方案,它涵蓋了開發的所有階段,從啟動代
碼、內核移植直到應用程序調試、分析。如圖21.7所示,它使用了DSTREAM高性能仿真器(ARM已經停
止更新RVI-RVT2仿真器),在Eclipse內包含了DS-5和DSTREAM的開發插件。
調試主機一般通過網線與DSTREAM仿真器連接,而仿真器則連接與電路板類似的JTAG接口,之后
用DS-5調試器進行調試。DS-5圖形化調試器提供了全面和直觀的調試圖,非常易于調試Linux和裸機程
序,易于查看代碼,進行棧回溯,查看內存、寄存器、表達式、變量,分析內核線程,設置斷點。
圖21.7 DSTREAM仿真器和DS-5開發環境
值得一提的是,DS-5也提供了Streamline Performance Analyzer。ARM Streamline性能分析器(見圖
21.8)為軟件開發人員提供了一種用來分析和優化在ARM926、ARM11和Cortex-A系列平臺上運行的Linux
和Android系統的直觀方法。使用Streamline,Linux內核中需包含一個gator模塊,用戶空間則需要使能
gatord后臺服務器程序。關于Streamline具體的操作方法可以查看《ARM? DS-5Using ARM Streamline》。
圖21.8 ARMStreamline性能分析器
21.11 應用程序調試
在嵌入式系統中,為調試Linux應用程序,可在目標板上先運行GDBServer,再讓主機上的GDB與目
標板上的GDBServer通過網口或串口通信。
1.目標板
需要運行如下命令啟動GDBServer:
gdbserver <host_ip>:<port> <app>
<host_ip>:<port>為主機的IP地址和端口,app是可執行的應用程序名。
當然,也可以用系統中空閑的串口作為GDB調試器和GDBServer的底層通信手段,如:
gdbserver/dev/ttyS0./tdemo
2.主機
需要先運行如下命令啟動GDB:
arm-eabi-gdb <app>
app與GDBServer的app參數對應。
之后,運行如下命令就可以連接目標板:
target remote <target_ip>:<port>
<target_ip>:<port>為目標機的IP地址和端口。
如果目標板上的GDBServer使用串口,則在宿主機上GDB也應該使用串口,如:
(gdb)target remote/dev/ttyS1
之后,便可以使用GDB像調試本機上的程序一樣調試目標機上的程序。
3.通過GDB server和ARM GDB調試應用程序
在ARM開發板上放置GDB server,便可以通過目標板與調試PC之間的以太網等調試。要調試的應用
程序的源代碼如下:
/*
* gdb_example.c: program to show how to use arm-linux-gdb
*/
void increase_one(int *data)
{ *data = *data + 1;
}i
nt main(int argc, char *argv[])
{ int dat = 0;
int *p = 0;
increase_one(&dat);
/* program will crash here */
increase_one(p);
return 0;
}
通過debug方式編譯它:
arm-linux-gnueabi-gcc -g -o gdb_example gdb_example.c
將程序下載到目標板后,在目標板上運行:
# gdbserver 192.168.1.20:1234 gdb_example
Process gdb_example created; pid = 1096
Listening on port 1234
其中192.168.1.20為目標板的3IP,1234為GDBserver的偵聽端口。
如果目標機是Android系統,且沒有以太網,可以嘗試使用adb forward功能,比如adb forward tcp:
1234tcp:1234是把目標機1234端口與主機1234端口進行轉發。
在主機上運行:
$ arm-eabi-gdb gdb_example…
主機的GDB中運行如下命令以連接目標板:
(gdb) target remote 192.168.1.20:1234
Remote debugging using 192.168.1.20:1234
...
0x400007b0 in ?? ()
如果是Android的adb forward,則上述target remote 192.168.1.20:1234中的IP地址可以去掉,因為它變
成直接連接本機了,可直接寫成target remote:1234。
運行如下命令將斷點設置在increase_one(&dat);這一行:
(gdb) b gdb_example.c:16
Breakpoint 1 at 0x8390: file gdb_example.c, line 16.
通過c命令繼續運行目標板上的程序,發生斷點:
(gdb) c
Continuing.
...
Breakpoint 1, main (argc=1, argv=0xbead4eb4) at gdb_example.c:16
16increase_one(&dat);
運行n命令執行完increase_one(&dat);再查看dat的值:
(gdb) n
19increase_one(p); (gdb) p dat
$1 = 1
發現dat變成1。繼續運行c命令,由于即將訪問空指針,gdb_example將崩潰:
(gdb) c
Continuing.
Program received signal SIGSEGV, Segmentation fault.
0x0000834c in increase_one (data=0x0) at gdb_example.c:8
8*data = *data + 1;
我們通過bt命令可以拿到backtrace:
(gdb) bt
#0 0x0000834c in increase_one (data=0x0) at gdb_example.c:8
#1 0x000083a4 in main (argc=1, argv=0xbead4eb4) at gdb_example.c:19
通過info reg命令可以查看當時的寄存器值:
(gdb) info reg
r00x0 0
r10xbead4eb43199028916
r20x1 1
r30x0 0
r40x4001e5e01073866208
r50x0 0
r60x826c33388
r70x0 0
r80x0 0
r90x0 0
r10 0x400250001073893376
r11 0xbead4d443199028548
r12 0xbead4d483199028552
sp 0xbead4d300xbead4d30
lr 0x83a433700
pc 0x834c0x834c <increase_one+24>
fps 0x0 0
cpsr 0x600000101610612752
21.12 Linux性能監控與調優工具
除了保證程序的正確性以外,在項目開發中往往還關心性能和穩定性。這時候,我們往往要對內核、
應用程序或整個系統進行性能優化。在性能優化中常用的手段如下。
1.使用top、vmstat、iostat、sysctl等常用工具
top命令用于顯示處理器的活動狀況。在缺省情況下,顯示占用CPU最多的任務,并且每隔5s做一次
刷新;vmstat命令用于報告關于內核線程、虛擬內存、磁盤、陷阱和CPU活動的統計信息;iostat命令用于
分析各個磁盤的傳輸閑忙狀況;netstat是用來檢測網絡信息的工具;sar用于收集、報告或者保存系統活動
信息,其中,sar用于顯示數據,sar1和sar2用于收集和保存數據。
sysctl是一個可用于改變正在運行中的Linux系統的接口。用sysctl可以讀取幾百個以上的系統變量,例
如用sysctl–a可讀取所有變量。
sysctl的實現原理是:所有的內核參數在/proc/sys中形成一個樹狀結構,sysctl系統調用的內核函數是
sys_sysctl,匹配項目后,最后的讀寫在do_sysctl_strategy中完成,如
echo "1" > /proc/sys/net/ipv4/ip_forward
就等價于:
sysctl –w net.ipv4.ip_forward ="1"
2.使用高級分析手段,如OProfile、gprof
OProfile可以幫助用戶識別諸如模塊的占用時間、循環的展開、高速緩存的使用率低、低效的類型轉
換和冗余操作、錯誤預測轉移等問題。它收集有關處理器事件的信息,其中包括TLB的故障、停機、存儲
器訪問以及緩存命中和未命中的指令的攫取數量。
OProfile支持兩種采樣方式:基于事件的采樣(Event Based)和基于時間的采樣(Time Based)。基于
事件的采樣是OProfile只記錄特定事件(比如L2緩存未命中)的發生次數,當達到用戶設定的定值時
Oprofile就記錄一下(采一個樣)。這種方式需要CPU內部有性能計數器(Performace Counter)。基于時
間的采樣是OProfile借助OS時鐘中斷的機制,在每個時鐘中斷,OProfile都會記錄一次(采一次樣)。引
入它的目的在于,提供對沒有性能計數器的CPU的支持,其精度相對于基于事件的采樣要低,因為要借助
OS時鐘中斷的支持,對于禁用中斷的代碼,OProfile不能對其進行分析。
OProfile在Linux上分兩部分,一個是內核模塊(oprofile.ko),另一個是用戶空間的守護進程
(oprofiled)。前者負責訪問性能計數器或者注冊基于時間采樣的函數,并將采樣值置于內核的緩沖區
內。后者在后臺運行,負責從內核空間收集數據,寫入文件。其運行步驟如下。
1)初始化opcontrol--init
2)配置opcontrol--setup--event=...
3)啟動opcontrol--start
4)運行待分析的程序xxx
5)取出數據
opcontrol--dump
opcontrol--stop
6)分析結果opreport-l./xxx
用GNU gprof可以打印出程序運行中各個函數消耗的時間,以幫助程序員找出眾多函數中耗時最多的
函數;還可產生程序運行時的函數調用關系,包括調用次數,以幫助程序員分析程序的運行流程。
GNU gprof的實現原理:在編譯和鏈接程序的時候(使用-pg編譯和鏈接選項),gcc在應用程序的每
個函數中都加入名為mcount(_mcount或__mcount,依賴于編譯器或操作系統)的函數,也就是說應用程
序里的每一個函數都會調用mcount,而mcount會在內存中保存一張函數調用圖,并通過函數調用堆棧的形
式查找子函數和父函數的地址。這張調用圖也保存了所有與函數相關的調用時間、調用次數等的所有信
息。
GNU gprof的基本用法如下。
1)使用-pg編譯和鏈接應用程序。
2)執行應用程序并使它生成供gprof分析的數據。
3)使用gprof程序分析應用程序生成的數據。
3.進行內核跟蹤,如LTTng
LTTng(Linux Trace Toolkit-next generation,官方網站為http://lttng.org/)是一個用于跟蹤系統詳細運行
狀態和流程的工具,它可以跟蹤記錄系統中的特定事件。這些事件包括:系統調用的進入和退出;陷阱/
中斷(Trap/Irq)的進入和退出;進程調度事件;內核定時器;進程管理相關事件——創建、喚醒、信號
處理等;文件系統相關事件——open/read/write/seek/ioctl等;內存管理相關事件——內存分配/釋放等;其
他IPC/套接字/網絡等事件。而對于這些記錄,我們可以通過圖形的方式經由lttv-gui查看,如圖21.9所示。
4.使用LTP進行壓力測試
LTP(Linux Test Project,官方網站為http://ltp.sourceforge.net/)是一個由SGI發起并由IBM負責維護的
合作計劃。它的目的是為開源社區提供測試套件來驗證Linux的可靠性、健壯性和穩定性。它通過壓力測
試來判斷系統的穩定性和可靠性,在工程中我們可使用LTP測試套件對Linux操作系統進行超長時間的測
試,它可進行文件系統壓力測試、硬盤I/O測試、內存管理壓力測試、IPC壓力測試、SCHED測試、命令
功能的驗證測試、系統調用功能的驗證測試等。
圖21.9 LTTng形成的時序圖
5.使用Benchmark評估系統
可用于Linux的Benchmark的包括lmbench、UnixBench、AIM9、Netperf、SSLperf、dbench、Bonnie、
Bonnie++、Iozone、BYTEmark等,它們可用于評估操作系統、網絡、I/O子系統、CPU等的性能,參考網
址http://lbs.sourceforge.net/列出了許多Benchmark工具。
21.13 總結
Linux程序的調試,尤其是內核的調試看起來比較復雜,沒有類似于VC++、Tornado的IDE開發環境,
最常用的調試手段依然是文本方式的GDB。文本方式的GDB調試器功能異常強大,當我們使用習慣后,
就會用得非常自然。
Linux內核驅動的調試方法包括“插樁”、使用仿真器和借助printk()、Oops、strace等,在大多數情況
下,原始的printk()仍然是最有效的手段。
除了本章介紹的方法外,在驅動的調試中很可能還會借助其他的硬件或軟件調試工具,如調試USB驅
動最好借助USB分析儀,用USB分析儀將可捕獲USB通信中的數據包,如同網絡中的Sniffer軟件一樣。

總結

以上是生活随笔為你收集整理的linux驱动程序设计21 Linux设备驱动的调试的全部內容,希望文章能夠幫你解決所遇到的問題。

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

国产精品无码久久av | 亚洲日韩av一区二区三区四区 | 欧美丰满少妇xxxx性 | 国产乱子伦视频在线播放 | 人妻aⅴ无码一区二区三区 | 少妇激情av一区二区 | 鲁一鲁av2019在线 | 久久久中文久久久无码 | 久久综合网欧美色妞网 | 国产精品爱久久久久久久 | 亚洲中文字幕在线观看 | 久久综合网欧美色妞网 | 国产特级毛片aaaaaa高潮流水 | 一本久道高清无码视频 | 国产精品igao视频网 | 色婷婷av一区二区三区之红樱桃 | 人人妻人人澡人人爽人人精品 | 乱中年女人伦av三区 | 国产无av码在线观看 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 国产高清av在线播放 | 牛和人交xxxx欧美 | 人妻少妇精品视频专区 | 波多野结衣av一区二区全免费观看 | 无遮挡国产高潮视频免费观看 | 中文字幕av日韩精品一区二区 | a国产一区二区免费入口 | 窝窝午夜理论片影院 | 国产激情精品一区二区三区 | 天天摸天天透天天添 | 久久熟妇人妻午夜寂寞影院 | 一本色道婷婷久久欧美 | 国产免费久久久久久无码 | 中文字幕av日韩精品一区二区 | 一本久久a久久精品亚洲 | 国产猛烈高潮尖叫视频免费 | 少妇太爽了在线观看 | 搡女人真爽免费视频大全 | 日本精品人妻无码77777 天堂一区人妻无码 | 国产午夜精品一区二区三区嫩草 | 亚洲春色在线视频 | 国产精品va在线观看无码 | 无码午夜成人1000部免费视频 | 亚洲欧美综合区丁香五月小说 | 国产网红无码精品视频 | 日韩精品无码一区二区中文字幕 | 无遮无挡爽爽免费视频 | 国产精品美女久久久久av爽李琼 | 帮老师解开蕾丝奶罩吸乳网站 | 午夜精品久久久内射近拍高清 | 亚洲国产精品无码久久久久高潮 | 国产又爽又黄又刺激的视频 | 内射爽无广熟女亚洲 | 国产无遮挡吃胸膜奶免费看 | 牲欲强的熟妇农村老妇女视频 | 兔费看少妇性l交大片免费 | 欧美人与动性行为视频 | 成人毛片一区二区 | 亚洲一区二区三区无码久久 | aⅴ亚洲 日韩 色 图网站 播放 | 亚洲中文字幕无码一久久区 | 久久精品人妻少妇一区二区三区 | 熟女少妇在线视频播放 | 西西人体www44rt大胆高清 | 亚洲精品国偷拍自产在线观看蜜桃 | 国产xxx69麻豆国语对白 | 精品久久久久香蕉网 | 久久五月精品中文字幕 | 亚洲乱码日产精品bd | 亚洲精品午夜无码电影网 | 色欲综合久久中文字幕网 | 日本大香伊一区二区三区 | 天天av天天av天天透 | 亚洲乱码国产乱码精品精 | 亚洲最大成人网站 | 国产高清不卡无码视频 | 扒开双腿疯狂进出爽爽爽视频 | 国产精品国产自线拍免费软件 | 亚洲欧洲无卡二区视頻 | 我要看www免费看插插视频 | 精品国产av色一区二区深夜久久 | 国产美女精品一区二区三区 | 婷婷色婷婷开心五月四房播播 | 女人被爽到呻吟gif动态图视看 | 精品亚洲韩国一区二区三区 | 精品人妻人人做人人爽 | 欧美日韩色另类综合 | 7777奇米四色成人眼影 | 岛国片人妻三上悠亚 | 国产乱子伦视频在线播放 | 国产亚av手机在线观看 | 无码人妻出轨黑人中文字幕 | 无码人妻久久一区二区三区不卡 | 国内精品久久毛片一区二区 | 欧美 亚洲 国产 另类 | 99久久婷婷国产综合精品青草免费 | 国产精品亚洲а∨无码播放麻豆 | 丰满护士巨好爽好大乳 | 国产成人精品三级麻豆 | 亚洲人成影院在线无码按摩店 | 给我免费的视频在线观看 | 国产精品久久久久久久9999 | 国精产品一区二区三区 | 一本无码人妻在中文字幕免费 | 高清国产亚洲精品自在久久 | 妺妺窝人体色www在线小说 | 亚洲国精产品一二二线 | 久久久www成人免费毛片 | 欧美丰满熟妇xxxx性ppx人交 | 日欧一片内射va在线影院 | 亚洲综合伊人久久大杳蕉 | 国产一区二区三区四区五区加勒比 | 精品亚洲韩国一区二区三区 | 国产精品igao视频网 | 亚洲 激情 小说 另类 欧美 | 亚洲精品久久久久中文第一幕 | 图片小说视频一区二区 | 鲁一鲁av2019在线 | 欧美真人作爱免费视频 | 亚洲の无码国产の无码影院 | 性生交大片免费看l | 蜜臀av在线播放 久久综合激激的五月天 | 国产精品香蕉在线观看 | 亚洲综合久久一区二区 | 日日碰狠狠躁久久躁蜜桃 | 波多野结衣av一区二区全免费观看 | 亚洲欧美精品aaaaaa片 | 久久无码人妻影院 | 亚洲人交乣女bbw | 性生交大片免费看l | 国产性生交xxxxx无码 | 国产av久久久久精东av | 亚洲精品成人福利网站 | 日本xxxx色视频在线观看免费 | 国产在热线精品视频 | 亚洲成在人网站无码天堂 | 天堂亚洲免费视频 | 国产黑色丝袜在线播放 | 99麻豆久久久国产精品免费 | 少妇无码吹潮 | 欧美喷潮久久久xxxxx | 夜精品a片一区二区三区无码白浆 | 欧美日本日韩 | 人人妻在人人 | 久久久精品欧美一区二区免费 | 国产乱码精品一品二品 | 亚洲一区二区三区偷拍女厕 | 国产情侣作爱视频免费观看 | 天堂а√在线中文在线 | 无码免费一区二区三区 | 中文字幕无码人妻少妇免费 | 国产精品国产自线拍免费软件 | 久久亚洲中文字幕精品一区 | 国产69精品久久久久app下载 | 毛片内射-百度 | 高潮毛片无遮挡高清免费视频 | 丰满人妻翻云覆雨呻吟视频 | 国产性生交xxxxx无码 | 国产亚洲精品精品国产亚洲综合 | www国产亚洲精品久久久日本 | 老头边吃奶边弄进去呻吟 | 成人一区二区免费视频 | 国产特级毛片aaaaaa高潮流水 | 国产亚洲人成在线播放 | 久久亚洲精品成人无码 | 精品国产av色一区二区深夜久久 | 亚洲精品久久久久久久久久久 | 国产午夜精品一区二区三区嫩草 | 国产片av国语在线观看 | 97久久国产亚洲精品超碰热 | 日韩欧美成人免费观看 | 水蜜桃色314在线观看 | 亚洲 a v无 码免 费 成 人 a v | 国产亚洲精品久久久久久久 | 久久99精品国产麻豆 | 国产人妻人伦精品1国产丝袜 | 日本乱偷人妻中文字幕 | 久久国语露脸国产精品电影 | 国产午夜福利100集发布 | 一区二区三区高清视频一 | 色婷婷综合激情综在线播放 | 中文字幕中文有码在线 | 亚洲熟妇色xxxxx欧美老妇 | 性欧美疯狂xxxxbbbb | 帮老师解开蕾丝奶罩吸乳网站 | 国产亲子乱弄免费视频 | 在线视频网站www色 | 亚洲一区二区三区香蕉 | 午夜成人1000部免费视频 | 国产小呦泬泬99精品 | 亚洲中文字幕乱码av波多ji | 日韩精品a片一区二区三区妖精 | 精品厕所偷拍各类美女tp嘘嘘 | 蜜桃臀无码内射一区二区三区 | 国产精品久久久久久亚洲影视内衣 | 无码人中文字幕 | 无码人妻丰满熟妇区五十路百度 | 又色又爽又黄的美女裸体网站 | 丁香花在线影院观看在线播放 | 无码人中文字幕 | 久久国产精品二国产精品 | 国产精品无码永久免费888 | 国产亚洲精品久久久闺蜜 | 欧美35页视频在线观看 | 国产人成高清在线视频99最全资源 | 精品成在人线av无码免费看 | 欧美野外疯狂做受xxxx高潮 | 精品人妻人人做人人爽夜夜爽 | 人妻体内射精一区二区三四 | 亚洲欧美精品aaaaaa片 | 午夜嘿嘿嘿影院 | 日本大乳高潮视频在线观看 | 人妻天天爽夜夜爽一区二区 | 色综合久久久久综合一本到桃花网 | 亚洲理论电影在线观看 | 久久综合给久久狠狠97色 | 亚洲热妇无码av在线播放 | 亚洲日韩av一区二区三区四区 | 荫蒂添的好舒服视频囗交 | 亚洲狠狠色丁香婷婷综合 | 亚洲精品一区二区三区婷婷月 | 成人片黄网站色大片免费观看 | 一个人看的www免费视频在线观看 | 日韩亚洲欧美中文高清在线 | 久久综合给合久久狠狠狠97色 | 国产真实夫妇视频 | 色狠狠av一区二区三区 | 亚洲精品久久久久久一区二区 | 动漫av网站免费观看 | 成人免费视频视频在线观看 免费 | 亚洲大尺度无码无码专区 | 中国女人内谢69xxxxxa片 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 国产日产欧产精品精品app | 伊在人天堂亚洲香蕉精品区 | 亚洲综合精品香蕉久久网 | 成人无码视频免费播放 | 色婷婷香蕉在线一区二区 | 免费视频欧美无人区码 | 18禁止看的免费污网站 | 精品一区二区三区无码免费视频 | 丰腴饱满的极品熟妇 | 国产成人精品三级麻豆 | 曰本女人与公拘交酡免费视频 | 在线精品国产一区二区三区 | 18精品久久久无码午夜福利 | 久久亚洲中文字幕无码 | 黄网在线观看免费网站 | 曰韩少妇内射免费播放 | 亚洲人亚洲人成电影网站色 | 在线播放无码字幕亚洲 | 18精品久久久无码午夜福利 | 无码播放一区二区三区 | 欧美人与善在线com | 精品无码av一区二区三区 | 性开放的女人aaa片 | 无码av最新清无码专区吞精 | 国产精品久久国产精品99 | 国产成人精品优优av | 中文字幕人妻丝袜二区 | 九九综合va免费看 | 超碰97人人做人人爱少妇 | 欧美成人午夜精品久久久 | 中文字幕久久久久人妻 | 精品人人妻人人澡人人爽人人 | 粗大的内捧猛烈进出视频 | 中文字幕日产无线码一区 | 亚洲国产综合无码一区 | 东京无码熟妇人妻av在线网址 | 亚洲日韩一区二区三区 | 300部国产真实乱 | 67194成是人免费无码 | 亚洲精品国产精品乱码不卡 | 欧美日韩在线亚洲综合国产人 | 天堂久久天堂av色综合 | 99久久婷婷国产综合精品青草免费 | 欧美 丝袜 自拍 制服 另类 | 小sao货水好多真紧h无码视频 | 亚洲の无码国产の无码影院 | 亚洲 欧美 激情 小说 另类 | 免费无码午夜福利片69 | 亚洲精品中文字幕 | 中文字幕人成乱码熟女app | 久久人人爽人人爽人人片av高清 | 亚洲日韩中文字幕在线播放 | 青青青手机频在线观看 | 精品久久久久久人妻无码中文字幕 | 欧美人与禽猛交狂配 | 久久精品人妻少妇一区二区三区 | 又大又黄又粗又爽的免费视频 | 日本熟妇人妻xxxxx人hd | 亚洲人交乣女bbw | 无码成人精品区在线观看 | 日本一区二区更新不卡 | 久在线观看福利视频 | 国产福利视频一区二区 | 亚洲日韩av片在线观看 | 国产午夜福利100集发布 | 亚洲国产精品无码一区二区三区 | 乱人伦人妻中文字幕无码 | 久久午夜夜伦鲁鲁片无码免费 | 高中生自慰www网站 | 狂野欧美激情性xxxx | 欧美 亚洲 国产 另类 | 国产麻豆精品一区二区三区v视界 | 国产精品久久久久7777 | 狂野欧美性猛xxxx乱大交 | 亚洲成色www久久网站 | 黑人巨大精品欧美一区二区 | 青草青草久热国产精品 | 天堂亚洲免费视频 | www国产精品内射老师 | 国产欧美精品一区二区三区 | 牲欲强的熟妇农村老妇女视频 | 日本一本二本三区免费 | 天下第一社区视频www日本 | 日韩欧美群交p片內射中文 | 蜜臀av在线播放 久久综合激激的五月天 | 国内精品人妻无码久久久影院蜜桃 | 精品偷自拍另类在线观看 | 天干天干啦夜天干天2017 | 1000部夫妻午夜免费 | 欧美老熟妇乱xxxxx | 国内揄拍国内精品少妇国语 | 99久久婷婷国产综合精品青草免费 | 国产三级精品三级男人的天堂 | 亚洲爆乳大丰满无码专区 | 成人一区二区免费视频 | 乱码av麻豆丝袜熟女系列 | 无码一区二区三区在线观看 | 中文无码伦av中文字幕 | 丰腴饱满的极品熟妇 | 18黄暴禁片在线观看 | 色综合久久久久综合一本到桃花网 | 亚洲精品国产第一综合99久久 | 无码人妻出轨黑人中文字幕 | 成人av无码一区二区三区 | 成人影院yy111111在线观看 | 亚洲七七久久桃花影院 | 免费视频欧美无人区码 | 大肉大捧一进一出好爽视频 | 午夜嘿嘿嘿影院 | 亚洲精品一区二区三区大桥未久 | 99久久久无码国产aaa精品 | 最新国产麻豆aⅴ精品无码 | 亚洲中文字幕在线观看 | 乱人伦人妻中文字幕无码久久网 | 欧美兽交xxxx×视频 | 成人女人看片免费视频放人 | 国产真人无遮挡作爱免费视频 | 熟女体下毛毛黑森林 | 午夜丰满少妇性开放视频 | 精品一区二区不卡无码av | 成人亚洲精品久久久久软件 | 亚洲 a v无 码免 费 成 人 a v | 国产片av国语在线观看 | 欧美黑人巨大xxxxx | 美女扒开屁股让男人桶 | 狠狠色丁香久久婷婷综合五月 | 少妇无码吹潮 | 亚洲熟妇色xxxxx亚洲 | 精品无码成人片一区二区98 | 在线播放亚洲第一字幕 | 18黄暴禁片在线观看 | 国产激情无码一区二区 | 欧美日韩久久久精品a片 | 成人无码视频在线观看网站 | 国产免费久久久久久无码 | 国产美女精品一区二区三区 | 中文字幕无码免费久久99 | 久久久久国色av免费观看性色 | 日本va欧美va欧美va精品 | 日本饥渴人妻欲求不满 | 国产精品丝袜黑色高跟鞋 | 无码人妻久久一区二区三区不卡 | 牲交欧美兽交欧美 | 国产精品嫩草久久久久 | 亚洲欧洲日本无在线码 | 亚洲国产精品久久久久久 | 国产一精品一av一免费 | 亚洲欧洲无卡二区视頻 | 亚洲 a v无 码免 费 成 人 a v | 领导边摸边吃奶边做爽在线观看 | 国产色视频一区二区三区 | 日日碰狠狠丁香久燥 | 麻豆果冻传媒2021精品传媒一区下载 | 成人欧美一区二区三区黑人免费 | 丰满少妇弄高潮了www | 好男人www社区 | 国产xxx69麻豆国语对白 | 亚洲理论电影在线观看 | 国产电影无码午夜在线播放 | 爆乳一区二区三区无码 | 欧美变态另类xxxx | 人人澡人人透人人爽 | 网友自拍区视频精品 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 精品无码国产自产拍在线观看蜜 | 国产精品香蕉在线观看 | 成人aaa片一区国产精品 | 亚洲欧洲无卡二区视頻 | 一本久久a久久精品vr综合 | 少妇性l交大片欧洲热妇乱xxx | 午夜福利试看120秒体验区 | 久久综合网欧美色妞网 | 国产亲子乱弄免费视频 | 精品乱码久久久久久久 | 久久久久久亚洲精品a片成人 | 中文字幕 亚洲精品 第1页 | 亚洲爆乳大丰满无码专区 | 国产真实夫妇视频 | 久久综合九色综合97网 | a片在线免费观看 | 色婷婷香蕉在线一区二区 | 丰满少妇女裸体bbw | 久久精品国产99久久6动漫 | 中文毛片无遮挡高清免费 | 色一情一乱一伦一视频免费看 | 3d动漫精品啪啪一区二区中 | 国产免费久久精品国产传媒 | 国产一区二区三区日韩精品 | 久久久久久国产精品无码下载 | 又黄又爽又色的视频 | 好屌草这里只有精品 | 精品人妻中文字幕有码在线 | 亚洲乱亚洲乱妇50p | 在线а√天堂中文官网 | 中文字幕人成乱码熟女app | 成人无码视频免费播放 | 六十路熟妇乱子伦 | 中文字幕无码热在线视频 | 亚洲色www成人永久网址 | 国产成人精品必看 | 又紧又大又爽精品一区二区 | 蜜桃臀无码内射一区二区三区 | 久久99精品国产麻豆蜜芽 | a片在线免费观看 | 狠狠色丁香久久婷婷综合五月 | 99久久无码一区人妻 | 精品亚洲成av人在线观看 | 亚洲熟女一区二区三区 | 内射后入在线观看一区 | 扒开双腿疯狂进出爽爽爽视频 | 国产精品亚洲lv粉色 | 亚洲精品一区二区三区大桥未久 | 精品久久久无码人妻字幂 | 日本一卡2卡3卡四卡精品网站 | 久久国产36精品色熟妇 | 狠狠躁日日躁夜夜躁2020 | 亚洲精品一区二区三区婷婷月 | 亚洲精品一区二区三区在线观看 | 麻花豆传媒剧国产免费mv在线 | 亚洲熟悉妇女xxx妇女av | 99久久久无码国产精品免费 | 国产成人精品视频ⅴa片软件竹菊 | 少妇人妻大乳在线视频 | 精品久久久无码中文字幕 | 女人被男人爽到呻吟的视频 | 日日麻批免费40分钟无码 | 欧美午夜特黄aaaaaa片 | 亚洲区小说区激情区图片区 | 无码精品人妻一区二区三区av | 日本丰满护士爆乳xxxx | 色噜噜亚洲男人的天堂 | 国产69精品久久久久app下载 | 国产免费久久精品国产传媒 | 高潮毛片无遮挡高清免费视频 | 日产精品高潮呻吟av久久 | 人妻夜夜爽天天爽三区 | 美女黄网站人色视频免费国产 | 国产精品久久久久久亚洲影视内衣 | 日本熟妇乱子伦xxxx | 日本精品人妻无码77777 天堂一区人妻无码 | 亚洲精品一区二区三区在线观看 | 人妻少妇精品无码专区二区 | 久久99精品国产.久久久久 | 亚洲午夜福利在线观看 | 少妇太爽了在线观看 | 日本va欧美va欧美va精品 | 人人妻人人澡人人爽欧美一区九九 | 无码人妻丰满熟妇区五十路百度 | 国产绳艺sm调教室论坛 | 97夜夜澡人人爽人人喊中国片 | 亲嘴扒胸摸屁股激烈网站 | 国产成人一区二区三区在线观看 | 亚洲の无码国产の无码影院 | 午夜精品一区二区三区的区别 | 最新国产麻豆aⅴ精品无码 | 中文无码精品a∨在线观看不卡 | 内射白嫩少妇超碰 | 大肉大捧一进一出视频出来呀 | 乱人伦中文视频在线观看 | 亚欧洲精品在线视频免费观看 | 少妇性l交大片欧洲热妇乱xxx | 国产婷婷色一区二区三区在线 | 无码av中文字幕免费放 | 乌克兰少妇性做爰 | 狂野欧美性猛xxxx乱大交 | 国产激情综合五月久久 | 亚洲精品一区二区三区四区五区 | 亚洲码国产精品高潮在线 | 久久亚洲中文字幕无码 | 国产色精品久久人妻 | 国产成人无码区免费内射一片色欲 | 国产亚洲精品久久久久久久 | 噜噜噜亚洲色成人网站 | 国产真实乱对白精彩久久 | 欧美性黑人极品hd | 欧美黑人性暴力猛交喷水 | av无码久久久久不卡免费网站 | 波多野42部无码喷潮在线 | 无码乱肉视频免费大全合集 | 亚洲精品一区二区三区在线 | 蜜桃无码一区二区三区 | 国产三级久久久精品麻豆三级 | 狠狠躁日日躁夜夜躁2020 | 欧美丰满熟妇xxxx | 欧美丰满老熟妇xxxxx性 | 亚洲熟妇自偷自拍另类 | 欧美精品在线观看 | 亚洲色偷偷男人的天堂 | 无码精品人妻一区二区三区av | 中文字幕无线码 | 久久久久国色av免费观看性色 | 久久国产精品_国产精品 | 噜噜噜亚洲色成人网站 | 无码国模国产在线观看 | 久久国产劲爆∧v内射 | 领导边摸边吃奶边做爽在线观看 | 两性色午夜视频免费播放 | 亚洲大尺度无码无码专区 | 国产在线无码精品电影网 | 亚洲一区二区三区含羞草 | 国产精品亚洲а∨无码播放麻豆 | 欧美喷潮久久久xxxxx | 日日摸天天摸爽爽狠狠97 | 99精品视频在线观看免费 | 天堂а√在线中文在线 | 日韩欧美中文字幕在线三区 | 欧美35页视频在线观看 | 少妇一晚三次一区二区三区 | 久久熟妇人妻午夜寂寞影院 | 18禁黄网站男男禁片免费观看 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 麻豆人妻少妇精品无码专区 | 久久久久亚洲精品男人的天堂 | 亚洲色大成网站www | 国产精品第一区揄拍无码 | 曰韩无码二三区中文字幕 | 青青草原综合久久大伊人精品 | 东京热无码av男人的天堂 | 色综合久久88色综合天天 | 亚洲人成网站在线播放942 | 亚洲成av人片在线观看无码不卡 | 成人精品一区二区三区中文字幕 | 熟女少妇在线视频播放 | 亚洲精品久久久久中文第一幕 | 在线成人www免费观看视频 | 少妇无码av无码专区在线观看 | 国产精品无码久久av | 国产av无码专区亚洲a∨毛片 | а√天堂www在线天堂小说 | 永久免费观看国产裸体美女 | 日本高清一区免费中文视频 | 亚洲色大成网站www国产 | 欧美人与禽猛交狂配 | 久久国产精品偷任你爽任你 | 人妻少妇精品久久 | 久久亚洲中文字幕精品一区 | 男人的天堂2018无码 | 丰满人妻被黑人猛烈进入 | 久久www免费人成人片 | 国产午夜亚洲精品不卡下载 | 日韩欧美群交p片內射中文 | 99久久99久久免费精品蜜桃 | 国产国语老龄妇女a片 | 精品 日韩 国产 欧美 视频 | 人妻中文无码久热丝袜 | 一本无码人妻在中文字幕免费 | 窝窝午夜理论片影院 | 免费看男女做好爽好硬视频 | 欧美人与禽zoz0性伦交 | 真人与拘做受免费视频 | √8天堂资源地址中文在线 | 97夜夜澡人人双人人人喊 | 99久久无码一区人妻 | 精品国产一区二区三区四区 | 亚洲 高清 成人 动漫 | 18禁止看的免费污网站 | 亚洲日韩av一区二区三区四区 | 亚洲国产精品一区二区第一页 | 在线播放亚洲第一字幕 | 国产精品久久久久7777 | 精品国产一区二区三区av 性色 | 国产9 9在线 | 中文 | 97色伦图片97综合影院 | 亚洲人成人无码网www国产 | 一本精品99久久精品77 | 在线观看免费人成视频 | 少妇高潮一区二区三区99 | 久久国产精品萌白酱免费 | ass日本丰满熟妇pics | 国内老熟妇对白xxxxhd | 日本精品人妻无码免费大全 | 国产女主播喷水视频在线观看 | 国产精品毛片一区二区 | 美女扒开屁股让男人桶 | 欧美三级不卡在线观看 | 国产超级va在线观看视频 | 国产亚洲欧美在线专区 | 天堂а√在线地址中文在线 | 精品欧美一区二区三区久久久 | 自拍偷自拍亚洲精品被多人伦好爽 | а√天堂www在线天堂小说 | 日日橹狠狠爱欧美视频 | 男人的天堂2018无码 | 国产成人无码午夜视频在线观看 | 亚洲国产精品无码一区二区三区 | 老熟妇乱子伦牲交视频 | 国产特级毛片aaaaaa高潮流水 | 国产在热线精品视频 | 国产又粗又硬又大爽黄老大爷视 | 亚洲国产精品一区二区第一页 | 中文字幕久久久久人妻 | 动漫av一区二区在线观看 | 免费网站看v片在线18禁无码 | 亚洲精品欧美二区三区中文字幕 | 免费播放一区二区三区 | 免费无码一区二区三区蜜桃大 | 少妇人妻av毛片在线看 | 国产精品免费大片 | 亚洲阿v天堂在线 | 美女黄网站人色视频免费国产 | 少妇无码吹潮 | 亚洲 另类 在线 欧美 制服 | 亚洲色www成人永久网址 | 欧美性猛交xxxx富婆 | 在线播放免费人成毛片乱码 | 亚洲欧美日韩国产精品一区二区 | 欧洲vodafone精品性 | 日韩精品成人一区二区三区 | 丰腴饱满的极品熟妇 | 18精品久久久无码午夜福利 | 人妻夜夜爽天天爽三区 | 任你躁国产自任一区二区三区 | 亲嘴扒胸摸屁股激烈网站 | 国产成人无码区免费内射一片色欲 | 亚洲无人区一区二区三区 | 国产精品久久久久久亚洲影视内衣 | 成年美女黄网站色大免费视频 | 亚洲小说春色综合另类 | 国产精品久久久久无码av色戒 | 无码福利日韩神码福利片 | 亚洲七七久久桃花影院 | 精品午夜福利在线观看 | 精品成人av一区二区三区 | 国产亚洲欧美日韩亚洲中文色 | 特黄特色大片免费播放器图片 | 亚洲人成人无码网www国产 | 亚洲精品国偷拍自产在线观看蜜桃 | 18禁黄网站男男禁片免费观看 | 丰满肥臀大屁股熟妇激情视频 | 亚洲国产欧美国产综合一区 | 人人超人人超碰超国产 | 亚拍精品一区二区三区探花 | 国产一区二区三区精品视频 | 亚洲熟悉妇女xxx妇女av | 久久久久99精品国产片 | 在线视频网站www色 | 亚洲 日韩 欧美 成人 在线观看 | 黑人巨大精品欧美黑寡妇 | 性生交大片免费看女人按摩摩 | 97人妻精品一区二区三区 | 久久久久人妻一区精品色欧美 | 呦交小u女精品视频 | 99久久人妻精品免费一区 | 亚洲人成影院在线无码按摩店 | 欧洲精品码一区二区三区免费看 | 天堂а√在线中文在线 | 国产黄在线观看免费观看不卡 | 九一九色国产 | 天天躁日日躁狠狠躁免费麻豆 | 欧美成人免费全部网站 | 性色av无码免费一区二区三区 | 在线 国产 欧美 亚洲 天堂 | 特大黑人娇小亚洲女 | 2020久久香蕉国产线看观看 | 男女超爽视频免费播放 | 中文无码成人免费视频在线观看 | 久久久久久久久蜜桃 | 午夜理论片yy44880影院 | 日本护士xxxxhd少妇 | 欧美成人午夜精品久久久 | 激情内射亚州一区二区三区爱妻 | 少妇人妻av毛片在线看 | 久久久久久亚洲精品a片成人 | 精品aⅴ一区二区三区 | 黑人巨大精品欧美一区二区 | 午夜精品一区二区三区的区别 | 久久综合九色综合欧美狠狠 | 精品亚洲成av人在线观看 | 日本一区二区三区免费高清 | 久久精品成人欧美大片 | 国产无遮挡又黄又爽免费视频 | 国产偷国产偷精品高清尤物 | 亚洲人成影院在线观看 | 日韩av激情在线观看 | 欧美老人巨大xxxx做受 | 99久久人妻精品免费二区 | 伊人久久婷婷五月综合97色 | 啦啦啦www在线观看免费视频 | 日日鲁鲁鲁夜夜爽爽狠狠 | 双乳奶水饱满少妇呻吟 | 伊人久久大香线焦av综合影院 | 久精品国产欧美亚洲色aⅴ大片 | 久久人人爽人人爽人人片ⅴ | 国内精品久久毛片一区二区 | 福利一区二区三区视频在线观看 | 亚洲欧美色中文字幕在线 | 99久久99久久免费精品蜜桃 | 高潮喷水的毛片 | 亚洲国产欧美国产综合一区 | 水蜜桃亚洲一二三四在线 | 97se亚洲精品一区 | 成人性做爰aaa片免费看不忠 | 国产香蕉尹人综合在线观看 | 免费国产成人高清在线观看网站 | 精品无人区无码乱码毛片国产 | 国产亚洲视频中文字幕97精品 | 国产情侣作爱视频免费观看 | 国产99久久精品一区二区 | 国产69精品久久久久app下载 | 亚洲精品一区二区三区在线观看 | 国产亚洲视频中文字幕97精品 | 在线精品国产一区二区三区 | 日韩亚洲欧美中文高清在线 | 国产精品久久久久久亚洲影视内衣 | 国产精品久久久久无码av色戒 | 成人精品天堂一区二区三区 | 国产成人无码av一区二区 | 久久精品国产99精品亚洲 | 欧美日韩人成综合在线播放 | 欧美人与善在线com | 国产无遮挡又黄又爽免费视频 | 无码人妻少妇伦在线电影 | 国语精品一区二区三区 | 日韩少妇白浆无码系列 | 装睡被陌生人摸出水好爽 | 亚洲一区二区三区偷拍女厕 | а√资源新版在线天堂 | 成人女人看片免费视频放人 | 无码任你躁久久久久久久 | 97色伦图片97综合影院 | 精品熟女少妇av免费观看 | 麻豆精品国产精华精华液好用吗 | 精品欧美一区二区三区久久久 | 久久久久人妻一区精品色欧美 | 无套内射视频囯产 | 午夜福利一区二区三区在线观看 | 国产亚洲精品久久久久久久久动漫 | 丰满人妻被黑人猛烈进入 | 精品人妻人人做人人爽夜夜爽 | 丝袜足控一区二区三区 | 精品无码国产自产拍在线观看蜜 | 性生交片免费无码看人 | 男人的天堂2018无码 | 强伦人妻一区二区三区视频18 | 亚洲精品一区二区三区四区五区 | 人人妻人人澡人人爽精品欧美 | 午夜福利一区二区三区在线观看 | 久久精品国产99久久6动漫 | 青青草原综合久久大伊人精品 | 亚洲日本va午夜在线电影 | 精品偷自拍另类在线观看 | 色综合天天综合狠狠爱 | 成人免费无码大片a毛片 | 国产人成高清在线视频99最全资源 | 狠狠色色综合网站 | 国产一区二区三区四区五区加勒比 | 日本成熟视频免费视频 | 精品国产精品久久一区免费式 | 18精品久久久无码午夜福利 | 国产一区二区三区影院 | 麻豆国产人妻欲求不满 | 亚洲欧美精品伊人久久 | 亚洲精品一区二区三区婷婷月 | 亚欧洲精品在线视频免费观看 | 午夜福利不卡在线视频 | 国产人成高清在线视频99最全资源 | 国产精品无码mv在线观看 | 欧美xxxx黑人又粗又长 | 久久国产自偷自偷免费一区调 | 国产人妻大战黑人第1集 | 无码精品人妻一区二区三区av | 国产精品久久久久久亚洲毛片 | 亚洲热妇无码av在线播放 | 国产精品美女久久久网av | 国产精品第一国产精品 | 亚洲成av人综合在线观看 | 99精品视频在线观看免费 | 激情内射亚州一区二区三区爱妻 | 日本熟妇人妻xxxxx人hd | 曰本女人与公拘交酡免费视频 | 中文字幕乱码人妻无码久久 | 亚洲一区二区三区香蕉 | 国产精华av午夜在线观看 | 亚洲午夜福利在线观看 | 亚洲中文字幕无码一久久区 | 免费播放一区二区三区 | 国产亚洲精品久久久久久 | 亚洲乱亚洲乱妇50p | 乱码av麻豆丝袜熟女系列 | 久久久精品欧美一区二区免费 | 亚洲性无码av中文字幕 | 18禁黄网站男男禁片免费观看 | 精品国产麻豆免费人成网站 | 国产午夜福利100集发布 | 色五月五月丁香亚洲综合网 | 人妻互换免费中文字幕 | 在线观看欧美一区二区三区 | 成人无码视频免费播放 | 女人被男人躁得好爽免费视频 | 亚洲日韩中文字幕在线播放 | 国产午夜视频在线观看 | 三上悠亚人妻中文字幕在线 | 亚洲精品一区二区三区四区五区 | 牲欲强的熟妇农村老妇女视频 | av香港经典三级级 在线 | 精品欧美一区二区三区久久久 | 天堂亚洲2017在线观看 | 亚洲欧美日韩国产精品一区二区 | 综合激情五月综合激情五月激情1 | 98国产精品综合一区二区三区 | 内射爽无广熟女亚洲 | 97se亚洲精品一区 | 国产精品久久久久影院嫩草 | 中国大陆精品视频xxxx | 国产麻豆精品一区二区三区v视界 | 欧美人与禽zoz0性伦交 | 日本一卡二卡不卡视频查询 | 免费中文字幕日韩欧美 | 国产精品高潮呻吟av久久 | 白嫩日本少妇做爰 | 亚洲成a人一区二区三区 | 狠狠cao日日穞夜夜穞av | 亚洲中文无码av永久不收费 | 亚洲日本一区二区三区在线 | 国产精品va在线播放 | 精品国产一区二区三区四区 | 亚洲精品一区二区三区大桥未久 | 97人妻精品一区二区三区 | 国产人妖乱国产精品人妖 | 免费无码肉片在线观看 | 亚洲无人区一区二区三区 | 亚洲狠狠色丁香婷婷综合 | 亚洲一区二区三区 | 日韩无套无码精品 | 亚洲综合无码久久精品综合 | аⅴ资源天堂资源库在线 | 亚洲天堂2017无码 | 国产精品高潮呻吟av久久 | 激情五月综合色婷婷一区二区 | 欧美大屁股xxxxhd黑色 | 内射白嫩少妇超碰 | 国内揄拍国内精品人妻 | 色一情一乱一伦一区二区三欧美 | 秋霞特色aa大片 | 欧美日韩精品 | 免费国产黄网站在线观看 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 久久久久久a亚洲欧洲av冫 | 精品无人区无码乱码毛片国产 | 漂亮人妻洗澡被公强 日日躁 | 四虎影视成人永久免费观看视频 | 俺去俺来也www色官网 | 国产人妻人伦精品1国产丝袜 | 小sao货水好多真紧h无码视频 | 永久免费精品精品永久-夜色 | 国产熟妇另类久久久久 | 中文毛片无遮挡高清免费 | 日韩精品无码一区二区中文字幕 | 久久国产36精品色熟妇 | 国产成人综合美国十次 | 亚洲国产精品无码一区二区三区 | 久久亚洲中文字幕精品一区 | 国产人妖乱国产精品人妖 | 99国产精品白浆在线观看免费 | 国产精品怡红院永久免费 | 一本久道久久综合狠狠爱 | 国产卡一卡二卡三 | 人妻无码αv中文字幕久久琪琪布 | 伊人久久大香线蕉亚洲 | 麻豆国产97在线 | 欧洲 | 精品厕所偷拍各类美女tp嘘嘘 | 中文久久乱码一区二区 | 亚洲熟妇色xxxxx亚洲 | 水蜜桃色314在线观看 | 日日天日日夜日日摸 | 女高中生第一次破苞av | 精品欧洲av无码一区二区三区 | 在线 国产 欧美 亚洲 天堂 | 亚洲熟熟妇xxxx | 无码免费一区二区三区 | 亚洲欧美精品伊人久久 | 国产精品美女久久久 | 国产成人精品必看 | 欧美日韩在线亚洲综合国产人 | 无码人妻精品一区二区三区不卡 | 黑人大群体交免费视频 | 国产美女精品一区二区三区 | 丰满人妻一区二区三区免费视频 | 亚洲人成影院在线无码按摩店 | 国产成人综合在线女婷五月99播放 | 国产人妻精品一区二区三区 | 3d动漫精品啪啪一区二区中 | 国产香蕉97碰碰久久人人 | 内射巨臀欧美在线视频 | 狠狠色丁香久久婷婷综合五月 | 真人与拘做受免费视频一 | 日本护士毛茸茸高潮 | 动漫av一区二区在线观看 | 亚拍精品一区二区三区探花 | 麻豆国产人妻欲求不满谁演的 | 久久综合九色综合97网 | 性欧美牲交xxxxx视频 | 国内少妇偷人精品视频 | 久久99精品国产麻豆蜜芽 | 国产精品久久久一区二区三区 | 亚洲成av人片天堂网无码】 | 亚洲男人av天堂午夜在 | 久久精品人人做人人综合 | 亚洲熟悉妇女xxx妇女av | 久久99热只有频精品8 | 综合激情五月综合激情五月激情1 | 人妻少妇精品无码专区动漫 | 成人亚洲精品久久久久软件 | 亚洲色在线无码国产精品不卡 | 亚洲另类伦春色综合小说 | 国产另类ts人妖一区二区 | 成 人 网 站国产免费观看 | 高清不卡一区二区三区 | 免费国产成人高清在线观看网站 | 成 人 免费观看网站 | 日日麻批免费40分钟无码 | 老头边吃奶边弄进去呻吟 | 漂亮人妻洗澡被公强 日日躁 | 无码任你躁久久久久久久 | 欧美日本免费一区二区三区 | 中文字幕日韩精品一区二区三区 | 国产又粗又硬又大爽黄老大爷视 | 丰满妇女强制高潮18xxxx | 5858s亚洲色大成网站www | 亚洲爆乳精品无码一区二区三区 | 中文字幕av无码一区二区三区电影 | 欧美freesex黑人又粗又大 | 免费国产成人高清在线观看网站 | 狠狠色噜噜狠狠狠狠7777米奇 | 麻豆国产人妻欲求不满谁演的 | 国产极品视觉盛宴 | 久久久久免费看成人影片 | 无码精品国产va在线观看dvd | 荫蒂被男人添的好舒服爽免费视频 | 清纯唯美经典一区二区 | 97久久国产亚洲精品超碰热 | 露脸叫床粗话东北少妇 | 捆绑白丝粉色jk震动捧喷白浆 | 男女下面进入的视频免费午夜 | 无码毛片视频一区二区本码 | 国产精品毛多多水多 | 熟妇人妻中文av无码 | 国语精品一区二区三区 | 内射老妇bbwx0c0ck | 成人无码视频免费播放 | 自拍偷自拍亚洲精品10p | 国产精品亚洲lv粉色 | 国产女主播喷水视频在线观看 | 99久久精品午夜一区二区 | 国产人妻精品一区二区三区不卡 | 在线天堂新版最新版在线8 | 露脸叫床粗话东北少妇 | 婷婷丁香五月天综合东京热 | 99久久久国产精品无码免费 | 99久久久无码国产aaa精品 | 日韩av无码一区二区三区不卡 | 久久久婷婷五月亚洲97号色 | 国产精品人妻一区二区三区四 | 日韩人妻无码一区二区三区久久99 | 麻豆人妻少妇精品无码专区 | 婷婷综合久久中文字幕蜜桃三电影 | 少妇激情av一区二区 | 亚洲精品欧美二区三区中文字幕 | 亚洲欧美日韩成人高清在线一区 | 正在播放老肥熟妇露脸 | 国产精品亚洲а∨无码播放麻豆 | 成人无码精品1区2区3区免费看 | 无码人妻少妇伦在线电影 | 99麻豆久久久国产精品免费 | 精品人妻人人做人人爽夜夜爽 | 久久久久亚洲精品中文字幕 | 夜夜躁日日躁狠狠久久av | 日本一卡2卡3卡四卡精品网站 | 性欧美疯狂xxxxbbbb | 精品国产成人一区二区三区 | 亚洲熟悉妇女xxx妇女av | 国产高潮视频在线观看 | 伊人久久大香线蕉av一区二区 | 免费国产黄网站在线观看 | 久久人人爽人人爽人人片av高清 | 亚洲欧美精品aaaaaa片 | 亚洲精品国偷拍自产在线观看蜜桃 | 国产精品久久久一区二区三区 | 亚洲日韩av片在线观看 | 在线a亚洲视频播放在线观看 | 波多野结衣av一区二区全免费观看 | 亚洲人亚洲人成电影网站色 | 永久黄网站色视频免费直播 | 国产亚洲精品久久久久久久 | 99久久久无码国产aaa精品 | 久久久久亚洲精品中文字幕 | 性开放的女人aaa片 | 国产精品99爱免费视频 | 又大又紧又粉嫩18p少妇 | 少妇人妻偷人精品无码视频 | 国内精品人妻无码久久久影院 | 中国大陆精品视频xxxx | 377p欧洲日本亚洲大胆 | 欧美国产日产一区二区 | 欧美性生交xxxxx久久久 | 亚洲精品无码人妻无码 | 亚洲熟女一区二区三区 | 国产人妻精品一区二区三区不卡 | 青青青爽视频在线观看 | 天堂亚洲2017在线观看 | 麻豆国产人妻欲求不满谁演的 | 亚洲日韩中文字幕在线播放 | 国产精品va在线播放 | 久久成人a毛片免费观看网站 | 亚洲阿v天堂在线 | 久久精品国产一区二区三区 | 成人免费视频一区二区 | 久久亚洲中文字幕无码 | 亚洲成av人在线观看网址 | 少妇性俱乐部纵欲狂欢电影 | 无码帝国www无码专区色综合 | 中文字幕乱妇无码av在线 | 人人妻人人澡人人爽人人精品浪潮 | 亚洲а∨天堂久久精品2021 | 老熟女乱子伦 | 亚洲啪av永久无码精品放毛片 | 天堂а√在线地址中文在线 | 国产精品人妻一区二区三区四 | 红桃av一区二区三区在线无码av | 久久久久亚洲精品中文字幕 | 国产亚av手机在线观看 | 娇妻被黑人粗大高潮白浆 | 欧美精品一区二区精品久久 | 精品午夜福利在线观看 | 综合网日日天干夜夜久久 | 国产乱子伦视频在线播放 | 东京一本一道一二三区 | 人妻互换免费中文字幕 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 国产精品久久久一区二区三区 | 精品成人av一区二区三区 | 日本乱偷人妻中文字幕 | 国产黑色丝袜在线播放 | 国产成人综合在线女婷五月99播放 | 无码一区二区三区在线 | www国产精品内射老师 | 午夜无码人妻av大片色欲 | 亚洲色无码一区二区三区 | 免费观看的无遮挡av | 亚洲爆乳大丰满无码专区 | 精品久久久无码人妻字幂 | 又黄又爽又色的视频 | 精品偷自拍另类在线观看 | 久久久久成人精品免费播放动漫 | 国产明星裸体无码xxxx视频 | 精品厕所偷拍各类美女tp嘘嘘 | 久久久久免费看成人影片 | 纯爱无遮挡h肉动漫在线播放 | 国产婷婷色一区二区三区在线 | 精品成在人线av无码免费看 | 久久久久久九九精品久 | 国产精品人人爽人人做我的可爱 | 欧美怡红院免费全部视频 | 丰满岳乱妇在线观看中字无码 | 亚洲狠狠色丁香婷婷综合 | 无码av中文字幕免费放 | 真人与拘做受免费视频一 | 在线视频网站www色 | 丰满少妇女裸体bbw | 麻豆国产人妻欲求不满谁演的 | 欧美日韩一区二区三区自拍 | 亚洲精品www久久久 | 国产人妻人伦精品1国产丝袜 | 黄网在线观看免费网站 | 欧美成人家庭影院 | 免费观看激色视频网站 | 国产精品无码mv在线观看 | 亚洲日韩乱码中文无码蜜桃臀网站 | 欧美亚洲日韩国产人成在线播放 | 亚洲乱码日产精品bd | 欧美 日韩 人妻 高清 中文 | 成人欧美一区二区三区 | 国产人妻精品一区二区三区 | 色婷婷久久一区二区三区麻豆 | 两性色午夜免费视频 | 成人影院yy111111在线观看 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 国产精品毛多多水多 | 青青久在线视频免费观看 | 国产三级精品三级男人的天堂 | 国产性生大片免费观看性 | 久久99精品国产麻豆蜜芽 | 亚洲无人区午夜福利码高清完整版 | 久久久久亚洲精品中文字幕 | 伊人久久大香线焦av综合影院 | 天干天干啦夜天干天2017 | 无遮挡国产高潮视频免费观看 | 中文字幕+乱码+中文字幕一区 | 国产精品鲁鲁鲁 | 4hu四虎永久在线观看 | 97人妻精品一区二区三区 | 影音先锋中文字幕无码 | 欧洲极品少妇 | 四虎永久在线精品免费网址 | 精品人人妻人人澡人人爽人人 | 日产精品99久久久久久 | 成人女人看片免费视频放人 | 国产精品99爱免费视频 | 永久免费观看国产裸体美女 | 欧美性生交活xxxxxdddd | 人人妻人人澡人人爽欧美一区 | 国产亚洲精品久久久久久久 | 亚洲精品国产精品乱码视色 | 国产精品va在线观看无码 | 国产xxx69麻豆国语对白 | 人妻互换免费中文字幕 | 欧美精品一区二区精品久久 | 国产精品久久久久久久影院 | 成人无码视频免费播放 | 国产成人精品必看 | 久久亚洲精品中文字幕无男同 | 人人超人人超碰超国产 | 国产一区二区不卡老阿姨 | 色综合久久久久综合一本到桃花网 | 久久久亚洲欧洲日产国码αv | 大屁股大乳丰满人妻 | 午夜时刻免费入口 | 精品无人国产偷自产在线 | 欧美日韩一区二区免费视频 | 欧美肥老太牲交大战 | 久久无码专区国产精品s | 中文字幕无码免费久久99 | 无码av免费一区二区三区试看 | 88国产精品欧美一区二区三区 | 婷婷丁香六月激情综合啪 | 亚洲精品成人av在线 | 蜜臀aⅴ国产精品久久久国产老师 | 十八禁视频网站在线观看 | 激情内射日本一区二区三区 | 亚洲色无码一区二区三区 | 熟妇人妻无乱码中文字幕 | 欧美日韩人成综合在线播放 | 初尝人妻少妇中文字幕 | 国产精品无码成人午夜电影 | 国产国语老龄妇女a片 | 精品国产aⅴ无码一区二区 | 无码国产色欲xxxxx视频 | 久久精品成人欧美大片 | 亚洲国产日韩a在线播放 | 中文字幕日产无线码一区 | 精品国产一区二区三区四区在线看 | 无码中文字幕色专区 | 女人被男人躁得好爽免费视频 | 国产偷自视频区视频 | 九九综合va免费看 | 国产无遮挡又黄又爽免费视频 | 欧美35页视频在线观看 | 女人色极品影院 | 亚洲熟妇色xxxxx欧美老妇y | 亚洲中文字幕在线无码一区二区 | av小次郎收藏 | 国产香蕉尹人综合在线观看 | 日日摸天天摸爽爽狠狠97 | 又紧又大又爽精品一区二区 | 国产精品99久久精品爆乳 | 精品 日韩 国产 欧美 视频 | 蜜臀aⅴ国产精品久久久国产老师 | 国产凸凹视频一区二区 | 精品国产一区av天美传媒 | 日韩成人一区二区三区在线观看 | 国产97人人超碰caoprom | 久久综合九色综合97网 | 国产午夜无码精品免费看 | 无码av岛国片在线播放 | 国产成人精品无码播放 | 欧美一区二区三区视频在线观看 | 欧美日韩在线亚洲综合国产人 | 中文字幕亚洲情99在线 | 亚欧洲精品在线视频免费观看 | 成在人线av无码免观看麻豆 | 亚洲成a人片在线观看无码 | 狂野欧美性猛交免费视频 | 国产成人一区二区三区在线观看 | 中文字幕色婷婷在线视频 | 99久久精品日本一区二区免费 | 婷婷五月综合缴情在线视频 | 性生交片免费无码看人 | 亚洲国产精品美女久久久久 | 久久精品中文字幕大胸 | 精品无人区无码乱码毛片国产 | 四虎影视成人永久免费观看视频 | 51国偷自产一区二区三区 | 99国产精品白浆在线观看免费 | 欧美性色19p | 日韩少妇白浆无码系列 | 秋霞成人午夜鲁丝一区二区三区 | 中文字幕无线码免费人妻 | 欧美猛少妇色xxxxx | 丝袜足控一区二区三区 | 理论片87福利理论电影 | 精品久久久无码中文字幕 | 亚洲中文字幕va福利 | 久久亚洲精品成人无码 | 欧美一区二区三区 | 秋霞成人午夜鲁丝一区二区三区 | 久久久久亚洲精品中文字幕 | 日本大乳高潮视频在线观看 | 久久久国产一区二区三区 | 欧美国产日产一区二区 | 国产麻豆精品精东影业av网站 | 蜜桃臀无码内射一区二区三区 | 精品国产一区av天美传媒 | 99久久精品国产一区二区蜜芽 | 亚洲乱码日产精品bd | 久久久成人毛片无码 | 人人妻在人人 | 双乳奶水饱满少妇呻吟 | 天天躁日日躁狠狠躁免费麻豆 | 国产偷国产偷精品高清尤物 | 欧美性生交xxxxx久久久 | 我要看www免费看插插视频 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 日韩精品a片一区二区三区妖精 | 动漫av一区二区在线观看 | 国产成人综合色在线观看网站 | 爽爽影院免费观看 | 99国产精品白浆在线观看免费 | 丰满少妇高潮惨叫视频 | 精品人妻人人做人人爽夜夜爽 | 色情久久久av熟女人妻网站 | 国产熟女一区二区三区四区五区 | 欧美丰满熟妇xxxx性ppx人交 | 狂野欧美性猛xxxx乱大交 | 成人毛片一区二区 | 永久免费观看美女裸体的网站 | 天下第一社区视频www日本 | 丝袜人妻一区二区三区 | 精品水蜜桃久久久久久久 | 少妇的肉体aa片免费 | 精品成在人线av无码免费看 | 亚洲欧洲中文日韩av乱码 | 四虎影视成人永久免费观看视频 | 性色av无码免费一区二区三区 | 野外少妇愉情中文字幕 | 色窝窝无码一区二区三区色欲 | 亚洲精品国产精品乱码视色 | 亚洲欧美综合区丁香五月小说 | 久久精品国产99精品亚洲 | 国产精品久久久久久久9999 | 美女黄网站人色视频免费国产 | 久久久久成人片免费观看蜜芽 | 麻花豆传媒剧国产免费mv在线 | 亚洲熟妇色xxxxx欧美老妇y | 婷婷丁香六月激情综合啪 | 日韩无码专区 | 国产香蕉尹人综合在线观看 | 国产精品久久精品三级 | 日本护士xxxxhd少妇 | 免费人成在线视频无码 | 国产精品高潮呻吟av久久4虎 | 男女下面进入的视频免费午夜 | 中文字幕 人妻熟女 | 免费观看又污又黄的网站 | 色婷婷综合中文久久一本 | 宝宝好涨水快流出来免费视频 | 51国偷自产一区二区三区 | 欧美真人作爱免费视频 | 99久久精品日本一区二区免费 | 亚洲欧洲无卡二区视頻 | 欧美性生交活xxxxxdddd | 国产猛烈高潮尖叫视频免费 | 欧美刺激性大交 | 午夜免费福利小电影 | 国产激情艳情在线看视频 | 天堂а√在线中文在线 | 波多野结衣一区二区三区av免费 | 麻豆国产人妻欲求不满谁演的 | 色一情一乱一伦 | 久久精品国产大片免费观看 | 亚洲男人av香蕉爽爽爽爽 | 波多野42部无码喷潮在线 | 久久精品中文字幕大胸 | 亚洲啪av永久无码精品放毛片 | 天天躁日日躁狠狠躁免费麻豆 | 麻豆蜜桃av蜜臀av色欲av | 国产 浪潮av性色四虎 | 国精品人妻无码一区二区三区蜜柚 | 国产精品资源一区二区 | 亚洲综合无码一区二区三区 | 成人精品天堂一区二区三区 | 国产va免费精品观看 | 国产69精品久久久久app下载 | 中文毛片无遮挡高清免费 | 久久综合九色综合97网 | 日日天干夜夜狠狠爱 | 国产亚洲日韩欧美另类第八页 | 99re在线播放 | 精品一区二区三区无码免费视频 | 色噜噜亚洲男人的天堂 | 亚洲精品一区国产 | 久久午夜无码鲁丝片午夜精品 | 日日噜噜噜噜夜夜爽亚洲精品 | 亚洲va欧美va天堂v国产综合 | 真人与拘做受免费视频 | 青青青手机频在线观看 | 在线播放无码字幕亚洲 | 国产又粗又硬又大爽黄老大爷视 | 熟妇女人妻丰满少妇中文字幕 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 狂野欧美激情性xxxx | 人人妻人人澡人人爽欧美一区 | 日韩av无码中文无码电影 | 东京无码熟妇人妻av在线网址 | 中文字幕无码人妻少妇免费 | 国产欧美熟妇另类久久久 | 亚洲综合色区中文字幕 | 日韩av无码中文无码电影 | 亚洲综合精品香蕉久久网 | 小泽玛莉亚一区二区视频在线 | 无码人妻精品一区二区三区下载 | 国产莉萝无码av在线播放 | 亚洲精品久久久久久一区二区 | 国内老熟妇对白xxxxhd | 日本免费一区二区三区最新 | 亚洲欧洲日本无在线码 | 好男人www社区 | 国产成人一区二区三区别 | 国产精品亚洲五月天高清 | 亚洲欧美中文字幕5发布 | 国产无遮挡又黄又爽又色 | 国内老熟妇对白xxxxhd | 扒开双腿疯狂进出爽爽爽视频 | 黑人大群体交免费视频 | 日本乱人伦片中文三区 | 在线精品亚洲一区二区 | 亚洲欧美日韩国产精品一区二区 | 亚洲国产欧美在线成人 | 天堂亚洲免费视频 | 国产av无码专区亚洲awww | 国产亲子乱弄免费视频 | 久久 国产 尿 小便 嘘嘘 | 奇米影视7777久久精品人人爽 | 精品久久8x国产免费观看 | 激情内射亚州一区二区三区爱妻 | 亚洲精品美女久久久久久久 | 鲁一鲁av2019在线 | 国产黑色丝袜在线播放 | 亚洲成av人综合在线观看 | 俄罗斯老熟妇色xxxx | 亚洲小说春色综合另类 | 香蕉久久久久久av成人 | 2019nv天堂香蕉在线观看 | 人妻aⅴ无码一区二区三区 | 日欧一片内射va在线影院 | 亚洲精品www久久久 | 青草视频在线播放 | 国产精品沙发午睡系列 | 久久久久免费看成人影片 | 欧美乱妇无乱码大黄a片 | 一本色道久久综合亚洲精品不卡 | 在线欧美精品一区二区三区 | 少妇太爽了在线观看 | 亚洲色www成人永久网址 | 亚洲 另类 在线 欧美 制服 | 国产激情无码一区二区app | 国产在线一区二区三区四区五区 | 精品国产一区二区三区av 性色 | 欧美人与物videos另类 | 未满成年国产在线观看 | 人人妻人人澡人人爽欧美精品 | 亚洲精品国偷拍自产在线观看蜜桃 | 一本久道久久综合狠狠爱 | 牲交欧美兽交欧美 | 亚洲精品一区二区三区四区五区 | 色婷婷av一区二区三区之红樱桃 | 伊人久久大香线蕉亚洲 | 日本护士xxxxhd少妇 | 久久成人a毛片免费观看网站 | 国产精品99爱免费视频 | 欧美乱妇无乱码大黄a片 | 在线 国产 欧美 亚洲 天堂 | 人妻有码中文字幕在线 | 亚洲七七久久桃花影院 | 免费观看的无遮挡av | 成人影院yy111111在线观看 | 久久99精品国产麻豆蜜芽 | 国产无套粉嫩白浆在线 | 日韩精品无码一本二本三本色 | 最新国产麻豆aⅴ精品无码 | 亚洲国产综合无码一区 | 牲交欧美兽交欧美 | 免费观看又污又黄的网站 | 精品国产国产综合精品 | 综合激情五月综合激情五月激情1 | 中文字幕无码日韩专区 | 亚洲国产精品无码一区二区三区 | 骚片av蜜桃精品一区 | 荫蒂被男人添的好舒服爽免费视频 | 中国女人内谢69xxxxxa片 | 久久午夜无码鲁丝片秋霞 | 人妻无码久久精品人妻 | 日韩欧美中文字幕公布 | 性欧美videos高清精品 | 亚洲色偷偷偷综合网 | 亚洲va欧美va天堂v国产综合 | 久久久久国色av免费观看性色 | 玩弄人妻少妇500系列视频 | 最新国产乱人伦偷精品免费网站 | 久在线观看福利视频 | 色一情一乱一伦 | 蜜桃视频韩日免费播放 | 亚洲熟悉妇女xxx妇女av | 大胆欧美熟妇xx | 国产精品久久久午夜夜伦鲁鲁 | 欧洲欧美人成视频在线 | 亚洲性无码av中文字幕 | 久久久精品国产sm最大网站 | 欧美 亚洲 国产 另类 | 大肉大捧一进一出好爽视频 | 色诱久久久久综合网ywww | 草草网站影院白丝内射 | 亚洲精品中文字幕 | 爽爽影院免费观看 | 欧美阿v高清资源不卡在线播放 | 嫩b人妻精品一区二区三区 | 美女毛片一区二区三区四区 | 精品偷拍一区二区三区在线看 | 亚洲国产日韩a在线播放 | 国产农村乱对白刺激视频 | 妺妺窝人体色www在线小说 | 国产精品久久久久影院嫩草 | 亚洲精品一区二区三区四区五区 | 无码人妻丰满熟妇区毛片18 | 久久精品视频在线看15 | 日本一本二本三区免费 | 老熟妇乱子伦牲交视频 | 亚洲熟熟妇xxxx | 久久人人爽人人人人片 | 色综合久久中文娱乐网 | 特级做a爰片毛片免费69 | 亚洲成av人片天堂网无码】 | 成人性做爰aaa片免费看不忠 | 西西人体www44rt大胆高清 | 强开小婷嫩苞又嫩又紧视频 | 国产午夜无码精品免费看 | 久久久久成人精品免费播放动漫 | 色妞www精品免费视频 | 国产超级va在线观看视频 | 夜精品a片一区二区三区无码白浆 | 美女黄网站人色视频免费国产 | 色欲人妻aaaaaaa无码 | 又黄又爽又色的视频 | 国产一区二区三区影院 | 偷窥日本少妇撒尿chinese | 国产色xx群视频射精 | 未满小14洗澡无码视频网站 | 18无码粉嫩小泬无套在线观看 | 人人妻人人澡人人爽欧美一区 | 成人无码精品1区2区3区免费看 | 黑人粗大猛烈进出高潮视频 | 欧美zoozzooz性欧美 | 一本大道伊人av久久综合 | 97精品国产97久久久久久免费 | 中文精品久久久久人妻不卡 | 亚洲国产高清在线观看视频 | 久久久亚洲欧洲日产国码αv | 国产办公室秘书无码精品99 | 露脸叫床粗话东北少妇 | 清纯唯美经典一区二区 | 日日碰狠狠躁久久躁蜜桃 | 亚洲色成人中文字幕网站 | 婷婷六月久久综合丁香 | 无码国产色欲xxxxx视频 | 婷婷五月综合缴情在线视频 | 亚洲色大成网站www国产 | 亚洲国产欧美国产综合一区 | 51国偷自产一区二区三区 | 国产精品亚洲一区二区三区喷水 | 国产熟妇另类久久久久 | 无码精品国产va在线观看dvd | 久久99久久99精品中文字幕 | 最近中文2019字幕第二页 | 在教室伦流澡到高潮hnp视频 | 国产亚洲精品久久久久久久久动漫 | 狠狠综合久久久久综合网 | 国产电影无码午夜在线播放 | 超碰97人人射妻 | 搡女人真爽免费视频大全 | 少妇性荡欲午夜性开放视频剧场 | 国产国产精品人在线视 | 国产人妻精品一区二区三区 | 精品无码一区二区三区的天堂 | 香蕉久久久久久av成人 | 少妇无码一区二区二三区 | 装睡被陌生人摸出水好爽 | 人人超人人超碰超国产 | 九九热爱视频精品 | 久久婷婷五月综合色国产香蕉 | 久久久成人毛片无码 | 麻豆md0077饥渴少妇 | 狠狠色噜噜狠狠狠7777奇米 | 久久国产自偷自偷免费一区调 | 激情综合激情五月俺也去 | 377p欧洲日本亚洲大胆 | 一本久久a久久精品vr综合 | 中文字幕无码热在线视频 | 国产香蕉97碰碰久久人人 | 亚洲七七久久桃花影院 | 麻豆国产丝袜白领秘书在线观看 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 成人无码视频在线观看网站 | 人妻熟女一区 | 国产精品无码永久免费888 | 中文字幕人妻无码一夲道 | 无套内谢的新婚少妇国语播放 | aⅴ亚洲 日韩 色 图网站 播放 | 全黄性性激高免费视频 | 漂亮人妻洗澡被公强 日日躁 | 国产亚洲精品精品国产亚洲综合 | 大地资源网第二页免费观看 | 国产av无码专区亚洲awww | 国产av一区二区精品久久凹凸 | 人妻尝试又大又粗久久 | 最新国产麻豆aⅴ精品无码 | 亚洲一区av无码专区在线观看 | 天下第一社区视频www日本 | 狂野欧美激情性xxxx | 国产精品久久久久久久9999 | 日韩视频 中文字幕 视频一区 | 人妻尝试又大又粗久久 | 国产精品手机免费 | 我要看www免费看插插视频 | 麻豆蜜桃av蜜臀av色欲av | 一本色道久久综合狠狠躁 | 久久亚洲a片com人成 | 午夜熟女插插xx免费视频 | 亚洲伊人久久精品影院 | 国产成人综合在线女婷五月99播放 | 日韩在线不卡免费视频一区 | 国产欧美精品一区二区三区 | 少妇无码av无码专区在线观看 | 图片区 小说区 区 亚洲五月 | 成人一在线视频日韩国产 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 久久国产精品萌白酱免费 | 在线视频网站www色 | 巨爆乳无码视频在线观看 | 亚洲成av人片天堂网无码】 | 丝袜美腿亚洲一区二区 | 巨爆乳无码视频在线观看 | 中文字幕无码av激情不卡 | 人人妻人人澡人人爽欧美一区九九 | 欧美野外疯狂做受xxxx高潮 | 成人试看120秒体验区 | 亚洲欧美中文字幕5发布 | 久久精品国产一区二区三区肥胖 | 国产亚洲精品久久久久久 | 中文字幕人妻丝袜二区 | 玩弄人妻少妇500系列视频 | 一本大道久久东京热无码av | 无套内射视频囯产 | 99久久久无码国产精品免费 | 日韩精品无码一区二区中文字幕 | 成人免费视频一区二区 | 香蕉久久久久久av成人 | 中文字幕无码免费久久9一区9 | 欧美日韩综合一区二区三区 | 婷婷五月综合激情中文字幕 | 亚洲国产精品久久久久久 | 亚洲成av人片天堂网无码】 | 亚洲区欧美区综合区自拍区 | 国产成人一区二区三区别 | 天天摸天天透天天添 | 男女猛烈xx00免费视频试看 | 国产精品久久国产三级国 | 日本熟妇乱子伦xxxx | 人人妻人人澡人人爽人人精品 | 欧美日韩视频无码一区二区三 | 中国女人内谢69xxxx | 亚洲国产av美女网站 | 亚洲人交乣女bbw | 精品偷自拍另类在线观看 | 国产精品人人爽人人做我的可爱 | 给我免费的视频在线观看 | 奇米影视888欧美在线观看 | 无码人妻精品一区二区三区下载 | 一本无码人妻在中文字幕免费 | 乱人伦人妻中文字幕无码 | 国产网红无码精品视频 | 成人aaa片一区国产精品 | 精品国产一区二区三区四区 | 亚洲国产欧美国产综合一区 | 成人精品一区二区三区中文字幕 | 色诱久久久久综合网ywww | 国语精品一区二区三区 | 亚洲娇小与黑人巨大交 | 日韩人妻无码中文字幕视频 | 欧美日韩在线亚洲综合国产人 | 亚洲国产精品一区二区美利坚 | 国产凸凹视频一区二区 | 99精品视频在线观看免费 | 女人和拘做爰正片视频 | 国产成人无码a区在线观看视频app | 1000部啪啪未满十八勿入下载 | 国产精品99久久精品爆乳 | 国产suv精品一区二区五 | 国产又爽又黄又刺激的视频 | 色婷婷综合激情综在线播放 | 亚洲成av人片在线观看无码不卡 | 亚洲综合另类小说色区 | 亚洲综合无码久久精品综合 | 99riav国产精品视频 | 国产亚洲精品久久久闺蜜 | 人人超人人超碰超国产 | 亚洲综合伊人久久大杳蕉 | 日本精品人妻无码77777 天堂一区人妻无码 | 国语自产偷拍精品视频偷 | 国产成人无码a区在线观看视频app | 国产无遮挡吃胸膜奶免费看 | 青青久在线视频免费观看 | 亚洲精品成人福利网站 | 亚拍精品一区二区三区探花 | 国内少妇偷人精品视频 | 国产熟妇高潮叫床视频播放 | 久久综合久久自在自线精品自 | 国产精品亚洲а∨无码播放麻豆 | 欧美阿v高清资源不卡在线播放 | 精品国产成人一区二区三区 | 四虎影视成人永久免费观看视频 | 国产偷国产偷精品高清尤物 | 亚洲成a人片在线观看无码3d | 中文字幕人成乱码熟女app | 日本乱人伦片中文三区 | 欧美一区二区三区 | 日韩成人一区二区三区在线观看 | 久久亚洲日韩精品一区二区三区 | 国产精品亚洲а∨无码播放麻豆 | 狠狠色噜噜狠狠狠7777奇米 | 亚洲中文字幕av在天堂 | 国产成人无码av在线影院 | 国产又爽又黄又刺激的视频 | 性生交片免费无码看人 | 久久久久成人片免费观看蜜芽 | 午夜成人1000部免费视频 | 国产高清av在线播放 | 成人免费无码大片a毛片 | 婷婷丁香五月天综合东京热 | 国产精品亚洲一区二区三区喷水 | 久久天天躁夜夜躁狠狠 | 久久久久成人片免费观看蜜芽 | 亚洲色www成人永久网址 | 日本饥渴人妻欲求不满 | 无码人妻丰满熟妇区五十路百度 |