精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Linux內核入門,包教會

原創
系統 Linux
Linux內核雖然是一般用戶可學可不學的內容,但可以說卻是Linux操作系統中最好玩的部分。尤其對于開發者而言,Linux內核開發絕對是最理想的磨練場所。本文將從零開始介紹被視為高深的Linux內核,內容涉及內核源代碼的下載,編譯,安裝,以及內核開發相關的內容。

【51CTO精選譯文】這年頭,Linux成了一個時髦詞。自詡對電腦玩的精通的學生和IT人士們,沒有哪個不在自己的電腦上安裝一、兩個Linux,并自覺趕上了時髦。然而,在Ubuntu或SUSE的論壇中,經常有這樣的對話:

“你學Linux學了這么久,都學到了什么?”

“哦,我現在Linux的安裝、升級、桌面美化都很熟練!你看我這是最新版的Ubuntu,桌面很漂亮吧!”

“……”

Linux社區中有一句名言:如果你進入你的操作系統不知道該做什么,那最好還是關掉電腦,一定有更重要的事等著你去做。說真的,如果對Linux命令不熟練,真的不能算是學過Linux。然而另一方面,Linux內核雖然是一般用戶可學可不學的內容,但可以說卻是Linux操作系統中最好玩的部分。尤其對于開發者而言,Linux內核開發絕對是最理想的磨練場所。51CTO編輯一直認為,國外之所以IT技術大拿林立,和他們從小接觸類UNIX系統、把玩內核開發是脫不了關系的。

下面是Linux內核開發者Robert Love寫的一篇入門文章,號稱“包教會”,推薦對Linux內核開發感興趣的學生、Linux愛好者、開發者以及系統管理員們一定不要錯過。當然,雖然標題說是包教會,你可能需要一定的Linux命令以及C語言的基礎。

以下是正文內容:

Linux內核一直都被視為學習Linux最難的一塊,相信大家也一定看過不少關于內核的文章,但捫心自問,你現在究竟掌握了多少?本文將從零開始介紹被視為高深的Linux內核,內容涉及內核源代碼的下載,編譯,安裝,以及內核開發相關的內容。

如何獲取Linux內核源代碼

下載Linux內核當然要去官方網站了,網站提供了兩種文件下載,一種是完整的Linux內核,另一種是內核增量補丁,它們都是tar歸檔壓縮包。除非你有特別的原因需要使用舊版本的Linux內核,否則你應該總是升級到最新版本。

使用Git

由Linus領頭的內核開發隊伍從幾年前就開始使用Git版本控制系統管理Linux內核了(參考閱讀:什么是Git?),而Git項目本身也是由Linus創建的,它和傳統的CVS不一樣,Git是分布式的,因此它的用法和工作流程很多開發人員可能會感到很陌生,但我強烈建議使用Git下載和管理Linux內核源代碼。

你可以使用下面的Git命令獲取Linus內核代碼樹的最新“推送”版本:

$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git

然后使用下面的命令將你的代碼樹與Linus的代碼樹最新狀態同步:

$ git pull

安裝內核源代碼

內核包有GNU zip(gzip)和bzip2格式。Bzip2是默認和首選格式,因為它的壓縮比通常比gzip更好,bzip2格式的Linux內核包一般采用linux-x.y.z.tar.bz2形式的文件名,這里的x.y.z是內核源代碼的具體版本號,下載到源代碼包后,解壓和抽取就很簡單了,如果你下載的是bzip2包,運行:

$ tar xvjf linux-x.y.z.tar.bz2

如果你下載的是gzip包,則運行:

$ tar xvzf linux-x.y.z.tar.gz

無論執行上面哪一個命令,最后都會將源代碼解壓和抽取到linux-x.y.z目錄下,如果你使用Git下載和管理內核源代碼,你不需要下載tar包,只需要運行git clone命令,它就會自動下載和解壓。

內核源代碼通常都會安裝到/usr/src/linux下,但在開發的時候最好不要使用這個源代碼樹,因為針對你的C庫編譯的內核版本通常也鏈接到這里的。

應用補丁

Linux內核開發人員會將自己的修改做成補丁與其它人員分享,而且補丁是增量的,增量補丁是從一個內核樹移動到另一個內核樹的有效方法,不用下載完整的內核包就可以升級內核,不僅可節省帶寬,也節省了內核升級時間,應用補丁之前先進入內核源代碼樹所在目錄,然后運行:

$ patch –p1 < ../patch-x.y.z

注意,補丁包也有明確的版本號,這里的版本號與Linux內核源代碼的版本號要一致,內核和補丁版本號不一致時,強制應用補丁會引起意想不到的后果。

內核源代碼樹介紹

內核源代碼樹分為許多目錄,它們下面又包含許多子目錄,源代碼樹的頂級目錄及其描述參見下表。

目錄 描述
arch 特定架構的源代碼
block 塊I/O層
crypto 加密API
Documentation 內核源代碼文檔
drivers 設備驅動
firmware 使用某個驅動需要的設備固件
fs VFS和獨立文件系統
include 內核頭
init 內核啟動和初始化
ipc 進程間通信
kernel 核心子系統,如調度器
lib 助手例行程序
mm 內存管理子系統和VM
net 網絡子系統
samples 示例,示范代碼
scripts 用于生成內核的腳本
security Linux安全模塊
sound 聲音子系統
usr 早期的用戶空間代碼(叫做initramfs)
tools 輔助Linux開發的工具
virt 虛擬化基礎設施

在源代碼樹的根目錄下還有很多文件需要說明,COPYING是內核許可描述文件(即GNU GPL v2),CREDITS是參與Linux內核的開發人員名單,MAINTAINERS列出了維護各個子系統和驅動的個人,Makefile是內核Makefile的基礎。

#p#

生成內核

生成內核其實很簡單,甚至比編譯和安裝其它系統級組件,如glibc還要簡單,從2.6版本開始,Linux內核引入了一個新的配置和生成系統,它使生產內核的操作變得更加簡單了。

配置內核

既然已經拿到內核源代碼,那我們在開始編譯前就可以根據需要自行配置和定制,可以編譯你指定的功能和想要的驅動,配置內核是生成內核必須的一步,因為內核提供了大量的功能,支持各種不同的硬件,有很多都需要配置,內核配置是由配置選項控制的,配置選項都有CONFIG前綴,例如,對稱多處理(SMP)是由CONFIG_SMP配置選項配置的,如果設置了這個選項,SMP就被啟用了,反之則被禁用,配置選項可以確定會生成哪個文件,也可以通過預處理指令操控代碼。

配置選項可以控制生成過程要么是布爾型,要么是三態型,布爾型就是“是”或“否”,大部分內核配置選項都屬于布爾型,如CONFIG_PREEMPT,而三態型則在“是”和“否”的基礎上,又增加一個“模塊”選項,模塊選項表示配置選項被設置了,但最后會編譯成模塊,而不是直接編譯進內核,模塊可以理解為可獨立動態載入的對象,一般來說,驅動配置通常都是三態型。

配置選項也可以是字符串或整數,這樣的選項不會控制生成過程,指定的值由內核源代碼訪問預處理宏時使用,例如,可以為某個配置選項指定靜態分配數組的大小。

Linux廠商也會隨發行版提供預編譯的內核,如Canonical為Ubuntu,或Red Hat為Fedora提供的內核,這樣的內核通常只啟用了需要的內核功能,幾乎所有驅動都被編譯成模塊了,這樣的內核提供了一個良好的基礎內核和廣泛的硬件模塊支持,無論如何,想要成為內核高手,你應該編譯自己的內核。

值得慶幸的是,內核提供了很多工具簡化配置 ,最簡單的工具是基于文本命令行的實用程序,如:

$ make config

這個工具會一個選項一個選項地配置,但用戶需要參與,如指定“是(y)”,“否(m)”還是“模塊(m)”,整個配置過程需要很長的時間,因此,除非是有人按小時計費請你升級內核,實在找不出別的理由用這種最原始的方法配置內核了,相反,有現成的基于ncurses的圖形化工具可以代替。

$ make menuconfig

或是基于gtk+的圖形化工具

$ make gconfig

上述三個工具都將配置選項分成多個類別,如“處理器類型和特征”,你可以在這些類別上來回移動,查看內核選項,當然也可以修改它們的設置了。

下面這個命令會根據你的架構創建一個默認的配置基礎。

$ make defconfig

雖然默認配置有些武斷(在i386上,默認配置是由Linus配置的),但如果你從未配置過內核,它提供了一個良好的開端。

配置選項存儲在源代碼樹根目錄下一個名叫.config的文件中,你可以打開這個文件手工編輯其中的配置選項,修改后或要在新的內核源代碼樹上應用現有配置文件,你可以使用下面的命令驗證和更新配置:

$ make oldconfig

在生成內核之前必須運行這個命令。

配置選項CONFIG_IKCONFIG_PROC指定了完整的內核配置文件壓縮包位置,默認是/proc/config.gz,這樣在生成新內核時要克隆現有的配置就變得非常簡單了。如果你當前的內核開啟了這個選項,你可以從/proc拷貝該配置文件,然后在此基礎上生成新的內核:

$ zcat /proc/config.gz > .config
$ make oldconfig

內核配置好后,使用下面的命令進行生成:

$ make

和2.6以前的內核不一樣,在生成內核前不再需要執行make dep命令了,依賴樹會自動維護,也不需要再指定特定的生成類型,如bzImage,或獨立生成模塊,默認Makefile規則會自動處理好一切。

將干擾信息最小化

在生成過程中會遭到警告和錯誤的干擾。最小化干擾信息的一個訣竅是重定向make的輸出,但仍然會看到一些警告和錯誤:

$ make > ../detritus

如果你想查看生成輸出,你可以事后閱讀這個文件,如果你完全不想看到任何輸出,那么就重定向到/dev/null:

$ make > /dev/null

同時執行多個生成作業

Make命令提供了一個功能可以將生成過程拆分成多個平行的作業,這些作業可以獨立運行,也可以并行運行,在多處理器系統上可以極大地提高生成速度,也提高了處理器利用率,因為生成大型源代碼樹會出現大量的I/O等待時間。

默認情況下,make只能拆分成一個作業,因為Makefiles常常會包含不正確的依賴信息,如果真是這樣,多個并行執行的作業將會引起混亂,最終會導致生成過程失敗,如果Makefiles中的依賴信息無誤,那么完全可以拆分成多個作業執行,如:

$ make –jn

這里的n表示拆分的作業數量,通常按每個處理器拆分成1-2個作業,例如,在一個16核心的機器上 ,你可以運行:

$ make -j32 > /dev/null

使用distcc或ccache等優秀的工具也可以大大提高生成速度。

#p#

安裝新內核

內核生成好之后,你需要安裝它,如何安裝于系統架構和引導加載程序有關,我們以x86架構,grub引導加載程序為例進行說明。

首先將arch/i386/boot/bzImage拷貝到/boot,重命名為vmlinuz- version,這里的version也是版本號,然后編輯/boot/grub/grub.conf,為新內核添加相應的項目,如果是使用LILO引導裝載程序,則修改/etc/lilo.conf文件,然后運行lilo。

模塊的安裝與系統架構無關,都是自動完成的,以root用戶運行:

% make modules_install

這個命令會將所有編譯好的模塊安裝到/lib/modules下對應的子目錄中。

生成過程會在源代碼樹根目錄下創建一個System.map文件,它包含一個符號查找表,映射內核符號到它們的起始地址,在調試期間可以用它將內存地址轉換成函數和變量名。

可能會遇到的問題

與普通用戶空間的應用程序相比,Linux內核有多個特殊的屬性,下面是我認為最重要的一些不同:

◆內核既不訪問C庫也不訪問標準C頭;

◆內核是用GNU C編碼的;

◆內核缺少用戶空間提供的內存保護;

◆內核不能容易地執行浮點運算;

◆內核有一個小型的固定大小的進程堆棧;

◆由于內核支持異步中斷和SMP,因此同步和并發是內核主要擔心的問題;

◆可移植性也很重要。

下面我們就逐個來了解一下這些問題,所有內核開發人員都必須記住它們。

#p#

無libc或標準頭

和用戶空間應用程序不一樣,內核并沒有鏈接到標準的C庫,也沒有鏈接到任何其它的庫,這樣設計的原因有很多,包括如先有雞還是先有蛋的問題,但主要原因還是速度和內核大小,不要說完整的C庫,就是它的一個子集也夠大,內核太大只會導致效率低下。

不要擔心,許多常用的libc函數都在內核中實現了,例如,常見的字符串操作函數就位于lib/string.c中,只需要包括它的頭文件<linux/string.h >就可以了。

這里的頭文件指的是內核源代碼樹中的頭文件,內核也只能使用樹內的頭文件,基礎文件位于源代碼根目錄的include/目錄下,例如,<linux/inotify.h>頭文件就位于include/linux/inotify.h。

與架構相關的頭文件則位于arch/<architecture>/include/asm,例如,如果在x86架構下編譯,與你架構相關的文件就是arch/x86/include/asm,只需要在引用這些頭的地方加上asm/前綴即可,如<asm/ioctl.h>。

漏掉的大部分都是類似printf()這樣的函數,內核不會使用printf(),但它提供了printk()函數,其表現絕不比printf()差,printk()會拷貝格式化的字符串到內核日志緩沖區,syslog程序就是從這里讀取信息的,其用法也和printf()類似:

printk("Hello world! A string '%s' and an integer '%d'\n", str, i);

printf()和printk()之間最大的不同是,printk()允許你指定一個優先級標記,syslogd使用這個標記確定在哪里顯示內核消息,下面是一個使用優先級標記的示例:

printk(KERN_ERR "this is an error!\n");

注意在KERN_ERR和打印的消息之間沒有逗號,這是故意這么設計的,優先級使用一個預定義的字符定義,在編譯期間它與打印的信息是串聯的。

GNU C

和許多Unix內核類似,Linux內核也是用C編寫的,但也許會讓人很意外,內核不是用嚴謹的ANSI C編寫的,內核開發人員用的卻是gcc(GNU編譯器集,包含了編譯內核和Linux C程序的C編譯器)中的各種語言擴展。

內核開發人員同時使用了C語言的ISO C99和GNU C擴展,這些變化讓Linux內核與gcc結合得更緊密,但最近又出現了一個編譯器 – 英特爾的C編譯器 – 也對gcc的功能支持得相當好,因此也可以用它來編譯Linux內核。最低支持的gcc版本是3.2,建議采用gcc 4.4或更高的版本編譯。使用ISO C99擴展也是可以的,因為C99是C語言的官方版本。

內聯函數

C99和GNU C都支持內聯函數,內聯函數是直接插入到每個函數調用的位置的,消除了函數調用和返回的開銷,允許進一步優化,因為編譯器可以同時優化調用者和被調用函數,但它也有缺點,代碼大小會增加,因為函數的內容被直接復制到所調用者內部了,因此也會增加內存消耗和指令緩存空間。內核開發人員一般在小型時間很關鍵的函數中才會使用內聯函數。

定義函數時,使用static和inline關鍵字聲明內聯函數,例如:

static inline void wolf(unsigned long tail_size)

函數必須先聲明后使用,否則編譯器就不能使函數內聯,一般做法是將內聯函數放在頭文件中,因為它們被標記為static,不會創建輸出函數,如果內聯函數僅在一個文件中使用,可以放在該文件的頂部。

在內核中,與復雜的宏相比,出于安全和可讀性方面考慮,內聯函數是首選。

內聯匯編

Gcc C編譯器允許在C函數中嵌入匯編指令,asm()編譯器指令用于內聯匯編代碼,例如,這個內聯匯編指令執行x86處理器的rdtsc指令,返回時間戳寄存器(tsc)的值:

unsigned int low, high;
asm volatile("rdtsc" : "=a" (low), "=d" (high));
/* low and high now contain the lower and upper 32-bits of the 64-bit tsc */

Linux內核是用C和匯編語言混合編寫的,與底層硬件相關的代碼很多都是用匯編語言寫的,剩下的大部分內核代碼都是直接用C編寫的。

分支注解

Gcc C編譯器內置了一個指令優化條件分支,內核將這個打包成易于使用的宏 - likely()和unlikely()。

先看下面這樣的if語句:

if (error) {
        /* ... */
}

將這個分支標記為非常不可能采用

/* we predict 'error' is nearly always zero ... */
if (unlikely(error)) {
        /* ... */
}

相反,將這個分支標記為非常可能采用

/* we predict 'success' is nearly always nonzero ... */
if (likely(success)) {
        /* ... */
}

當分支指令已經知道一個優先級,或你想在一種情況下優化另一種情況時應該使用上述指令,最重要的是,當分支正確標記時,這些指令會提升性能,但如果分支標記錯誤則會降低性能,在內核代碼中,unlikely()要使用得更多,因為if語句傾向于表示一種特殊情況。

無內存保護

當用戶空間的應用程序嘗試一個非法的內存訪問時,內核可以捕捉到錯誤,發送SIGSEGV信號,殺掉進程,如果內核嘗試一個非法的內存訪問時,結果就不受控制了,因為誰也無法去控制內核,這也是內核最主要的失誤。

此外,內核內存也是不可分頁的,因此你消耗的每個內存字節都比物理內存的一個字節要少。

不能(容易)使用浮點數

當用戶空間進程使用浮點指令時,內核要負責處理從整型到浮點模式的轉換。

與用戶空間不一樣,內核不能無縫支持浮點數,因為它自己不能輕易地捕捉到自己,在內核中使用浮點數需要手動保存和恢復浮點數寄存器,因此除非卻有必要,否則盡量不要在內核中做浮點運算。

小型,固定大小的堆棧

用戶空間可以靜態分配許多不同的堆棧,包括巨型結構和千元數組,這個行為是合法的,因為用戶空間有很大的堆棧,并可以動態增長。

內核堆棧不大也不是動態的,相反,它很小且是固定的,內核堆棧的精確大小根據架構有所不同,在x86上,堆棧大小是在編譯時確定的,一般是4KB或8KB,歷史上,內核堆棧有2頁,通常表示它處于32位架構上,大小是8KB,如果是16KB就表示是64位架構,總之大小是固定的,每個進程接收它自己的堆棧。

同步和并發

內核最容易受競爭條件影響,和一個單線程的用戶空間應用程序不一樣,有許多內核特性允許同時訪問共享資源,因此需要同步以防止競爭,特別是:

◆Linux是一種搶占式多任務操作系統,進程是由內核的進程調度器隨意調度和再次調度的,內核必須在這些任務之間同步;

◆Linux支持對稱多處理(SMP),因此,如果沒有適當的保護,在兩個或多個處理器上同時執行的內核代碼可能會同時訪問相同的資源;

◆中斷是異步發生的,因此,如果沒有適當的保護,在訪問資源期間也可能發生中斷,中斷處理程序可能就會訪問到相同的資源;

◆Linux是有優先權的,因此,如果沒有適當的保護,內核代碼可能會優先執行,訪問其它代碼正在使用的資源。

解決這些問題的一般方法是自旋鎖和信號量。

可移植性的重要性

雖然用戶空間應用程序一般不會太重視可移植性,但Linux的確是一個可移植性操作系統,應該保持一致,這意味著與架構無關的C代碼必須在大量的系統上正確地編譯和運行,與架構相關的代碼必須在內核源代碼樹中使用特定的目錄分隔開。

總結

可以肯定,內核有它獨特的性質,它有它自己的一些原則,不過,內核的復雜性和障礙與其它大型軟件項目相比,并沒有什么大的不同,Linux開發道路上最重要的一步是認識到內核并不可怕,不熟悉?當然!不可逾越?當然不是!

原文地址:http://www.informit.com/articles/article.aspx?p=1610334

【編輯推薦】

  1. 7月第2周系統升級錄:有關Linux內核集體升遷的那些事兒
  2. Linux內核修煉之道
  3. Linux管理員們,該刷新內核了

 

責任編輯:yangsai 來源: 51CTO.com
相關推薦

2021-09-28 07:12:09

Linux內核入口

2010-08-28 15:38:11

2010-01-07 13:44:54

Linux內核代碼

2012-02-19 15:53:02

筆記本評測

2022-03-03 18:18:53

BPF解釋器系統

2009-12-15 17:10:39

優化Linux

2009-12-15 14:29:04

2009-12-10 10:40:21

Linux ldd

2009-12-17 13:40:42

Linux網卡安裝

2021-02-20 06:08:07

LinuxWindows內核

2009-12-14 16:31:00

Linux安裝支付寶

2010-01-07 15:00:39

Redhat Ente

2009-12-11 10:55:16

Linux啟動腳本

2009-12-14 17:13:04

Linux系統修改共享

2009-12-25 17:35:39

Linux安裝real

2009-12-09 14:56:54

Linux查看目錄文件

2009-12-10 10:18:44

Apache安裝

2009-12-03 17:50:04

Linux Samba

2010-03-02 09:17:32

Linux local

2010-01-06 16:32:45

Linux操作系統
點贊
收藏

51CTO技術棧公眾號

国产在线精品播放| 亚洲色图第三页| 91黄色在线看| 人成免费电影一二三区在线观看| 天堂va蜜桃一区二区三区漫画版| 揄拍成人国产精品视频| 深爱五月综合网| 久久男人天堂| 日韩码欧中文字| 精品久久久久久一区二区里番| 亚洲男人天堂网址| 欧美一区二区三区久久精品茉莉花 | 国产亚洲人成网站在线观看| 色男人天堂av| 国产 日韩 欧美一区| 一区二区激情小说| 亚洲蜜桃av| 神马午夜在线观看| 精品一区二区精品| 国产999精品| 国产无遮挡又黄又爽在线观看| 成人在线免费小视频| 精品福利二区三区| 999热精品视频| 欧美大电影免费观看| 亚洲永久精品大片| 伊人婷婷久久| 免费a在线观看| 国产91精品精华液一区二区三区| 国产日本欧美视频| 成人h动漫精品一区二区下载| 欧美精品黄色| www日韩欧美| 人与嘼交av免费| 精品综合久久88少妇激情| 91精品国产综合久久福利| 美女网站色免费| 久久精品女人天堂av免费观看 | 欧产日产国产69| 亚洲视频狠狠| 色综合久久久888| 成人免费精品动漫网站| 91日韩欧美| xxxxx91麻豆| 99久久精品久久亚洲精品| 国产成人三级| 亚洲欧洲成视频免费观看| 30一40一50老女人毛片| 亚洲小说图片视频| 日韩av在线免播放器| 黄色在线免费播放| 久9re热视频这里只有精品| 欧美大片免费久久精品三p| 特黄特黄一级片| 精品一区二区三区视频在线播放| 欧美日产在线观看| 国产永久免费网站| **日韩最新| 制服丝袜中文字幕一区| 日韩av.com| 久久视频社区| 日韩视频免费观看高清完整版| 中文字幕55页| heyzo欧美激情| 亚洲成年人在线播放| 亚洲精品久久一区二区三区777| 日韩国产在线不卡视频| 精品不卡在线视频| 中文字幕狠狠干| 国产成人调教视频在线观看| 尤物九九久久国产精品的特点 | 中文乱码免费一区二区三区下载| 俺去啦;欧美日韩| 99久久99久久精品国产| 欧美特黄视频| 欧美在线播放视频| 色老头一区二区| 久久99精品国产| 91嫩草在线视频| 丰满人妻一区二区三区无码av| 国产aⅴ综合色| 精品一区日韩成人| 国产精品久久久久一区二区国产 | 香蕉成人影院| 7777精品伊人久久久大香线蕉经典版下载 | 国产欧美精品国产国产专区| 亚洲欧洲一区二区| 污的网站在线观看| 婷婷开心激情综合| 奇米影视四色在线| 一区二区亚洲视频| 亚洲天堂网在线观看| 欧美一级特黄高清视频| 伊人久久大香线蕉av超碰演员| 欧美一级片免费在线| 一级全黄少妇性色生活片| 丁香婷婷深情五月亚洲| 欧美精品一区二区视频| 黄色在线播放网站| 欧美日韩国产麻豆| 中文字幕视频三区| 日韩欧美影院| 久久精品国产亚洲一区二区| 黄色在线观看国产| 国产一区二三区好的| 久久久久无码国产精品一区| 午夜免费视频在线国产| 欧美日韩精品在线播放| 91aaa精品| 偷拍亚洲色图| 欧美国产日韩一区二区| 国产精品露脸视频| 99riav一区二区三区| 国产又黄又爽免费视频| 丝袜美腿诱惑一区二区三区| 欧美大片日本大片免费观看| 永久免费观看片现看| 国产精品日本| 国产精品传媒毛片三区| 日本福利在线| 91久久一区二区| 少妇一级淫片免费放播放| 91精品一区二区三区综合| 国产精品黄页免费高清在线观看| 亚洲欧美强伦一区二区| 亚洲欧美一区二区三区久本道91| 男女无套免费视频网站动漫| 久久久久久毛片免费看| 久久69精品久久久久久国产越南| 中文字幕乱码在线观看| 久久综合狠狠综合| 青娱乐自拍偷拍| 亚洲91网站| 美女国内精品自产拍在线播放| 中文字幕人妻丝袜乱一区三区| 91亚洲午夜精品久久久久久| 青娱乐自拍偷拍| 狠狠一区二区三区| 欧美日韩国产va另类| 国产美女免费看| 中文字幕一区在线| 中文字幕永久有效| 91综合视频| 国产深夜精品福利| 国产婷婷视频在线| 在线不卡免费av| 日韩激情小视频| 国内一区二区在线| 男女爱爱视频网站| 日韩一区二区三区色| 久久国产精品久久久| 国产女人18毛片18精品| 亚洲美女区一区| 少妇性l交大片7724com| 欧美午夜不卡| 国产日韩精品久久| 亚洲深夜视频| 一本色道久久综合亚洲精品小说| 高潮毛片又色又爽免费| 国产嫩草影院久久久久| 天天干天天玩天天操| 夜间精品视频| 成人精品一二区| free性欧美16hd| 日韩av网址在线观看| 日本中文字幕久久| 国产精品久久一级| 少妇高潮一69aⅹ| 一本久道综合久久精品| 欧美在线一区二区三区四区| 国产精品99| 欧美风情在线观看| 四虎精品成人影院观看地址| 在线观看成人小视频| 日韩在线中文字幕视频| 成人午夜视频在线| 国产精品99久久免费黑人人妻| 日本道不卡免费一区| 亚洲a中文字幕| 国产在线精彩视频| 中国人与牲禽动交精品| 精品久久久久中文慕人妻| 疯狂欧美牲乱大交777| 丰满的亚洲女人毛茸茸| 国产精品一区二区无线| 人妻熟妇乱又伦精品视频| 成人精品影院| 国产精品国色综合久久| 三级成人在线| 欧美精品九九久久| av在线免费观看网| 亚洲成人黄色网址| 亚洲一线在线观看| 午夜国产不卡在线观看视频| 国产欧美小视频| 99视频精品在线| 午夜天堂在线视频| 亚洲欧美日韩视频二区| 最新av网址在线观看| 天天操综合520| 91在线免费视频| 欧美二三四区| 久久久久久久国产精品| 日本三级在线播放完整版| 亚洲福利影片在线| 国产精品国产三级国产普通话对白| 亚洲一区二区免费视频| 国产三级aaa| 久久一区二区三区国产精品| 永久免费看片在线观看| 日本午夜精品一区二区三区电影| 97在线国产视频| 68国产成人综合久久精品| 视频二区一区| 中国av一区| 精品久久久久久一区| 999久久久久久久久6666| 91精品久久久久久久久青青| 少妇一区视频| 97av在线视频免费播放| 欧美78videosex性欧美| 久久精品亚洲国产| av色图一区| 亚洲欧洲在线播放| 天堂在线观看免费视频| 日韩免费一区二区| 国产精品国产三级国产普通话对白 | 亚洲欧美日韩在线一区| 丰满人妻一区二区三区免费视频 | 激情成人在线视频| 欧美日韩亚洲国产另类| 综合久久给合久久狠狠狠97色| 中文字幕有码在线播放| 久久久久久久久久久久久夜| 国产精品无码午夜福利| 91啪亚洲精品| av网站免费在线播放| 久久综合色播五月| 一级黄色电影片| 成人小视频免费观看| 中文字幕一二三| 国产精品2024| 超级砰砰砰97免费观看最新一期 | 波多野结依一区| 欧美激情视频一区二区| 日本在线视频网址| 欧美激情手机在线视频 | 欧美日韩国产欧| 日本福利视频在线观看| 国产综合视频| 亚洲精品蜜桃久久久久久| 黑人一区二区三区四区五区| 免费极品av一视觉盛宴| 亚洲午夜久久久久久尤物| 日韩一区二区三区免费看| 亚洲欧美精品一区二区三区| 午夜免费久久看| 亚洲男人的天堂在线视频| 欧美午夜宅男影院在线观看| 黄瓜视频在线免费观看| 欧洲视频一区二区| 国产精品久久久久久久成人午夜| 884aa四虎影成人精品一区| 精品毛片一区二区三区| 精品久久五月天| 人人妻人人澡人人爽精品日本| 亚洲国内高清视频| 超碰97在线免费观看| 久久伊人精品天天| 97人人在线视频| 国产97免费视| 精品国产第一国产综合精品| 99在线视频播放| 欧美人与物videos另类xxxxx| 欧美在线一二三区| 91精品动漫在线观看| 久久人人爽人人爽人人av| 日韩一级欧洲| 国产又猛又黄的视频| 国产一区二区三区免费播放| 亚洲欧美高清在线| 国产亚洲午夜高清国产拍精品| 国产第一页精品| 亚洲一区二区欧美日韩 | 欧美一级片在线看| 色呦呦免费观看| 亚洲图片在线综合| 日本高清在线观看| 日本在线观看天堂男亚洲| 国产午夜亚洲精品一级在线| 久久av一区二区| 99久久精品网站| 777久久久精品一区二区三区| 久久精品国内一区二区三区| 插我舔内射18免费视频| 亚洲欧洲三级电影| 亚洲综合久久网| 日韩欧美的一区| shkd中文字幕久久在线观看| 欧美黑人一级爽快片淫片高清| 日本综合久久| 国内视频一区二区| 9191国语精品高清在线| 国产麻花豆剧传媒精品mv在线| 国产成人自拍网| 国产99在线 | 亚洲| 精品久久久久久久大神国产| 国产理论片在线观看| 亚洲精品一区二区久| 蜜臀av在线| 91在线视频精品| gogogo高清在线观看一区二区| www.av毛片| 国产乱理伦片在线观看夜一区| 91社区视频在线观看| 欧美日韩在线视频一区| 成人激情四射网| 不卡av电影院| 黄色欧美视频| 欧美日韩在线不卡一区| 日韩午夜高潮| 日韩成人av影院| 亚洲乱码国产乱码精品精的特点 | 国产午夜精品久久久| 国产91足控脚交在线观看| 91香蕉嫩草影院入口| 日韩欧美不卡| jizz欧美激情18| 久久综合久久综合亚洲| 日产精品久久久久| 亚洲第一在线视频| 久草在线视频福利| 99re6热在线精品视频播放速度| 欧美高清在线| 亚洲激情在线看| 亚洲人成网站影音先锋播放| 一区二区日韩在线观看| 中文字幕亚洲综合| 国产极品一区| 国产精品美女在线播放| 久久er精品视频| 久草手机视频在线观看| 欧美日韩亚洲综合在线 欧美亚洲特黄一级 | 国产视频精品免费播放| 伊人成综合网站| 欧美凹凸一区二区三区视频| 先锋影音久久| 精品无码一区二区三区| 日本高清成人免费播放| 国产精品一级伦理| 国产女人18毛片水18精品| 亚洲精品99| 99国产精品免费视频| 亚洲图片有声小说| 视频一区二区三区在线看免费看| 欧美一区二区视频97| 国产aⅴ精品一区二区三区久久| 成人在线看视频| 国产欧美日韩另类视频免费观看 | 日韩pacopacomama| 神马影院午夜我不卡| 久久成人免费网站| 欧美日韩在线国产| 亚洲第一区在线观看| 免费观看亚洲| 亚洲国产一区二区精品视频| 国内外成人在线| 久久亚洲成人av| 亚洲精品一区中文字幕乱码| 欧美a视频在线| 亚洲中文字幕无码一区二区三区 | 精品无人区一区二区三区| 久久久久网站| 久久99久久99精品免费看小说| 精品999久久久| 成人国产精品一区二区免费麻豆| 中文字幕av久久| 不卡一区在线观看| 国产精品自拍第一页| 久久成人亚洲精品| 日韩理论电影中文字幕| 欧美精品性生活| 亚洲一区二区综合| yw193.com尤物在线| 岛国视频一区| 日韩成人伦理电影在线观看| 久久99久久久| 亚洲网站在线看| 在线一区二区三区视频| 欧美亚洲日本在线观看| 一区二区三区成人| 极品美乳网红视频免费在线观看| 91夜夜未满十八勿入爽爽影院 | 怡红院av一区二区三区| 飘雪影视在线观看免费观看 | 97视频在线播放| 天天综合一区| 中文字幕第20页| 精品国产91乱码一区二区三区| 欧美韩国日本|