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

Linux Kernel編譯和鏈接中的linker script語法詳解

移動開發 Android
先要講講這個問題是怎么來的。(咱們在分析一個技術的時候,先要考慮它是想解決什么問題,或者學習新知識的時候,要清楚這個知識的目的是什么)。

先要講講這個問題是怎么來的。(咱們在分析一個技術的時候,先要考慮它是想解決什么問題,或者學習新知識的時候,要清楚這個知識的目的是什么)。

我在編譯內核的時候,發現arch/arm/kernel目錄下有一個這樣的文 件:vmlinux.lds.S。第一眼看上去,想想是不是匯編文件呢?打開一看,好像不是。那它是干嘛的?而且前面已經說過,make V=1的時候,發現這個文件的用處在ld命令中,即ld -T vmlinux.lds.S,好像是鏈接命令用的,如下所示

如arm-linux-ld -EL -p --no-undefined -X --build-id -o vmlinux -T arch/arm/kernel/vmlinux.lds。man ld,得到-T的意思是:為ld指定一個Linker script,意思是ld根據這個文件的內容來生成最終的二進制。

也許上面這個問題,你從沒關注過,但是在研究內核代碼的時候,常常有地方說“ __init宏會在最后的模塊中生成一個特定的section,然后kernel加載的時候,尋找這個section中的函數”,說白了,上面這句話就是 說最后生成的模塊中,有一個特定的section,這又是什么東西?

好吧,希望上面的問題勾起你的好奇心。下面我們來掃盲,最后會給一個鏈接地址,各看官可以去那深造。
一 section是什么?
好吧,我們需要解釋一下平時編譯鏈接生成的二進制可執行程序(比如說ELF,EXE也行),so或者dll,內核(非壓縮的,參加本系列第一節內容、vmlinux),或者ko是怎么組織的。
其實,大家或多或少都知道這些二進制中包括有什么text/bss/data節(也叫section)。text節存儲的是代碼、data存儲的是已經初始化的靜態變量、bss節存儲的是未初始化的什么東西...
上面的東西我就不細究了。反正一點,一個二進制,最終會包含很多section。那么,為什么section叫text/bss/data,能叫別的名字嗎?
OK,可以。但是你得告訴ld,那么這些內容就通過-T選項指定一個linker script就行了。這些內容我們放到后面的實例中來介紹。
(再三強調,咱們在理論上只是拋磚引玉,希望有興趣的看官自己研究,注意和我們分享你的成果就行了。)
二 link script基礎知識介紹
linker script中的語法是linker command language(很簡單的language,大家不用害怕...)。那么LS的目的是什么呢?
  • LS描述輸入文件(也就是gcc -c命令產生的.o文件即object文件)中的section最終如何對應到一個輸出文件。這個其實好理解,例如一個elf由三個.o文件構成,每 個.o文件都有text/data/bss段,但最終的那一個elf就會將三個輸入的.o文件的段合并到一起。
好了,下面我們介紹一些基本知識:
  • ld的功能是將input文件組裝成一個output文件。這些文件內部的都有特殊 的組織結構,這種結構被叫做object file format。每一個文件叫做object file(這可能就是.o文件的來歷吧。哈哈),輸出文件也叫可執行文件(an executable),但是對于ld來說,它也是一種object文件。那么Object文件有什么特殊的地方呢?恩,它內部組織是按照 section(段、或者節,以后不再區分二者)來組織的。一句話,object文件內部包含段......
  • 每個段都有名字和size。另外,段內部還包含一些數據, 這些數據叫做section contents,以后稱段內容。每個段有不同的屬性。例如text段標志為可加載(loadable),表示該段內的contents在運行時候(當然 指輸出文件執行的時候)需要加載到內存中。另外一些段中沒有contents,那么這些段標示為allocatable,即需要分配一些內存(有時候這些 內存會被初始化成0,這里說的應該是BSS段。BSS段在二進制文件中沒有占據空間,即磁盤上二進制文件的大小比較小,但是加載到內存后,需要為BSS段 分配內存空間。),還有一些段屬于debug的,這里包含一些debug信息。
  • 既然需要加載到內存中,那么加載到內存的地址是什么 呢?loadable和allocable的段都有兩個地址,VMA:虛擬地址,即程序運行時候的地址,例如把text段的VMA首地址設置為 0x800000000,那么運行時候的首地址就是這個了。另外還有一個LMA,即Load memory address。這個地址是section加載時的地址。暈了吧?二者有啥區別?一般情況下,VMA=LMA。但也有例外。例如設置某數據段的LMA在 ROM中(即加載的時候拷貝到ROM中),運行的時候拷貝到RAM中,這樣LMA和VMA就不同了。---------》很難搞懂不是?這種方法用于初始 化一些全局變量,基于那種ROM based system。(問一個問題,run的時候,怎么根據section中的VMA進行相應設置?。??以后可能需要研究下內核中關于execve實現方面的內 容了)。關于VMA和LMA,大家通過objdump -h選項可以查看。
三 簡單例子
下面來一個簡單例子,

 SECTIONS
 {
       . = 0x10000;
       .text : { *(.text) }
       . = 0x8000000;
       .data : { *(.data) }
       .bss : { *(.bss) }
 }
  • SECTIONS是LS語法中的關鍵command,它用來描述輸出文件的內存布局。例如上例中就含text/data/bss三個部分(實際上text/data/bss才是段,但是SECTIONS這個詞在LS中是一個command,希望各位看官要明白)。
  • .=0x10000; 其中的.非常關鍵,它代表location counter(LC)。意思是.text段的開始設置在0x10000處。這個LC應該指的是LMA,但大多數情況下VMA=LMA。
  • .text:{*(.text)},這個表示輸出文件的.text段內容由所有輸入文件(*)的.text段組成。組成順序就是ld命令中輸入文件的順序,例如1.obj,2.obj......
  • 此后,由來了一個.=0x800000000;。如果沒有 這個賦值的,那么LC應該等于0x10000+sizeof(text段),即LC如果不強制指定的話,它默認就是上一次的LC+中間section的長 度。還好,這里強制指定LC=0X800000000.表明后面的.data段的開始位于這個地址。
  • .data和后面的.bss表示分別有輸入文件的.data和.bss段構成。
你看,我們從這個LC文件中學到了什么?
恩,我們可以任意設置各個段的LMA值。當然,絕大部分情況,我們不需要有自己的LS來控制輸出文件的內存布局。不過LK(linux kernel)可不一樣了......
 
四 霸王硬上弓---vmlinux.lds.S分析
 
OK,有了上面的基礎知識,下面我們霸王硬上弓,直接分析arch/arm/kernel/vmlinux.lds.S.雖然最終鏈接用的是vmlinux.lds,但是那個文件
由vmlinux.lds.S(這是一個匯編文件)得到,
arm-linux-gcc -E -Wp,-MD,arch/arm/kernel/.vmlinux.lds.d -nostdinc ...... -D__KERNEL__ -mlittle-endian ......
-DTEXT_OFFSET=0x00008000 -P -C -Uarm -D__ASSEMBLY__ -o arch/arm/kernel/vmlinux.lds     arch/arm/kernel/vmlinux.lds.S
所以,我們直接分析vmlinux.lds好了。
/*
   一堆注釋,這里就不再貼上了,另外,增加//號做為注釋標識
 * Convert a physical address to a Page Frame Number and back
 */
//OUTPUT_ARCH是LS語法中的COMMAND,用來指定輸出文件的machine arch。objdump -f可查詢所有支持的machine。另外
//這些東西涉及到一種叫BFD的。各位看官可以自己搜索下BFD的內容。
//下面這 表示輸出文件基于ARM架構
OUTPUT_ARCH(arm)   
//ENTRY也是一個command,用來設置入口點。這里表示入口點是stext 。根據LD的描述,入口點的意思就是程序運行的第一條指令。內核是一個模塊,大家把他想象
//成一個運行在硬件上的大程序就可以了。而我們的程序又是運行在內核至上的。比較下Java虛擬機以及運行在其上的Java程序吧......
ENTRY(stext)
//設置jiffies為jiffies_64
jiffies = jiffies_64;
//定義輸出文件的段
SECTIONS
{
//設置location count為0xc0008000,這個好理解吧?內核運行的地址全在C0000000以上
 . = 0xC0000000 + 0x00008000;
//定義一個.text.head段,由輸入文件中所有.text.head段組成
/*
LS語法中,關于seciton的定義如下:
section [address] [(type)] :
       [AT(lma)] [ALIGN(section_align)]
       [SUBALIGN(subsection_align)]
       [constraint]
       {
         output-section-command
         output-section-command
         ...
       } [>region] [AT>lma_region] [:phdr :phdr ...] [=fillexp]
其中,address為VMA,而AT命令中的為LMA。一般情況,address不會設置,所以它默認等于當前的location counter
*/
 .text.head : {
/*這個非常關鍵,咱們在內核代碼中經常能看到一些變量聲明,例如extern int __stext,但是卻找不到在哪定義的
其實這些都是在lds文件中定義的。這里得說一下編譯鏈接相關的小知識。咱們這知道大概即可,具體內容可以自己深入研究
假設C代碼中定義一個變量 int x = 0;那么
1 編譯器首先會分配一塊內存,用來存儲該變量的值
2 編譯器在程序的symbol表中,創建一項,用來存儲這個變量的地址
例如,上面的 int x = 0,就在symbol表中創建一x項,這個x項指向一塊內存,sizeof(int)大小,存儲的值為0。當有地方使用這個x的時候,編譯器會生成相應的代碼,
首先指向這個x的內存,然后讀取內存中的值。
上面的內容是C中一個變量的定義。但是Linker script中也可以定義變量,這時候只會生成一個symbol項,但是沒有分配內存。。例如_stext=0x100,那么會
創建一個symbol項,指向0x100的內存,但該內存中沒有存儲value。所以,我們在C中使用LS中定義的變量的話,只能取它的地址。下面是一個例子:
start_of_ROM   = .ROM;
end_of_ROM     = .ROM + sizeof (.ROM) - 1;
start_of_FLASH = .FLASH;
上面三個變量是在LS中定義的,分別指向.ROM段的開始和結尾,以及FLASH段的開始。現在在C代碼中想把ROM段的內容拷貝到FLASH段中,下面是C代碼:
extern char start_of_ROM, end_of_ROM, start_of_FLASH;
memcpy (& start_of_FLASH, & start_of_ROM, & end_of_ROM - & start_of_ROM);
注意其中的取地址符號&。C代碼中只能通過這種方式來使用LS中定義的變量. start_of_ROM這個值本身是沒有意義的,只有它的地址才有意義。因為它的值沒有初始化。
地址就指向.ROM段的開頭。
說白了,LS中定義的變量其實就是地址,即_stext=0x100就是C代碼中的一個地址 int *_stext=0x100。明白了?
最終的ld中會分配一個slot,然后存儲x的地址。也就是說,ld知道這些勾當。那么當然我們在LS中
也可以定義一個變量,然后在C中使用了。所以下面這句話實際上定義了一個_stext變量。在C中通過extern就可以引用了。但是這里有一個
比較關鍵的問題。C中定義的x=0,其值被初始化為0了。也就是slot...待補充
*/
  _stext = .;.
  _sinittext = .;
  *(.text.head)
 }
//定義.init段,由所有的.init.text/.cpuinit.text/.meminit.text組成
//這時的LC的值為.init的開始
 .init : { /* Init code and data        */
   *(.init.text) *(.cpuinit.text) *(.meminit.text)
//定義一個變量 _einitext,它的值為當前的LC,即.init的初值+*(.init.text) *(.cpuinit.text) *(.meminit.text)的大小。也就是說變量
//_einitext標示一個結尾。
  _einittext = .;
//下面這個變量 __proc_info_begin標示一個開頭 
  __proc_info_begin = .;
   *(.proc.info.init)  //所有.proc.info.init段內容在這
  __proc_info_end = .;//下面這個變量 __proc_info_end標示結尾,它和__proc_info_begin變量牢牢得把輸出文件.proc.info.init的內容卡住了。
//有了上面begin和end的介紹,后面就簡單了,大部分都是一個begin+end來卡住一段內容。根據前面的介紹,begin和end又可以在C程序中引用
//也就是我們通過Begin+end,就可以獲得卡住的內容了。例如我們把一些初始化的函數指針放到一個begin和end中。然后通過一個循環,不就是
//可以調用這些函數了么。最后我們就來個例子介紹下。
  __arch_info_begin = .;
   *(.arch.info.init)
  __arch_info_end = .;
  __tagtable_begin = .;
   *(.taglist.init)
  __tagtable_end = .;
  . = ALIGN(16);
  __setup_start = .;
   *(.init.setup)
  __setup_end = .;
  __early_begin = .;
   *(.early_param.init)
  __early_end = .;
  __initcall_start = .;
   *(.initcallearly.init)
__early_initcall_end = .;
    *(.initcall0.init) *(.initcall0s.init) *(.initcall1.init) *(.initcall1s.init) *(.initcall2.init) *(.initcall2s.init) *(.initcall3.init) *(.initcall3s.init) *(.initcall4.init) *(.initcall4s.init) *(.initcall5.init) *(.initcall5s.init) *(.initcallrootfs.init) *(.initcall6.init) *(.initcall6s.init) *(.initcall7.init) *(.initcall7s.init)
  __initcall_end = .;
  __con_initcall_start = .;
   *(.con_initcall.init)
  __con_initcall_end = .;
  __security_initcall_start = .;
   *(.security_initcall.init)
  __security_initcall_end = .;
  . = ALIGN(32);//ALIGN,表示對齊,即這里的Location Counter的位置必須按32對齊
  __initramfs_start = .;   //ramfs的位置
   usr/built-in.o(.init.ramfs)
  __initramfs_end = .;
  . = ALIGN(4096); //4K對齊
  __per_cpu_load = .;
  __per_cpu_start = .;
   *(.data.percpu.page_aligned)
   *(.data.percpu)
   *(.data.percpu.shared_aligned)
  __per_cpu_end = .;
  __init_begin = _stext;
  *(.init.data) *(.cpuinit.data) *(.cpuinit.rodata) *(.meminit.data) *(.meminit.rodata)
  . = ALIGN(4096);
  __init_end = .;
 }
//DISACARD是一個特殊的section,表示符合這個條件的輸入段都不會寫到輸出段中,也就是輸出文件中不包含下列段
 /DISCARD/ : { /* Exit code and data        */
  *(.exit.text) *(.cpuexit.text) *(.memexit.text)
  *(.exit.data) *(.cpuexit.data) *(.cpuexit.rodata) *(.memexit.data) *(.memexit.rodata)
  *(.exitcall.exit)
  *(.ARM.exidx.exit.text)
  *(.ARM.extab.exit.text)
 }
//省略部分內容
//ADDR為內置函數,用來返回VMA的
/*
這里舉個小例子,大家看看VMA和LMA到底有什么作用
SECTIONS
       {
       .text 0x1000 : { *(.text) _etext = . ; }  /.text段的VMA為0x1000,而且LMA=VMA
       .mdata 0x2000 : //.mdata段的VMA為0x2000,但是它的LMA卻在.text段的結尾
         AT ( ADDR (.text) + SIZEOF (.text) )
         { _data = . ; *(.data); _edata = . ; }
       .bss 0x3000 :
         { _bstart = . ; *(.bss) *(COMMON) ; _bend = . ;}
     }
看到了么?.mdata段運行的時候在0x2000,但是數據load地址卻在.text段后,所以運行的時候需要把.mdata段內容拷貝過去。
 extern char _etext, _data, _edata, _bstart, _bend;
     char *src = &_etext;  //_etext為.text端的末尾 VMA地址,但同時也是.mdata段LMA的開始,有LS種的AT指定
     char *dst = &_data;  //_data為mdata段的VMA,現在需要把LMA地址開始的內容拷貝到VMA開始的地方

     /* ROM has data at end of text; copy it. */
     while (dst < &_edata)
       *dst++ = *src++;   //拷貝....明白了?不明白的好好琢磨

     /* Zero bss. */
     for (dst = &_bstart; dst< &_bend; dst++)
       *dst = 0;  //初始化數據區域
 
*/
 .rodata : AT(ADDR(.rodata) - 0) {
  __start_rodata = .; 
  *(.rodata) *(.rodata.*) *(__vermagic) *(__markers_strings) *(__tracepoints_strings) 
  } 
  .rodata1 : AT(ADDR(.rodata1) - 0) { 
  *(.rodata1) 
  } 
 ......//省略部分內容
  _edata_loc = __data_loc + SIZEOF(.data);
 .bss : {
  __bss_start = .; /* BSS                */
  *(.bss)
  *(COMMON)
  _end = .;
 }
     /* Stabs debugging sections.    */
 .stab 0 : { *(.stab) }
 .stabstr 0 : { *(.stabstr) }
 .stab.excl 0 : { *(.stab.excl) }
 .stab.exclstr 0 : { *(.stab.exclstr) }
 .stab.index 0 : { *(.stab.index) }
 .stab.indexstr 0 : { *(.stab.indexstr) }
 .comment 0 : { *(.comment) }
}
//ASSERT是命令,如果第一個參數為0,則打印第二個參數的信息(也就是錯誤信息),然后ld命令退出。
ASSERT((__proc_info_end - __proc_info_begin), "missing CPU support")
ASSERT((__arch_info_end - __arch_info_begin), "no machine record defined")
 
五  內核代碼中使用LS中定義的變量
咱們看一個小例子
[-->init/main.c]
extern initcall_t __initcall_start[], __initcall_end[], __early_initcall_end[]; //這幾個值在LS中定義。大家可以在上面搜索下
static void __init do_initcalls(void)
{
    initcall_t *call;
    //上面已經定義成數組了,所以下面這些變量直接取的就是指針,和上面例子中使用&一個意思,反正不能用value
    for (call = __early_initcall_end; call < __initcall_end; call++)
        do_one_initcall(*call);

    /* Make sure there is no pending stuff from the initcall sequence */
    flush_scheduled_work();
}
六 總結
關于LS的詳細文檔,見下面的網址:
上面文檔寫得比較粗,但大家知道兩點即可:
  1. LK源碼中那些找不到來源的變量是怎么來的---》在LS定義。
  2. VMA和LMA是怎么回事。

 

責任編輯:張葉青 來源: 博客園
相關推薦

2010-02-25 15:11:48

Linux Makef

2010-03-01 16:40:40

Linux Makef

2010-02-24 16:01:39

Linux Makef

2020-06-01 19:00:42

Linux軟鏈接硬鏈接

2023-11-15 08:27:46

Linux系統

2022-10-21 08:18:54

Linuxln 命令

2009-12-23 10:36:48

Linux操作系統

2009-08-03 11:54:34

linux at命令linux at命令詳cron

2017-01-15 15:27:51

Linux軟連接和硬鏈接

2021-03-18 11:20:44

Linux kerne漏洞系統

2010-06-30 10:39:45

Linux SNMP

2022-05-18 07:58:21

Linux程序編譯代碼

2019-03-04 08:14:35

LinuxIDBash

2019-11-01 11:06:02

Linux操作系統Windows

2020-10-13 09:23:57

LinuxKernel調度器

2022-09-14 08:03:56

CentOS 7RPMgcc版本

2010-11-11 10:18:59

select into

2010-01-19 09:23:50

2010-01-26 09:07:50

2023-12-21 13:59:41

點贊
收藏

51CTO技術棧公眾號

中文字幕乱码中文字幕| av地址在线观看| 国产黄色免费在线观看| 蜜臀av国产精品久久久久| 久久av中文字幕| 中文在线一区二区三区| 在线免费成人| 福利视频导航一区| 黄色高清视频网站| 日本一区高清| 国产一本一道久久香蕉| 97视频免费看| 婷婷社区五月天| 欧美jizz19性欧美| 91精品国产福利在线观看| 每日在线更新av| 韩国av网站在线| 久久综合九色综合欧美98| 成人久久久久久| 亚洲天堂男人av| 欧美日韩免费| 日韩中文字幕在线精品| 少妇特黄一区二区三区| 亚洲成人黄色| 7777精品伊人久久久大香线蕉完整版 | 国产精品女同一区二区| 亚洲伊人观看| 久久久久久久久电影| 永久av免费网站| 精品香蕉视频| 亚洲免费中文字幕| 午夜不卡久久精品无码免费| 深夜福利一区二区三区| 欧美日韩一本到| 成年人黄色片视频| 免费一二一二在线视频| 亚洲第一在线综合网站| 日韩一二区视频| 久操视频在线免费播放| 国产精品污污网站在线观看| 日韩国产高清一区| 加勒比一区二区三区在线| 99久久久精品免费观看国产蜜| 999国内精品视频在线| 91影院在线播放| 蜜桃av一区二区三区电影| 国产精品99久久久久久久久久久久| 日本熟妇毛茸茸丰满| 在线不卡亚洲| 97久久精品国产| 日本三级片在线观看| 激情文学一区| 午夜精品蜜臀一区二区三区免费| 久久久美女视频| 韩国欧美一区| 久久露脸国产精品| 久久精品视频9| 亚洲大胆av| 91po在线观看91精品国产性色| 国产大片aaa| 99国产精品私拍| 5566成人精品视频免费| 成人a v视频| 美女一区二区视频| 成人免费自拍视频| 亚洲第一天堂网| 成人黄色一级视频| 久久综合九色99| av网站在线播放| 亚洲欧美日韩国产综合在线 | 亚洲毛片在线| 欧美与欧洲交xxxx免费观看 | 欧美一区二区网站| 无码人妻一区二区三区免费n鬼沢| 天堂精品久久久久| 日韩精品中文字幕久久臀| 91国模少妇一区二区三区| 欧美精品色图| 欧美老女人在线视频| 国产精品30p| 久久人人精品| 国产日韩精品视频| 韩国av永久免费| 久久免费电影网| 宅男在线精品国产免费观看| 久久久123| 91久久免费观看| 手机在线国产视频| 久久99国产精品久久99大师| 亚洲天堂av在线免费观看| 裸体武打性艳史| 亚洲欧美日韩国产一区| 成人激情在线观看| 午夜影院免费视频| 亚洲天堂av老司机| 亚洲精品无码久久久久久| 激情久久99| 亚洲黄色av网站| 中国1级黄色片| 国产深夜精品| 3d精品h动漫啪啪一区二区| 欧美色18zzzzxxxxx| 亚洲精品免费一二三区| 国产女女做受ⅹxx高潮| 韩国三级成人在线| 亚洲色图国产精品| 国产一级黄色av| 青青草国产精品97视觉盛宴| 激情久久av| 少女频道在线观看免费播放电视剧| 懂色aⅴ精品一区二区三区蜜月| 污污的网站免费| 亚洲黄页网站| 国内成人精品视频| 99产精品成人啪免费网站| 国产视频一区二区在线观看| 成人在线视频一区二区三区| 成人一级福利| 欧美成人一区二区三区片免费 | 9.1在线观看免费| 国产精品久久久久久久久久10秀| 日韩**中文字幕毛片| 亚洲欧美另类综合| 亚洲人成7777| 亚洲人视频在线| 欧美一区二区三| 欧美最猛黑人xxxx黑人猛叫黄| 亚洲AV无码一区二区三区少妇| 日本一区二区三级电影在线观看| 成人在线免费在线观看| 美国一区二区| 97国产精品视频| 亚洲精品成人区在线观看| 一区视频在线播放| 久久人人爽av| 欧美高清视频手机在在线| 国产精品久久久久久久久免费 | 成人免费毛片播放| 校花撩起jk露出白色内裤国产精品| 欧美国产日韩在线| www.日日夜夜| 一个色在线综合| 成人免费播放视频| 国产精品99一区二区| 97在线中文字幕| 欧洲黄色一区| 亚洲国产女人aaa毛片在线| 日本少妇激情舌吻| 成人精品视频一区| 黄色一级在线视频| 免费成人三级| 国产精品h在线观看| 国产精品天堂| 欧美日韩激情在线| 欧美h片在线观看| 国产毛片精品国产一区二区三区| 色呦呦网站入口| 深夜福利一区| 97超级碰碰人国产在线观看| 四虎影视2018在线播放alocalhost| 五月激情六月综合| 亚洲熟妇无码av| 日韩精品一级中文字幕精品视频免费观看 | 国产精品视频在线免费观看| 黄在线观看免费网站ktv| 亚洲欧美一区二区三区情侣bbw | 手机在线免费看毛片| 国产精品自在在线| 日韩视频在线视频| 九九亚洲精品| 成人黄色短视频在线观看| 香蕉久久aⅴ一区二区三区| 精品国产精品一区二区夜夜嗨| 国产精品theporn动漫| 91蜜桃婷婷狠狠久久综合9色| 精品www久久久久奶水| 国产精品99在线观看| 国产精品乱码一区二区三区| 69久成人做爰电影| 日韩一区av在线| 欧美一级淫片aaaaaa| 在线观看国产一区二区| 欧美一区二区三区爽爽爽| 99r国产精品| 91高清国产视频| 亚洲另类黄色| 一级一片免费播放| 国产一区二区三区不卡av| 国产精品成人av性教育| 欧美aaaaaaa| 夜夜嗨av一区二区三区四区| av中文字幕观看| 欧美性色视频在线| 天天鲁一鲁摸一摸爽一爽| 成人aa视频在线观看| 视频二区在线播放| 亚洲人体大胆视频| 正在播放精油久久| 免费精品国产| 成人免费看片网址| 国产精品诱惑| 91高清视频免费| 18加网站在线| 伊人激情综合网| 日本高清视频www| 在线电影欧美成精品| 成人毛片在线播放| 亚洲一区二区三区中文字幕| 一级黄色录像毛片| 91啪亚洲精品| 蜜臀视频在线观看| 韩国理伦片一区二区三区在线播放| 青青草原成人网| 午夜精品免费| 这里只有精品66| 欧美丝袜一区| 久久久精彩视频| 国产成人夜色高潮福利影视 | 欧美美女啪啪| 999国内精品视频在线| 91精品福利观看| 国产精品欧美一区二区| 亚洲精品mv| 2019中文字幕在线观看| 国产高清在线a视频大全| 久久综合电影一区| 天天影视久久综合| 亚洲网址你懂得| 欧美美女搞黄| 亚洲区一区二区| 欧美777四色影视在线| 亚洲精品久久久久久久久久久久| 精品久久国产视频| 日韩亚洲欧美在线| 精品国产一级片| 日韩欧美色电影| 国产精品无码在线播放| 欧美日韩国产bt| 一区二区三区精| 欧美亚洲日本一区| 亚洲精品91天天久久人人| 欧美在线小视频| 国产日韩在线免费观看| 在线看国产一区二区| 久久久精品毛片| 欧美日韩性生活| 97caocao| 日韩三级在线观看| 亚洲国产日韩在线观看| 欧美精品一区二区三区久久久| 亚洲成人一二三区| 精品国产91洋老外米糕| 深爱激情五月婷婷| 精品一区二区三区四区在线| 日本一区视频| 在线观看日韩欧美| 麻豆传媒在线完整视频| 久久夜精品va视频免费观看| 午夜影院免费在线| 欧美精品福利视频| 性爽视频在线| 国产精品久久久久aaaa九色| 国产精品第一| 亚洲综合中文字幕在线| av一级亚洲| 欧美尤物一区| 一区二区电影在线观看| 成人精品视频在线播放| 亚洲免费婷婷| 日韩肉感妇bbwbbwbbw| 国产精品中文字幕欧美| 欧美熟妇精品一区二区蜜桃视频 | 国产日产精品一区二区三区的介绍| 成人欧美一区二区三区在线播放| 日本精品人妻无码77777| 五月综合激情婷婷六月色窝| 精品久久久久久久久久久国产字幕| 欧美精品电影在线播放| 成人免费视频国产| 亚洲系列中文字幕| 午夜影院免费在线| 国产aⅴ夜夜欢一区二区三区| 亚洲三级在线| 久久久一本精品99久久精品| 色婷婷色综合| 国产av人人夜夜澡人人爽麻豆| 日韩精品国产欧美| 国产调教打屁股xxxx网站| 久久精品视频一区| 成人免费毛片东京热| 色欧美片视频在线观看在线视频| 国产精品女人久久久| 亚洲欧美激情视频| 久久亚洲导航| 国产欧美日韩中文| 日韩a级大片| 欧洲精品视频在线| 日韩经典中文字幕一区| 欧美激情 亚洲| 成人欧美一区二区三区白人| 麻豆久久久久久久久久| 日韩丝袜情趣美女图片| 成人亚洲综合天堂| 午夜精品久久久久久久99黑人 | 久久精品国产99精品国产亚洲性色| 欧美电影一二区| 人妻少妇被粗大爽9797pw| 国产99久久久国产精品免费看| a级片在线观看| 亚洲成av人在线观看| 国产视频手机在线| 中文国产亚洲喷潮| 欧美理论影院| 国产无套精品一区二区| 欧美二区不卡| 波多野结衣国产精品| 国产日韩v精品一区二区| 97免费在线观看视频| 欧美www视频| a免费在线观看| 成人黄色免费看| 成人精品影院| 日韩无套无码精品| 91麻豆免费观看| 国产一级淫片a| 精品少妇一区二区三区在线播放| 麻豆影院在线观看| 国产精品久久久av| 欧美手机在线| 黄色一级二级三级| 国产日韩欧美制服另类| 日本一区二区免费电影| 日韩国产欧美区| 蜜桃视频在线网站| 久久精品五月婷婷| 一本久久综合| 噜噜噜在线视频| 欧美日韩亚洲视频| 神马精品久久| 日本91av在线播放| 你懂的一区二区三区| 可以免费观看av毛片| 国产片一区二区| 在线观看黄色国产| 日韩在线中文视频| 国产精品视频一区二区三区综合 | 九九热久久66| 亚洲一区亚洲| 欧美三级视频网站| 欧美高清dvd| 欧美日韩经典丝袜| 动漫一区二区在线| 99在线热播精品免费99热| 波多野结衣福利| 欧美色爱综合网| 好吊日视频在线观看| 99国产在线视频| 日韩一区二区久久| 亚洲精品国产一区黑色丝袜 | 91av国产在线| 精品一区在线| 我看黄色一级片| 亚洲欧美日韩国产成人精品影院 | 一区二区三区视频免费在线观看| 456成人影院在线观看| 亚洲伊人婷婷| 高清日韩电视剧大全免费| 97免费在线观看视频| 国产亚洲视频在线| 日韩在线精品强乱中文字幕| 国产黄色一级网站| 国产精品色在线| 亚洲国产精品二区| 日本在线观看天堂男亚洲| 日韩欧美高清在线播放| 伊人久久久久久久久| 色综合天天综合在线视频| 91ph在线| 国产视频一区二区不卡| 日产国产高清一区二区三区| 少妇人妻丰满做爰xxx| 亚洲欧美日韩第一区| 国产视频一区二| 成年人视频网站免费观看| 国产精品五月天| 五月婷婷六月丁香| 成人写真视频福利网| 亚洲永久免费| 天天看片中文字幕| 亚洲男人天堂久| 日韩在线观看中文字幕| 亚洲欧美另类动漫| 亚洲一区二区欧美| 蜜桃视频网站在线| 欧美精品一区三区在线观看| 国产精品亚洲专一区二区三区 | 国产高清视频一区| 在线观看日本视频| 欧美日韩xxx| 91欧美在线|