久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

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

linux

Linux驱动开发必看详解神秘内核(完全转载)

發布時間:2023/12/19 linux 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux驱动开发必看详解神秘内核(完全转载) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Linux驅動開發必看詳解神秘內核 完全轉載-鏈接:http://blog.chinaunix.net/uid-21356596-id-1827434.html
IT168 技術文檔】在開始步入Linux設備驅動程序的神秘世界之前,讓我們從驅動程序開發人員的角度看幾個內核構成要素,熟悉一些基本的內核概念。我們將學習內核定時器、同步機制以及內存分配方法。不過,我們還是得從頭開始這次探索之旅。因此,本章要先瀏覽一下內核發出的啟動信息,然后再逐個講解一些有意思的點。

  2.1 啟動過程

  圖2-1顯示了基于x86計算機Linux系統的啟動順序。第一步是BIOS從啟動設備中導入主引導記錄(MBR),接下來MBR中的代碼查看分區表并從活動分區讀取GRUB、LILO或SYSLINUX等引導裝入程序,之后引導裝入程序會加載壓縮后的內核映像并將控制權傳遞給它。內核取得控制權后,會將自身解壓縮并投入運轉。

  基于x86的處理器有兩種操作模式:實模式和保護模式。在實模式下,用戶僅可以使用1 MB內存,并且沒有任何保護。保護模式要復雜得多,用戶可以使用更多的高級功能(如分頁)。CPU必須中途將實模式切換為保護模式。但是,這種切換是單向的,即不能從保護模式再切換回實模式。

  內核初始化的第一步是執行實模式下的匯編代碼,之后執行保護模式下init/main.c文件(上一章修改的源文件)中的start_kernel()函數。start_kernel()函數首先會初始化CPU子系統,之后讓內存和進程管理系統就位,接下來啟動外部總線和I/O設備,最后一步是激活初始化(init)程序,它是所有Linux進程的父進程。初始化進程執行啟動必要的內核服務的用戶空間腳本,并且最終派生控制臺終端程序以及顯示登錄(login)提示。

?

圖2-1 基于x86硬件上的Linux的啟動過程

  本節內的3級標題都是圖2-2中的一條打印信息,這些信息來源于基于x86的筆記本電腦的Linux啟動過程。如果在其他體系架構上啟動內核,消息以及語義可能會有所不同。


  2.1.1 BIOS-provided physical RAM map

  內核會解析從BIOS中讀取到的系統內存映射,并率先將以下信息打印出來:

  BIOS-provided physical RAM map:

  BIOS-e820: 0000000000000000 - 000000000009f000 (usable)

  ...

  BIOS-e820: 00000000ff800000 - 0000000100000000 (reserved)

  實模式下的初始化代碼通過使用BIOS的int 0x15服務并執行0xe820號函數(即上面的BIOS-e820字符串)來獲得系統的內存映射信息。內存映射信息中包含了預留的和可用的內存,內核將隨后使用這些信息創建其可用的內存池。在附錄B的B.1節,我們會對BIOS提供的內存映射問題進行更深入的講解。

?

圖2-2 內核啟動信息

  2.1.2 758MB LOWMEM available

  896 MB以內的常規的可被尋址的內存區域被稱作低端內存。內存分配函數kmalloc()就是從該區域分配內存的。高于896 MB的內存區域被稱為高端內存,只有在采用特殊的方式進行映射后才能被訪問。

  在啟動過程中,內核會計算并顯示這些內存區內總的頁數。


  2.1.3 Kernel command line: ro root=/dev/hda1

  Linux的引導裝入程序通常會給內核傳遞一個命令行。命令行中的參數類似于傳遞給C程序中main()函數的argv[]列表,唯一的不同在于它們是傳遞給內核的??梢栽谝龑аb入程序的配置文件中增加命令行參數,當然,也可以在運行過程中修改引導裝入程序的提示行[1]。如果使用的是GRUB這個引導裝入程序,由于發行版本的不同,其配置文件可能是/boot/grub/grub.conf或者是/boot/grub/menu.lst。如果使用的是LILO,配置文件為/etc/lilo.conf。下面給出了一個grub.conf文件的例子(增加了一些注釋),看了緊接著title kernel 2.6.23的那行代碼之后,你會明白前述打印信息的由來。

  default 0 #Boot the 2.6.23 kernel by default

  timeout 5 #5 second to alter boot order or parameters

  title kernel 2.6.23 #Boot Option 1

  #The boot image resides in the first partition of the first disk

  #under the /boot/ directory and is named vmlinuz-2.6.23. 'ro'

  #indicates that the root partition should be mounted read-only.

  kernel (hd0,0)/boot/vmlinuz-2.6.23 ro root=/dev/hda1

  #Look under section "Freeing initrd memory:387k freed"

  initrd (hd0,0)/boot/initrd

  #...

  命令行參數將影響啟動過程中的代碼執行路徑。舉一個例子,假設某命令行參數為bootmode,如果該參數被設置為1,意味著你希望在啟動過程中打印一些調試信息并在啟動結束時切換到runlevel的第3級(初始化進程的啟動信息打印后就會了解runlevel的含義);如果bootmode參數被設置為0,意味著你希望啟動過程相對簡潔,并且設置runlevel為2。既然已經熟悉了init/main.c文件,下面就在該文件中增加如下修改:

static?unsigned?int?bootmode?=?1;
static?int?__init
is_bootmode_setup(char?*str)
{
??get_option(&str,?&bootmode);
??return?1;
}

/*?Handle parameter "bootmode="?*/
__setup("bootmode=", is_bootmode_setup);

if?(bootmode) {
??/*?Print verbose output?*/
??/*?...?*/
}

/*?...?*/

/*?If bootmode is 1, choose an init runlevel of 3, else
?? switch to a run level of 2?*/
if?(bootmode) {
??argv_init[++args]?=?"3";
}?else?{
??argv_init[++args]?=?"2";
}

/*?...?*/

  請重新編譯內核并嘗試運行新的修改。


  2.1.4 Calibrating delay...1197.46 BogoMIPS (lpj=2394935)

  在啟動過程中,內核會計算處理器在一個jiffy時間內運行一個內部的延遲循環的次數。jiffy的含義是系統定時器2個連續的節拍之間的間隔。正如所料,該計算必須被校準到所用CPU的處理速度。校準的結果被存儲在稱為loops_per_jiffy的內核變量中。使用loops_per_jiffy的一種情況是某設備驅動程序希望進行小的微秒級別的延遲的時候。

  為了理解延遲—循環校準代碼,讓我們看一下定義于init/calibrate.c文件中的calibrate_ delay()函數。該函數靈活地使用整型運算得到了浮點的精度。如下的代碼片段(有一些注釋)顯示了該函數的開始部分,這部分用于得到一個loops_per_jiffy的粗略值:

loops_per_jiffy?=?(1?<<?12);?/*?Initial approximation = 4096?*/
printk(KERN_DEBUG “Calibrating delay loop...“);
while?((loops_per_jiffy?<<=?1)?!=?0) {
ticks?=?jiffies;??/*?As you will find out in the section, “Kernel
???????????????????? Timers," the jiffies variable contains the
???????????????????? number of timer ticks since the kernel
???????????????????? started, and is incremented in the timer
???????????????????? interrupt handler?*/

??while?(ticks?==?jiffies);?/*?Wait until the start of the next jiffy?*/
??ticks?=?jiffies;
??/*?Delay?*/
??__delay(loops_per_jiffy);
??/*?Did the wait outlast the current jiffy? Continue if it didn't?*/
??ticks?=?jiffies?-?ticks;
??if?(ticks)?break;
}

loops_per_jiffy?>>=?1;?/*?This fixes the most significant bit and is
??????????????????????????the lower-bound of loops_per_jiffy?*/

  上述代碼首先假定loops_per_jiffy大于4096,這可以轉化為處理器速度大約為每秒100萬條指令,即1 MIPS。接下來,它等待jiffy被刷新(1個新的節拍的開始),并開始運行延遲循環__delay(loops_per_jiffy)。如果這個延遲循環持續了1個jiffy以上,將使用以前的loops_per_jiffy值(將當前值右移1位)修復當前loops_per_jiffy的最高位;否則,該函數繼續通過左移loops_per_jiffy值來探測出其最高位。在內核計算出最高位后,它開始計算低位并微調其精度:

loopbit?=?loops_per_jiffy;

/*?Gradually work on the lower-order bits?*/
while?(lps_precision--?&&?(loopbit?>>=?1)) {
??loops_per_jiffy?|=?loopbit;
??ticks?=?jiffies;
??while?(ticks?==?jiffies);?/*?Wait until the start of the next jiffy?*/
ticks?=?jiffies;

??/*?Delay?*/
??__delay(loops_per_jiffy);

??if?(jiffies?!=?ticks)????????/*?longer than 1 tick?*/
????loops_per_jiffy?&=?~loopbit;
}

  上述代碼計算出了延遲循環跨越jiffy邊界時loops_per_jiffy的低位值。這個被校準的值可被用于獲取BogoMIPS(其實它是一個并非科學的處理器速度指標)。可以使用BogoMIPS作為衡量處理器運行速度的相對尺度。在1.6G Hz 基于Pentium M的筆記本電腦上,根據前述啟動過程的打印信息,循環校準的結果是:loops_per_jiffy的值為2394935。獲得BogoMIPS的方式如下:

BogoMIPS?=?loops_per_jiffy?*?1秒內的jiffy數*延遲循環消耗的指令數(以百萬為單位)
=?(2394935?*?HZ?*?2)?/?(1000000)
=?(2394935?*?250?*?2)?/?(1000000)
=?1197.46(與啟動過程打印信息中的值一致)

  在2.4節將更深入闡述jiffy、HZ和loops_per_jiffy。


  2.1.5 Checking HLT instruction

  由于Linux內核支持多種硬件平臺,啟動代碼會檢查體系架構相關的bug。其中一項工作就是驗證停機(HLT)指令。

  x86處理器的HLT指令會將CPU置入一種低功耗睡眠模式,直到下一次硬件中斷發生之前維持不變。當內核想讓CPU進入空閑狀態時(查看arch/x86/kernel/process_32.c文件中定義的cpu_idle()函數),它會使用HLT指令。對于有問題的CPU而言,命令行參數no-hlt可以禁止HLT指令。如果no-hlt被設置,在空閑的時候,內核會進行忙等待而不是通過HLT給CPU降溫。

  當init/main.c中的啟動代碼調用include/asm-your-arch/bugs.h中定義的check_bugs()時,會打印上述信息。

  2.1.6 NET: Registered protocol family 2

  Linux套接字(socket)層是用戶空間應用程序訪問各種網絡協議的統一接口。每個協議通過include/linux/socket.h文件中定義的分配給它的獨一無二的系列號注冊。上述打印信息中的Family 2代表af_inet(互聯網協議)。

  啟動過程中另一個常見的注冊協議系列是AF_NETLINK(Family 16)。網絡鏈接套接字提供了用戶進程和內核通信的方法。通過網絡鏈接套接字可完成的功能還包括存取路由表和地址解析協議(ARP)表(include/linux/netlink.h文件給出了完整的用法列表)。對于此類任務而言,網絡鏈接套接字比系統調用更合適,因為前者具有采用異步機制、更易于實現和可動態鏈接的優點。

  內核中經常使能的另一個協議系列是AF_Unix或Unix-domain套接字。X Windows等程序使用它們在同一個系統上進行進程間通信。

  2.1.7 Freeing initrd memory: 387k freed

  initrd是一種由引導裝入程序加載的常駐內存的虛擬磁盤映像。在內核啟動后,會將其掛載為初始根文件系統,這個初始根文件系統中存放著掛載實際根文件系統磁盤分區時所依賴的可動態連接的模塊。由于內核可運行于各種各樣的存儲控制器硬件平臺上,把所有可能的磁盤驅動程序都直接放進基本的內核映像中并不可行。你所使用的系統的存儲設備的驅動程序被打包放入了initrd中,在內核啟動后、實際的根文件系統被掛載之前,這些驅動程序才被加載。使用mkinitrd命令可以創建一個initrd映像。

  2.6內核提供了一種稱為initramfs的新功能,它在幾個方面較initrd更為優秀。后者模擬了一個磁盤(因而被稱為initramdisk或initrd),會帶來Linux塊I/O子系統的開銷(如緩沖);前者基本上如同一個被掛載的文件系統一樣,由自身獲取緩沖(因此被稱作initramfs)。

  不同于initrd,基于頁緩沖建立的initramfs如同頁緩沖一樣會動態地變大或縮小,從而減少了其內存消耗。另外,initrd要求你的內核映像包含initrd所使用的文件系統(例如,如果initrd為EXT2文件系統,內核必須包含EXT2驅動程序),然而initramfs不需要文件系統支持。再者,由于initramfs只是頁緩沖之上的一小層,因此它的代碼量很小。

  用戶可以將初始根文件系統打包為一個cpio壓縮包[1],并通過initrd=命令行參數傳遞給內核。當然,也可以在內核配置過程中通過INITRAMFS_SOURCE選項直接編譯進內核。對于后一種方式而言,用戶可以提供cpio壓縮包的文件名或者包含initramfs的目錄樹。在啟動過程中,內核會將文件解壓縮為一個initramfs根文件系統,如果它找到了/init,它就會執行該頂層的程序。這種獲取初始根文件系統的方法對于嵌入式系統而言特別有用,因為在嵌入式系統中系統資源非常寶貴。使用mkinitramfs可以創建一個initramfs映像,查看文檔Documentation/filesystems/ramfs- rootfs-initramfs.txt可獲得更多信息。

  在本例中,我們使用的是通過initrd=命令行參數向內核傳遞初始根文件系統cpio壓縮包的方式。在將壓縮包中的內容解壓為根文件系統后,內核將釋放該壓縮包所占據的內存(本例中為387 KB)并打印上述信息。釋放后的頁面會被分發給內核中的其他部分以便被申請。

  在嵌入式系統開發過程中,initrd和initramfs有時候也可被用作嵌入式設備上實際的根文件系統。

  2.1.8 io scheduler anticipatory registered (default)

  I/O調度器的主要目標是通過減少磁盤的定位次數來增加系統的吞吐率。在磁盤定位過程中,磁頭需要從當前的位置移動到感興趣的目標位置,這會帶來一定的延遲。2.6內核提供了4種不同的I/O調度器:Deadline、Anticipatory、Complete Fair Queuing以及NOOP。從上述內核打印信息可以看出,本例將Anticipatory 設置為了默認的I/O調度器。


  2.1.9 Setting up standard PCI resources

  啟動過程的下一階段會初始化I/O總線和外圍控制器。內核會通過遍歷PCI總線來探測PCI硬件,接下來再初始化其他的I/O子系統。從圖2-3中我們會看到SCSI子系統、USB控制器、視頻芯片(855北橋芯片組信息中的一部分)、串行端口(本例中為8250 UART)、PS/2鍵盤鼠標、軟驅、ramdisk、loopback設備、IDE控制器(本例中為ICH4南橋芯片組中的一部分)、觸控板、以太網控制器(本例中為e1000)以及PCMCIA控制器初始化的啟動信息。圖2-3中 符號指向的為I/O設備的標識(ID)。

圖2-3 在啟動過程中初始化總線和外圍控制器

  本書會以單獨的章節討論大部分上述驅動程序子系統,請注意如果驅動程序以模塊的形式被動態鏈接到內核,其中的一些消息也許只有在內核啟動后才會被顯示。

  2.1.10 EXT3-fs: mounted filesystem

  EXT3文件系統已經成為Linux事實上的文件系統。EXT3在退役的EXT2文件系統基礎上增添了日志層,該層可用于崩潰后文件系統的快速恢復。它的目標是不經由耗時的文件系統檢查(fsck)操作即可獲得一個一致的文件系統。EXT2仍然是新文件系統的工作引擎,但是EXT3層會在進行實際的磁盤改變之前記錄文件交互的日志。EXT3向后兼容于EXT2,因此,你可以在你現存的EXT2文件系統上加上EXT3或者由EXT3返回到EXT2文件系統。

  EXT3會啟動一個稱為kjournald的內核輔助線程(在接下來的一章中將深入討論內核線程)來完成日志功能。在EXT3投入運轉以后,內核掛載根文件系統并做好“業務”上的準備:

  EXT3-fs: mounted filesystem with ordered data mode

  kjournald starting. Commit interval 5 seconds

  VFS: Mounted root (ext3 filesystem).


  2.1.11 INIT: version 2.85 booting

  所有Linux進程的父進程init是內核完成啟動序列后運行的第1個程序。在init/main.c的最后幾行,內核會搜索一個不同的位置以定位到init:

if?(ramdisk_execute_command) {?/*?Look for /init in initramfs?*/
??run_init_process(ramdisk_execute_command);
}

if?(execute_command) {?/*?You may override init and ask the kernel
??????????????????????????to execute a custom program using the
??????????????????????????"init=" kernel command-line argument. If
??????????????????????????you do that, execute_command points to the
??????????????????????????specified program?*/
??run_init_process(execute_command);
}

/*?Else search for init or sh in the usual places ..?*/
run_init_process("/sbin/init");
run_init_process("/etc/init");
run_init_process("/bin/init");
run_init_process("/bin/sh");
panic("No init found. Try passing init= option to kernel.");

  init會接受/etc/inittab的指引。它首先執行/etc/rc.sysinit中的系統初始化腳本,該腳本的一項最重要的職責就是激活對換(swap)分區,這會導致如下啟動信息被打印:

  Adding 1552384k swap on /dev/hda6

  讓我們來仔細看看上述這段話的意思。Linux用戶進程擁有3 GB的虛擬地址空間(見2.7節),構成“工作集”的頁被保存在RAM中。但是,如果有太多程序需要內存資源,內核會釋放一些被使用了的RAM頁面并將其存儲到稱為對換空間(swap space)的磁盤分區中。根據經驗法則,對換分區的大小應該是RAM的2倍。在本例中,對換空間位于/dev/hda6這個磁盤分區,其大小為1 552 384 KB。

  接下來,init開始運行/etc/rc.d/rcX.d/目錄中的腳本,其中X是inittab中定義的運行級別。runlevel是根據預期的工作模式所進入的執行狀態。例如,多用戶文本模式意味著runlevel為3,X Windows則意味著runlevel為5。因此,當你看到INIT: Entering runlevel 3這條信息的時候,init就已經開始執行/etc/rc.d/rc3.d/目錄中的腳本了。這些腳本會啟動動態設備命名子系統(第4章中將討論udev),并加載網絡、音頻、存儲設備等驅動程序所對應的內核模塊:

  Starting udev: [ OK ]

  Initializing hardware... network audio storage [Done]

  ...

  最后,init發起虛擬控制臺終端,你現在就可以登錄了。


  2.2 內核模式和用戶模式

  MS-DOS等操作系統在單一的CPU模式下運行,但是一些類Unix的操作系統則使用了雙模式,可以有效地實現時間共享。在Linux機器上,CPU要么處于受信任的內核模式,要么處于受限制的用戶模式。除了內核本身處于內核模式以外,所有的用戶進程都運行在用戶模式之中。

  內核模式的代碼可以無限制地訪問所有處理器指令集以及全部內存和I/O空間。如果用戶模式的進程要享有此特權,它必須通過系統調用向設備驅動程序或其他內核模式的代碼發出請求。另外,用戶模式的代碼允許發生缺頁,而內核模式的代碼則不允許。

  在2.4和更早的內核中,僅僅用戶模式的進程可以被上下文切換出局,由其他進程搶占。除非發生以下兩種情況,否則內核模式代碼可以一直獨占CPU:

  (1) 它自愿放棄CPU;

  (2) 發生中斷或異常。

  2.6內核引入了內核搶占,大多數內核模式的代碼也可以被搶占。

  2.3 進程上下文和中斷上下文

  內核可以處于兩種上下文:進程上下文和中斷上下文。在系統調用之后,用戶應用程序進入內核空間,此后內核空間針對用戶空間相應進程的代表就運行于進程上下文。異步發生的中斷會引發中斷處理程序被調用,中斷處理程序就運行于中斷上下文。中斷上下文和進程上下文不可能同時發生。

  運行于進程上下文的內核代碼是可搶占的,但進程上下文則會一直運行至結束,不會被搶占。因此,內核會限制中斷上下文的工作,不允許其執行如下操作:

  (1) 進入睡眠狀態或主動放棄CPU;

  (2) 占用互斥體;

  (3) 執行耗時的任務;

  (4) 訪問用戶空間虛擬內存。

  本書4.2節會對中斷上下文進行更深入的討論。

  2.4 內核定時器

  內核中許多部分的工作都高度依賴于時間信息。Linux內核利用硬件提供的不同的定時器以支持忙等待或睡眠等待等時間相關的服務。忙等待時,CPU會不斷運轉。但是睡眠等待時,進程將放棄CPU。因此,只有在后者不可行的情況下,才考慮使用前者。內核也提供了某些便利,可以在特定的時間之后調度某函數運行。

  我們首先來討論一些重要的內核定時器變量(jiffies、HZ和xtime)的含義。接下來,我們會使用Pentium時間戳計數器(TSC)測量基于Pentium的系統的運行次數。之后,我們也分析一下Linux怎么使用實時鐘(RTC)。

  2.4.1 HZ和Jiffies

  系統定時器能以可編程的頻率中斷處理器。此頻率即為每秒的定時器節拍數,對應著內核變量HZ。選擇合適的HZ值需要權衡。HZ值大,定時器間隔時間就小,因此進程調度的準確性會更高。但是,HZ值越大也會導致開銷和電源消耗更多,因為更多的處理器周期將被耗費在定時器中斷上下文中。

HZ的值取決于體系架構。在x86系統上,在2.4內核中,該值默認設置為100;在2.6內核中,該值變為1000;而在2.6.13中,它又被降低到了250。在基于ARM的平臺上,2.6內核將HZ設置為100。在目前的內核中,可以在編譯內核時通過配置菜單選擇一個HZ值。該選項的默認值取決于體系架構的版本。
2.6.21內核支持無節拍的內核(CONFIG_NO_HZ),它會根據系統的負載動態觸發定時器中斷。無節拍系統的實現超出了本章的討論范圍,不再詳述。

  jiffies變量記錄了系統啟動以來,系統定時器已經觸發的次數。內核每秒鐘將jiffies變量增加HZ次。因此,對于HZ值為100的系統,1個jiffy等于10ms,而對于HZ為1000的系統,1個jiffy僅為1ms。

  為了更好地理解HZ和jiffies變量,請看下面的取自IDE驅動程序(drivers/ide/ide.c)的代碼片段。該段代碼會一直輪詢磁盤驅動器的忙狀態:

unsigned?long?timeout?=?jiffies?+?(3*HZ);
while?(hwgroup->busy) {
??/*?...?*/
??if?(time_after(jiffies, timeout)) {
????return?-EBUSY;
??}
??/*?...?*/
}
return?SUCCESS;

  如果忙條件在3s內被清除,上述代碼將返回SUCCESS,否則,返回-EBUSY。3*HZ是3s內的jiffies數量。計算出來的超時jiffies + 3*HZ將是3s超時發生后新的jiffies值。time_after()的功能是將目前的jiffies值與請求的超時時間對比,檢測溢出。類似函數還包括time_before()、time_before_eq()和time_after_eq()。

  jiffies被定義為volatile類型,它會告訴編譯器不要優化該變量的存取代碼。這樣就確保了每個節拍發生的定時器中斷處理程序都能更新jiffies值,并且循環中的每一步都會重新讀取jiffies值。

  對于jiffies向秒轉換,可以查看USB主機控制器驅動程序drivers/usb/host/ehci-sched.c中的如下代碼片段:

if?(stream->rescheduled) {
??ehci_info(ehci,?"ep%ds-iso rescheduled?"?"%lu times in %lu
????????????seconds\n", stream->bEndpointAddress, is_in??"in":
????????????"out", stream->rescheduled,
????????????((jiffies – stream->start)/HZ));
}

  上述調試語句計算出USB端點流(見第11章)被重新調度stream->rescheduled次所耗費的秒數。jiffies-stream->start是從開始到現在消耗的jiffies數量,將其除以HZ就得到了秒數值。

  假定jiffies值為1000,32位的jiffies會在大約50天的時間內溢出。由于系統的運行時間可以比該時間長許多倍,因此,內核提供了另一個變量jiffies_64以存放64位(u64)的jiffies。鏈接器將jiffies_64的低32位與32位的jiffies指向同一個地址。在32位的機器上,為了將一個u64變量賦值給另一個,編譯器需要2條指令,因此,讀jiffies_64的操作不具備原子性??梢詫rivers/cpufreq/cpufreq_stats.c文件中定義的cpufreq_stats_update()作為實例來學習。


  2.4.2 長延時

  在內核中,以jiffies為單位進行的延遲通常被認為是長延時。一種可能但非最佳的實現長延時的方法是忙等待。實現忙等待的函數有“占著茅坑不拉屎”之嫌,它本身不利用CPU進行有用的工作,同時還不讓其他程序使用CPU。如下代碼將占用CPU 1秒:

  unsigned long timeout = jiffies + HZ;

  while (time_before(jiffies, timeout)) continue;

  實現長延時的更好方法是睡眠等待而不是忙等待,在這種方式中,本進程會在等待時將處理器出讓給其他進程。schedule_timeout()完成此功能:

  unsigned long timeout = HZ;

  schedule_timeout(timeout); /* Allow other parts of the kernel to run */

  這種延時僅僅確保超時較低時的精度。由于只有在時鐘節拍引發的內核調度才會更新jiffies,所以無論是在內核空間還是在用戶空間,都很難使超時的精度比HZ更大了。另外,即使你的進程已經超時并可被調度,但是調度器仍然可能基于優先級策略選擇運行隊列的其他進程[1]。

  用于睡眠等待的另2個函數是wait_event_timeout()和msleep(),它們的實現都基于schedule_timeout()。wait_event_timeout()的使用場合是:在一個特定的條件滿足或者超時發生后,希望代碼繼續運行。msleep()表示睡眠指定的時間(以毫秒為單位)。

  這種長延時技術僅僅適用于進程上下文。睡眠等待不能用于中斷上下文,因為中斷上下文不允許執行schedule()或睡眠(4.2節給出了中斷上下文可以做和不能做的事情)。在中斷中進行短時間的忙等待是可行的,但是進行長時間的忙等則被認為不可赦免的罪行。在中斷禁止時,進行長時間的忙等待也被看作禁忌。

  為了支持在將來的某時刻進行某項工作,內核也提供了定時器API??梢酝ㄟ^init_timer()動態定義一個定時器,也可以通過DEFINE_TIMER()靜態創建定時器。然后,將處理函數的地址和參數綁定給一個timer_list,并使用add_timer()注冊它即可:

#include?<linux/timer.h>

struct timer_list my_timer;

init_timer(&my_timer);????????????/*?Also see setup_timer()?*/
my_timer.expire?=?jiffies?+?n*HZ;?/*?n is the timeout in number of seconds?*/
my_timer.function?=?timer_func;???/*?Function to execute after n seconds?*/
my_timer.data?=?func_parameter;???/*?Parameter to be passed to timer_func?*/
add_timer(&my_timer);?????????????/*?Start the timer?*/

  上述代碼只會讓定時器運行一次。如果想讓timer_func()函數周期性地執行,需要在timer_func()加上相關代碼,指定其在下次超時后調度自身:

static?void?timer_func(unsigned?long?func_parameter)
{
??/*?Do work to be done periodically?*/
??/*?...?*/

??init_timer(&my_timer);
??my_timer.expire???=?jiffies?+?n*HZ;
??my_timer.data?????=?func_parameter;
??my_timer.function?=?timer_func;
??add_timer(&my_timer);
}

  你可以使用mod_timer()修改my_timer的到期時間,使用del_timer()取消定時器,或使用timer_pending()以查看my_timer當前是否處于等待狀態。查看kernel/timer.c源代碼,會發現schedule_timeout()內部就使用了這些API。

  clock_settime()和clock_gettime()等用戶空間函數可用于獲得內核定時器服務。用戶應用程序可以使用setitimer()和getitimer()來控制一個報警信號在特定的超時后發生。


  2.4.3 短延時

  在內核中,小于jiffy的延時被認為是短延時。這種延時在進程或中斷上下文都可能發生。由于不可能使用基于jiffy的方法實現短延時,之前討論的睡眠等待將不再能用于短的超時。這種情況下,唯一的解決途徑就是忙等待。

  實現短延時的內核API包括mdelay()、udelay()和ndelay(),分別支持毫秒、微秒和納秒級的延時。這些函數的實際實現取決于體系架構,而且也并非在所有平臺上都被完整實現。

  忙等待的實現方法是測量處理器執行一條指令的時間,為了延時,執行一定數量的指令。從前文可知,內核會在啟動過程中進行測量并將該值存儲在loops_per_jiffy變量中。短延時API就使用了loops_per_jiffy值來決定它們需要進行循環的數量。為了實現握手進程中1微秒的延時,USB主機控制器驅動程序(drivers/usb/host/ehci-hcd.c)會調用udelay(),而udelay()會內部調用loops_per_jiffy:

do?{
??result?=?ehci_readl(ehci, ptr);
??/*?...?*/
??if?(result?==?done)?return?0;
??udelay(1);?????/*?Internally uses loops_per_jiffy?*/
??usec--;
}?while?(usec?>?0);

  2.4.4 Pentium時間戳計數器

  時間戳計數器(TSC)是Pentium兼容處理器中的一個計數器,它記錄自啟動以來處理器消耗的時鐘周期數。由于TSC隨著處理器周期速率的比例的變化而變化,因此提供了非常高的精確度。TSC通常被用于剖析和監測代碼。使用rdtsc指令可測量某段代碼的執行時間,其精度達到微秒級。TSC的節拍可以被轉化為秒,方法是將其除以CPU時鐘速率(可從內核變量cpu_khz讀取)。

  在如下代碼片段中,low_tsc_ticks和high_tsc_ticks分別包含了TSC的低32位和高32位。低32位可能在數秒內溢出(具體時間取決于處理器速度),但是這已經用于許多代碼的剖析了:

unsigned?long?low_tsc_ticks0, high_tsc_ticks0;
unsigned?long?low_tsc_ticks1, high_tsc_ticks1;
unsigned?long?exec_time;
rdtsc(low_tsc_ticks0, high_tsc_ticks0);?/*?Timestamp before?*/
printk("Hello World\n");????????????????/*?Code to be profiled?*/
rdtsc(low_tsc_ticks1, high_tsc_ticks1);?/*?Timestamp after?*/
exec_time?=?low_tsc_ticks1?-?low_tsc_ticks0;

  在1.8 GHz Pentium 處理器上,exec_time的結果為871(或半微秒)。

在2.6.21內核中,針對高精度定時器的支持(CONFIG_HIGH_RES_TIMERS)已經被融入了內核。它使用了硬件特定的高速定時器來提供對nanosleep()等API高精度的支持。在基于Pentium的機器上,內核借助TSC實現這一功能。

  2.4.5 實時鐘

  RTC在非易失性存儲器上記錄絕對時間。在x86 PC上,RTC位于由電池供電[1]的互補金屬氧化物半導體(CMOS)存儲器的頂部。從第5章的圖5-1可以看出傳統PC體系架構中CMOS的位置。在嵌入式系統中,RTC可能被集成到處理器中,也可能通過I2C或SPI總線在外部連接,見第8章。

  使用RTC可以完成如下工作:

  (1) 讀取、設置絕對時間,在時鐘更新時產生中斷;

  (2) 產生頻率為2~8192 Hz之間的周期性中斷;

  (3) 設置報警信號。

  許多應用程序需要使用絕對時間[或稱墻上時間(wall time)]。jiffies是相對于系統啟動后的時間,它不包含墻上時間。內核將墻上時間記錄在xtime變量中,在啟動過程中,會根據從RTC讀取到的目前的墻上時間初始化xtime,在系統停機后,墻上時間會被寫回RTC。你可以使用do_gettimeofday()讀取墻上時間,其最高精度由硬件決定:

#include?<linux/time.h>
static?struct timeval curr_time;
do_gettimeofday(&curr_time);
my_timestamp?=?cpu_to_le32(curr_time.tv_sec);?/*?Record timestamp?*/

  用戶空間也包含一系列可以訪問墻上時間的函數,包括:

  (1) time(),該函數返回日歷時間,或從新紀元(1970年1月1日00:00:00)以來經歷的秒數;

  (2) localtime(),以分散的形式返回日歷時間;

  (3) mktime(),進行localtime()函數的反向工作;

  (4) gettimeofday(),如果你的平臺支持,該函數將以微秒精度返回日歷時間。

  用戶空間使用RTC的另一種途徑是通過字符設備/dev/rtc來進行,同一時刻只有一個進程允許返回該字符設備。

  在第5章和第8章,本書將更深入討論RTC驅動程序。另外,在第19章給出了一個使用/dev/rtc以微秒級精度執行周期性工作的應用程序示例。

  2.5 內核中的并發

  隨著多核筆記本電腦時代的到來,對稱多處理器(SMP)的使用不再被限于高科技用戶。SMP和內核搶占是多線程執行的兩種場景。多個線程能夠同時操作共享的內核數據結構,因此,對這些數據結構的訪問必須被串行化。

  接下來,我們會討論并發訪問情況下保護共享內核資源的基本概念。我們以一個簡單的例子開始,并逐步引入中斷、內核搶占和SMP等復雜概念。


  2.5.1 自旋鎖和互斥體

  訪問共享資源的代碼區域稱作臨界區。自旋鎖(spinlock)和互斥體(mutex,mutual exclusion的縮寫)是保護內核臨界區的兩種基本機制。我們逐個分析。

  自旋鎖可以確保在同時只有一個線程進入臨界區。其他想進入臨界區的線程必須不停地原地打轉,直到第1個線程釋放自旋鎖。注意:這里所說的線程不是內核線程,而是執行的線程。

  下面的例子演示了自旋鎖的基本用法:

#include?<linux/spinlock.h>
spinlock_t mylock?=?SPIN_LOCK_UNLOCKED;?/*?Initialize?*/

/*?Acquire the spinlock. This is inexpensive if there
* is no one inside the critical section. In the face of
* contention, spinlock() has to busy-wait.
*/
spin_lock(&mylock);

/*?... Critical Section code ...?*/

spin_unlock(&mylock);?/*?Release the lock?*/

  與自旋鎖不同的是,互斥體在進入一個被占用的臨界區之前不會原地打轉,而是使當前線程進入睡眠狀態。如果要等待的時間較長,互斥體比自旋鎖更合適,因為自旋鎖會消耗CPU資源。在使用互斥體的場合,多于2次進程切換時間都可被認為是長時間,因此一個互斥體會引起本線程睡眠,而當其被喚醒時,它需要被切換回來。

  因此,在很多情況下,決定使用自旋鎖還是互斥體相對來說很容易:

  (1) 如果臨界區需要睡眠,只能使用互斥體,因為在獲得自旋鎖后進行調度、搶占以及在等待隊列上睡眠都是非法的;

  (2) 由于互斥體會在面臨競爭的情況下將當前線程置于睡眠狀態,因此,在中斷處理函數中,只能使用自旋鎖。(第4章將介紹更多的關于中斷上下文的限制。)

  下面的例子演示了互斥體使用的基本方法:

#include?<linux/mutex.h>

/*?Statically declare a mutex. To dynamically
?? create a mutex, use mutex_init()?*/
static?DEFINE_MUTEX(mymutex);

/*?Acquire the mutex. This is inexpensive if there
* is no one inside the critical section. In the face of
* contention, mutex_lock() puts the calling thread to sleep.
*/
mutex_lock(&mymutex);

/*?... Critical Section code ...?*/

mutex_unlock(&mymutex);??????/*?Release the mutex?*/

  為了論證并發保護的用法,我們首先從一個僅存在于進程上下文的臨界區開始,并以下面的順序逐步增加復雜性:

  (1) 非搶占內核,單CPU情況下存在于進程上下文的臨界區;

  (2) 非搶占內核,單CPU情況下存在于進程和中斷上下文的臨界區;

  (3) 可搶占內核,單CPU情況下存在于進程和中斷上下文的臨界區;

  (4) 可搶占內核,SMP情況下存在于進程和中斷上下文的臨界區。


  舊的信號量接口

  互斥體接口代替了舊的信號量接口(semaphore)。互斥體接口是從-rt樹演化而來的,在2.6.16內核中被融入主線內核。

  盡管如此,但是舊的信號量仍然在內核和驅動程序中廣泛使用。信號量接口的基本用法如下:

#include?<asm/semaphore.h>??/*?Architecture dependent header?*/

/*?Statically declare a semaphore. To dynamically
?? create a semaphore, use init_MUTEX()?*/
static?DECLARE_MUTEX(mysem);

down(&mysem);????/*?Acquire the semaphore?*/

/*?... Critical Section code ...?*/

up(&mysem);??????/*?Release the semaphore?*/

  1. 案例1:進程上下文,單CPU,非搶占內核

  這種情況最為簡單,不需要加鎖,因此不再贅述。

  2. 案例2:進程和中斷上下文,單CPU,非搶占內核

  在這種情況下,為了保護臨界區,僅僅需要禁止中斷。如圖2-4所示,假定進程上下文的執行單元A、B以及中斷上下文的執行單元C都企圖進入相同的臨界區。

?

圖2-4 進程和中斷上下文進入臨界區

  由于執行單元C總是在中斷上下文執行,它會優先于執行單元A和B,因此,它不用擔心保護的問題。執行單元A和B也不必關心彼此會被互相打斷,因為內核是非搶占的。因此,執行單元A和B僅僅需要擔心C會在它們進入臨界區的時候強行進入。為了實現此目的,它們會在進入臨界區之前禁止中斷:

Point A:????
??local_irq_disable();??/*?Disable Interrupts in local CPU?*/
??/*?... Critical Section ...??*/
??local_irq_enable();???/*?Enable Interrupts in local CPU?*/

?  但是,如果當執行到Point A的時候已經被禁止,local_irq_enable()將產生副作用,它會重新使能中斷,而不是恢復之前的中斷狀態??梢赃@樣修復它:

unsigned?long?flags;

Point A:
??local_irq_save(flags);?????/*?Disable Interrupts?*/
??/*?... Critical Section ...?*/
??local_irq_restore(flags);??/*?Restore state to what it was at Point A?*/

  不論Point A的中斷處于什么狀態,上述代碼都將正確執行。


  3. 案例3:進程和中斷上下文,單CPU,搶占內核

  如果內核使能了搶占,僅僅禁止中斷將無法確保對臨界區的保護,因為另一個處于進程上下文的執行單元可能會進入臨界區。重新回到圖2-4,現在,除了C以外,執行單元A和B必須提防彼此。顯而易見,解決該問題的方法是在進入臨界區之前禁止內核搶占、中斷,并在退出臨界區的時候恢復內核搶占和中斷。因此,執行單元A和B使用了自旋鎖API的irq變體:

unsigned?long?flags;

Point A:
??/*?Save interrupt state.
?? * Disable interrupts - this implicitly disables preemption?*/
??spin_lock_irqsave(&mylock, flags);

??/*?... Critical Section ...?*/

??/*?Restore interrupt state to what it was at Point A?*/
??spin_unlock_irqrestore(&mylock, flags);

  我們不需要在最后顯示地恢復Point A的搶占狀態,因為內核自身會通過一個名叫搶占計數器的變量維護它。在搶占被禁止時(通過調用preempt_disable()),計數器值會增加;在搶占被使能時(通過調用preempt_enable()),計數器值會減少。只有在計數器值為0的時候,搶占才發揮作用。

  4. 案例4:進程和中斷上下文,SMP機器,搶占內核

  現在假設臨界區執行于SMP機器上,而且你的內核配置了CONFIG_SMP和CONFIG_PREEMPT。

  到目前為止討論的場景中,自旋鎖原語發揮的作用僅限于使能和禁止搶占和中斷,時間的鎖功能并未被完全編譯進來。在SMP機器內,鎖邏輯被編譯進來,而且自旋鎖原語確保了SMP安全性。SMP使能的含義如下:

unsigned?long?flags;

Point A:
??/*
????- Save interrupt state on the local CPU
????- Disable interrupts on the local CPU. This implicitly disables preemption.
????- Lock the section to regulate access by other CPUs
???*/
??spin_lock_irqsave(&mylock, flags);

??/*?... Critical Section ...?*/

??/*
????- Restore interrupt state and preemption to what it
??????was at Point A for the local CPU
????- Release the lock
???*/
??spin_unlock_irqrestore(&mylock, flags);

  在SMP系統上,獲取自旋鎖時,僅僅本CPU上的中斷被禁止。因此,一個進程上下文的執行單元(圖2-4中的執行單元A)在一個CPU上運行的同時,一個中斷處理函數(圖2-4中的執行單元C)可能運行在另一個CPU上。非本CPU上的中斷處理函數必須自旋等待本CPU上的進程上下文代碼退出臨界區。中斷上下文需要調用spin_lock()/spin_unlock():

spin_lock(&mylock);

/*?... Critical Section ...?*/

spin_unlock(&mylock);

  除了有irq變體以外,自旋鎖也有底半部(BH)變體。在鎖被獲取的時候,spin_lock_bh()會禁止底半部,而spin_unlock_bh()則會在鎖被釋放時重新使能底半部。我們將在第4章討論底半部。

  -rt樹

  實時(-rt)樹,也被稱作CONFIG_PREEMPT_RT補丁集,實現了內核中一些針對低延時的修改。該補丁集可以從www.kernel.org/pub/linux/kernel/projects/rt下載,它允許內核的大部分位置可被搶占,但是用自旋鎖代替了一些互斥體。它也合并了一些高精度的定時器。數個-rt功能已經被融入了主線內核。詳細的文檔見http://rt.wiki.kernel.org/。

  為了提高性能,內核也定義了一些針對特定環境的特定的鎖原語。使能適用于代碼執行場景的互斥機制將使代碼更高效。下面來看一下這些特定的互斥機制。


  2.5.2 原子操作

  原子操作用于執行輕量級的、僅執行一次的操作,例如修改計數器、有條件的增加值、設置位等。原子操作可以確保操作的串行化,不再需要鎖進行并發訪問保護。原子操作的具體實現取決于體系架構。

  為了在釋放內核網絡緩沖區(稱為skbuff)之前檢查是否還有余留的數據引用,定義于net/core/skbuff.c文件中的skb_release_data()函數將進行如下操作:

1?if?(!skb->cloned?||
2???/*?Atomically decrement and check if the returned value is zero?*/
3?????!atomic_sub_return(skb->nohdr???(1?<<?SKB_DATAREF_SHIFT)?+?1?:
4????????????????????????1,&skb_shinfo(skb)->dataref)) {
5???/*?...?*/
6???kfree(skb->head);
7?}

  當skb_release_data()執行的時候,另一個調用skbuff_clone()(也在net/core/skbuff.c文件中定義)的執行單元也許在同步地增加數據引用計數值:

/*?...?*/
/*?Atomically bump up the data reference count?*/
atomic_inc(&(skb_shinfo(skb)->dataref));
/*?...?*/

  原子操作的使用將確保數據引用計數不會被這兩個執行單元“蹂躪”。它也消除了使用鎖去保護單一整型變量的爭論。

  內核也支持set_bit()、clear_bit()和test_and_set_bit()操作,它們可用于原子地位修改。查看include/asm-your-arch/atomic.h文件可以看出你所在體系架構所支持的原子操作。

  2.5.3 讀—寫鎖

  另一個特定的并發保護機制是自旋鎖的讀—寫鎖變體。如果每個執行單元在訪問臨界區的時候要么是讀要么是寫共享的數據結構,但是它們都不會同時進行讀和寫操作,那么這種鎖是最好的選擇。允許多個讀線程同時進入臨界區。讀自旋鎖可以這樣定義:

rwlock_t myrwlock?=?RW_LOCK_UNLOCKED;

read_lock(&myrwlock);?????/*?Acquire reader lock?*/
/*?... Critical Region ...?*/
read_unlock(&myrwlock);???/*?Release lock?*/

  但是,如果一個寫線程進入了臨界區,那么其他的讀和寫都不允許進入。寫鎖的用法如下:

rwlock_t myrwlock?=?RW_LOCK_UNLOCKED;

write_lock(&myrwlock);????/*?Acquire writer lock?*/
/*?... Critical Region ...?*/
write_unlock(&myrwlock);??/*?Release lock?*/

  net/ipx/ipx_route.c中的IPX路由代碼是使用讀—寫鎖的真實示例。一個稱作ipx_routes_lock的讀—寫鎖將保護IPX路由表的并發訪問。要通過查找路由表實現包轉發的執行單元需要請求讀鎖。需要添加和刪除路由表中入口的執行單元必須獲取寫鎖。由于通過讀路由表的情況比更新路由表的情況多得多,使用讀—寫鎖提高了性能。

  和傳統的自旋鎖一樣,讀—寫鎖也有相應的irq變體:read_lock_irqsave()、read_unlock_ irqrestore()、write_lock_irqsave()和write_unlock_irqrestore()。這些函數的含義與傳統自旋鎖相應的變體相似。

  2.6內核引入的順序鎖(seqlock)是一種支持寫多于讀的讀—寫鎖。在一個變量的寫操作比讀操作多得多的情況下,這種鎖非常有用。前文討論的jiffies_64變量就是使用順序鎖的一個例子。寫線程不必等待一個已經進入臨界區的讀,因此,讀線程也許會發現它們進入臨界區的操作失敗,因此需要重試:

u64 get_jiffies_64(void)?/*?Defined in kernel/time.c?*/
{
??unsigned?long?seq;
??u64 ret;
??do?{
????seq?=?read_seqbegin(&xtime_lock);
????ret?=?jiffies_64;
??}?while?(read_seqretry(&xtime_lock, seq));
??return?ret;
}

  寫者會使用write_seqlock()和write_sequnlock()保護臨界區。

  2.6內核還引入了另一種稱為讀—復制—更新(RCU)的機制。該機制用于提高讀操作遠多于寫操作時的性能。其基本理念是讀線程不需要加鎖,但是寫線程會變得更加復雜,它們會在數據結構的一份副本上執行更新操作,并代替讀者看到的指針。為了確保所有正在進行的讀操作的完成,原子副本會一直被保持到所有CPU上的下一次上下文切換。使用RCU的情況很復雜,因此,只有在確保你確實需要使用它而不是前文的其他原語的時候,才適宜選擇它。include/linux/ rcupdate.h文件中定義了RCU的數據結構和接口函數,Documentation/RCU/*提供了豐富的文檔。

  fs/dcache.c文件中包含一個RCU的使用示例。在Linux中,每個文件都與一個目錄入口信息(dentry結構體)、元數據信息(存放在inode中)和實際的數據(存放在數據塊中)關聯。每次操作一個文件的時候,文件路徑中的組件會被解析,相應的dentry會被獲取。為了加速未來的操作,dentry結構體被緩存在稱為dcache的數據結構中。任何時候,對dcache進行查找的數量都遠多于dcache的更新操作,因此,對dcache的訪問適宜用RCU原語進行保護。


  2.5.4 調試

  由于難于重現,并發相關的問題通常非常難調試。在編譯和測試代碼的時候使能SMP(CONFIG_SMP)和搶占(CONFIG_PREEMPT)是一種很好的理念,即便你的產品將運行在單CPU、禁止搶占的情況下。在Kernel hacking下有一個稱為Spinlock and rw-lock debugging的配置選項(CONFIG_DEBUG_SPINLOCK),它能幫助你找到一些常見的自旋鎖錯誤。Lockmeter(http://oss.sgi. com/projects/lockmeter/)等工具可用于收集鎖相關的統計信息。

  在訪問共享資源之前忘記加鎖就會出現常見的并發問題。這會導致一些不同的執行單元雜亂地“競爭”。這種問題(被稱作“競態”)可能會導致一些其他的行為。

  在某些代碼路徑里忘記了釋放鎖也會出現并發問題,這會導致死鎖。為了理解這個問題,讓我們分析如下代碼:

spin_lock(&mylock);?????/*?Acquire lock?*/

/*?... Critical Section ...?*/

if?(error) {????????????/*?This error condition occurs rarely?*/
??return?-EIO;?/*?Forgot to release the lock!?*/
}

spin_unlock(&mylock);???/*?Release lock?*/

  if (error)語句成立的話,任何要獲取mylock的線程都會死鎖,內核也可能因此而凍結。

  如果在寫完代碼的數月或數年以后首次出現了問題,回過頭來調試它將變得更為棘手。(在21.3.3節有一個相關的調試例子。)因此,為了避免遭遇這種不快,在設計軟件架構的時候,就應該考慮并發邏輯。

  2.6 proc文件系統

  proc文件系統(procfs)是一種虛擬的文件系統,它創建內核內部的視窗。瀏覽procfs時看到的數據是在內核運行過程中產生的。procfs中的文件可被用于配置內核參數、查看內核結構體、從設備驅動程序中收集統計信息或者獲取通用的系統信息。

  procfs是一種虛擬的文件系統,這意味著駐留于procfs中的文件并不與物理存儲設備如硬盤等關聯。相反,這些文件中的數據由內核中相應的入口點按需動態創建。因此,procfs中的文件大小都顯示為0。procfs通常在啟動過程中掛載在/proc目錄,通過運行mount命令可以看出這一點。

  為了了解procfs的能力,請查看/proc/cpuinfo、/proc/meminfo、/proc/interrupts、/proc/tty/driver /serial、/proc/bus/usb/devices和/proc/stat的內容。通過寫/proc/sys/目錄中的文件可以在運行時修改某些內核參數。例如,通過向/proc/sys/kernel/printk文件回送一個新的值,可以改變內核printk日志的級別。許多實用程序(如ps)和系統性能監視工具(如sysstat)就是通過駐留于/proc中的文件來獲取信息的。

  2.6內核引入的seq文件簡化了大的procfs操作。附錄C對此進行了描述。


  2.7 內存分配

  一些設備驅動程序必須意識到內存區的存在,另外,許多驅動程序需要內存分配函數的服務。本節我們將簡要地討論這兩點。

  內核會以分頁形式組織物理內存,而頁大小則取決于具體的體系架構。在基于x86的機器上,其大小為4096B。物理內存中的每一頁都有一個與之對應的struct page(定義在include/linux/ mm_types.h文件中):

  在32位x86系統上,默認的內核配置會將4 GB的地址空間分成給用戶空間的3 GB的虛擬內存空間和給內核空間的1 GB的空間(如圖2-5所示)。這導致內核能處理的處理內存有1 GB的限制?,F實情況是,限制為896 MB,因為地址空間的128 MB已經被內核數據結構占據。通過改變3 GB/1 GB的分割線,可以放寬這個限制,但是由于減少了用戶進程虛擬地址空間的大小,在內存密集型的應用程序中可能會出現一些問題。

圖2-5 32位PC系統上默認的地址空間分布

  內核中用于映射低于896 MB物理內存的地址與物理地址之間存在線性偏移;這種內核地址被稱作邏輯地址。在支持“高端內存”的情況下,在通過特定的方式映射這些區域產生對應的虛擬地址后,內核將能訪問超過896 MB的內存。所有的邏輯地址都是內核虛擬地址,而所有的虛擬地址并非一定是邏輯地址。

  因此,存在如下的內存區。

  (1) ZONE_DMA(小于16 MB),該區用于直接內存訪問(DMA)。由于傳統的ISA設備有24條地址線,只能訪問開始的16 MB,因此,內核將該區獻給了這些設備。

  (2) ZONE_NORMAL(16~896 MB),常規地址區域,也被稱作低端內存。用于低端內存頁的struct page結構中的“虛擬”字段包含了對應的邏輯地址。

  (3) ZONE_HIGH(大于896 MB),僅僅在通過kmap()映射頁為虛擬地址后才能訪問。(通過kunmap()可去除映射。)相應的內核地址為虛擬地址而非邏輯地址。如果相應的頁未被映射,用于高端內存頁的struct page結構體的“虛擬”字段將指向NULL。

  kmalloc()是一個用于從ZONE_NORMAL區域返回連續內存的內存分配函數,其原型如下:

  void *kmalloc(int count, int flags);

  count是要分配的字節數,flags是一個模式說明符。支持的所有標志列在include/linux./gfp.h文件中(gfp是get free page的縮寫),如下為常用標志。

  (1) GFP_KERNEL,被進程上下文用來分配內存。如果指定了該標志,kmalloc()將被允許睡眠,以等待其他頁被釋放。

  (2) GFP_ATOMIC,被中斷上下文用來獲取內存。在這種模式下,kmalloc()不允許進行睡眠等待,以獲得空閑頁,因此GFP_ATOMIC分配成功的可能性比用GFP_KERNEL低。

  由于kmalloc()返回的內存保留了以前的內容,將它暴露給用戶空間可到會導致安全問題,因此我們可以使用kzalloc()獲得被填充為0的內存。

  如果需要分配大的內存緩沖區,而且也不要求內存在物理上有聯系,可以用vmalloc()代替kmalloc():

  void *vmalloc(unsigned long count);

  count是要請求分配的內存大小。該函數返回內核虛擬地址。

  vmalloc()需要比kmalloc()更大的分配空間,但是它更慢,而且不能從中斷上下文調用。另外,不能用vmalloc()返回的物理上不連續的內存執行DMA。在設備打開時,高性能的網絡驅動程序通常會使用vmalloc()來分配較大的描述符環行緩沖區。

  內核還提供了一些更復雜的內存分配技術,包括后備緩沖區(look aside buffer)、slab和mempool;這些概念超出了本章的討論范圍,不再細述。


  2.8 查看源代碼

  內存啟動始于執行arch/x86/boot/目錄中的實模式匯編代碼。查看arch/x86/kernel/setup_32.c文件可以看出保護模式的內核怎樣獲取實模式內核收集的信息。

  第一條信息來自于init/main.c中的代碼,深入挖掘init/calibrate.c可以對BogoMIPS校準理解得更清楚,而include/asm-your-arch/bugs.h則包含體系架構相關的檢查。

  內核中的時間服務由駐留于arch/your-arch/kernel/中的體系架構相關的部分和實現于kernel/timer.c中的通用部分組成。從include/linux/time*.h頭文件中可以獲取相關的定義。

  jiffies定義于linux/jiffies.h文件中。HZ的值與處理器相關,可以從include/asm-your-arch/ param.h找到。

  內存管理源代碼存放在頂層mm/目錄中。

  表2-1給出了本章中主要的數據結構以及其在源代碼樹中定義的位置。表2-2則列出了本章中主要內核編程接口及其定義的位置。

  表2-1 數據結構小結

?

  表2-2 內核編程接口小結

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的Linux驱动开发必看详解神秘内核(完全转载)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

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