精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

1024在线播放| 激情国产一区| 欧美性xxxx在线播放| 91久久中文字幕| 色www亚洲国产阿娇yao| 91桃色在线| 国产色产综合产在线视频 | 四虎精品永久在线| 国产精品主播在线观看| 欧美丝袜丝交足nylons图片| 国新精品乱码一区二区三区18| 欧美a在线播放| 国产色99精品9i| 亚洲午夜精品网| 亚洲视频在线二区| 国产精品国产三级国产普通话对白| 狠色狠色综合久久| 亚洲男人第一av网站| 国产九九九视频| 日韩欧美精品电影| 亚洲成av人影院| 日韩精品在在线一区二区中文| 亚洲女同志亚洲女同女播放| 奇米影视一区二区三区| 午夜精品在线观看| 一本大道久久a久久综合婷婷| 超碰国产精品久久国产精品99| 啪啪小视频网站| 激情欧美日韩| 免费av在线一区| 四季av中文字幕| 国产精品45p| 欧美体内she精视频| 免费看毛片的网址| 91女主播在线观看| 91视频免费播放| 国产精品一区二区久久久久| 久久伊人成人网| 欧美一级淫片| 日韩一区二区免费电影| 能看的毛片网站| 国产素人视频在线观看| 国产91丝袜在线观看| 国产精品成人久久久久| 午夜毛片在线观看| 亚洲成人原创| 欧美国产乱视频| 极品蜜桃臀肥臀-x88av| 欧美精品第一区| 亚洲欧洲高清在线| 成人免费毛片糖心| 亚洲bt欧美bt精品777| 日韩一区二区免费在线观看| 无套内谢丰满少妇中文字幕| 天堂а在线中文在线无限看推荐| 久久青草伊人| 亚洲激情在线播放| 免费国产在线精品一区二区三区| 亚洲欧洲视频在线观看| 99在线精品视频| 亚洲影院色在线观看免费| 国产一区二区视频免费| 久久青草久久| 国产精品久久久久久久久影视| 疯狂试爱三2浴室激情视频| 仙踪林久久久久久久999| 伊人av综合网| 五月天精品在线| 99国产精品免费视频观看| 中文字幕在线日韩| 真实国产乱子伦精品一区二区三区| 99精品国产一区二区三区不卡| 国产一区喷水| 日本国产在线| 国产三级久久久| 亚洲精品日韩在线观看| 女女色综合影院| 一区二区三区欧美日| 亚洲精品一区二区久| 欧美精品午夜视频| 精品少妇久久久久久888优播| 婷婷色综合网| 色999日韩欧美国产| 熟女少妇a性色生活片毛片| 午夜激情一区| 国外成人性视频| 国产精品人人人人| 99人久久精品视频最新地址| 欧美福利在线观看| 日韩av电影网址| 免费日韩精品中文字幕视频在线| 国产做受高潮69| 自拍偷拍校园春色| 国模大尺度一区二区三区| 国产精品日韩欧美一区二区| 天堂在线一二区| 中文字幕日韩一区二区| 成年人看的毛片| 日本中文字幕一区二区| 欧美日韩国产电影| 男人的天堂影院| 欧美oldwomenvideos| 国模叶桐国产精品一区| 亚洲视频在线免费播放| 国产精品中文字幕一区二区三区| 91亚洲精品在线| 欧美巨乳在线| 一区二区不卡在线播放| 无码人妻精品一区二区三区66| 日韩精品一级| 91一区一区三区| 国产亚洲激情在线| 国产三级短视频| 自拍偷拍欧美| 日韩av电影免费观看高清| 精品乱码一区内射人妻无码| 成人一区二区三区视频| 精品亚洲欧美日韩| 日日夜夜精品一区| 亚洲成人7777| 免费在线观看日韩av| 欧美亚洲大陆| 久久夜色精品国产欧美乱| 国产精品30p| 精品一区二区三区蜜桃| 欧美一区二区高清在线观看| 黑人精品视频| 日韩无一区二区| 精品人妻一区二区三区蜜桃视频| 亚洲精品视频啊美女在线直播| 国产福利视频一区二区| 性xxxx视频| 一区二区三区美女视频| 亚洲18在线看污www麻豆| 一本色道久久综合亚洲精品酒店| 97精品国产91久久久久久| av毛片在线免费观看| 国产成人午夜视频| 亚洲资源在线网| 日本成人福利| 日韩经典中文字幕在线观看| 欧产日产国产v| 日韩大胆成人| 不卡的电视剧免费网站有什么| 亚洲春色在线| 综合在线影院| 亚洲性无码av在线| 天堂网一区二区| 久久嫩草精品久久久精品一| 美女福利视频在线| 老牛国内精品亚洲成av人片| 久久久久久91| 人妻精品一区二区三区| 国产亚洲欧美一区在线观看| 天堂…中文在线最新版在线| 美女一区二区在线观看| 欧美一区二区三区……| 天天在线女人的天堂视频| 欧美性xxxxx极品| 久久视频精品在线观看| 视频在线观看91| 色综合久久久久久久久五月| 美女18一级毛片一品久道久久综合| 亚洲视频在线观看免费| 色网站在线播放| 国产亚洲精品超碰| 亚洲国产成人va在线观看麻豆| 日韩成人动漫在线观看| 国产精品久久久久7777婷婷| 看女生喷水的网站在线观看| 欧美一区二区三区性视频| 精品欧美一区二区久久久久| 成人精品视频.| 日本三区在线观看| 成人同人动漫免费观看 | 欧美精品 国产精品| 一区二区国产日产| 日本污视频在线观看| 丁香婷婷综合激情五月色| 婷婷无套内射影院| 九九精品久久| 国产日韩欧美视频| 欧美18hd| 亚洲另类xxxx| 欧美国产一级片| 亚洲免费在线视频一区 二区| 性生交大片免费看l| 小嫩嫩精品导航| 亚洲精品一区二区三区樱花| 成人在线视频www| 亚洲精品久久久久中文字幕二区| 中文字幕在线观看1| 国产精品拍天天在线| 国产精品欧美性爱| 日本亚洲一区二区| 国产对白在线播放| 亚洲裸色大胆大尺寸艺术写真| 欧美伊久线香蕉线新在线| 免费黄色在线看| 亚洲第一级黄色片| 中文天堂在线资源| 香港成人在线视频| 成人午夜剧场视频网站| 国产美女精品人人做人人爽| 欧美 亚洲 视频| 国产日本亚洲| 国产999在线| 国产乱色在线观看| 精品视频www| 精品人妻一区二区三区日产乱码| 老司机精品在线| 亚洲国产精品久久久久久| 艳妇乳肉豪妇荡乳av无码福利| 亚洲综合无码一区二区| 在线观看天堂av| 成人av电影在线网| 97人人模人人爽人人澡| 青青草国产成人99久久| 91精品91久久久中77777老牛| 日韩久久电影| 国产在线欧美日韩| 日韩精品视频中文字幕| 成人精品久久av网站| 激情av在线播放| 久久久999国产精品| 国产一二三区在线| 亚洲精品久久久久| 亚洲成熟女性毛茸茸| 欧美视频中文在线看| 欧产日产国产v| 亚洲九九爱视频| 瑟瑟视频在线观看| 高清在线不卡av| www.超碰com| 国产欧美日本| 乱人伦xxxx国语对白| 亚洲黄色免费| 久久99久久99精品| 欧美日韩国产欧| 国产精品免费看久久久无码| 亚洲视频电影在线| 亚洲免费av网| 日韩精品电影| 亚洲午夜久久久久久久久电影网 | 狠狠人妻久久久久久| 中文在线免费| 精品久久久久久久久久久久久久久| 国产三级自拍视频| 欧美丰满美乳xxx高潮www| 亚洲一区在线观| 欧美日韩免费观看一区三区| 在线免费观看一级片| 欧美中文字幕亚洲一区二区va在线 | 欧美日韩国产成人在线91| 99热在线观看免费精品| 欧美性xxxxx极品娇小| 无码免费一区二区三区| 欧美主播一区二区三区美女| 中文字幕在线视频第一页| 精品久久久久久中文字幕| 国产又粗又爽视频| 欧洲精品一区二区三区在线观看| 免费无码国产精品| 欧洲视频一区二区| 国产情侣av在线| 精品国产乱码久久久久久图片 | 久久九九影视网| 一级黄色录像毛片| 亚洲少妇30p| 久久久久久久福利| 狠狠干狠狠久久| 最近中文字幕免费观看| 7777女厕盗摄久久久| 91精东传媒理伦片在线观看| 日韩美女视频在线| 一二三av在线| 欧美电影在线观看网站| 91视频九色网站| 国产精品国产| 精品欧美一区二区在线观看视频 | 成人性视频网站| 看看黄色一级片| 国产麻豆9l精品三级站| 欧美一区二区三区影院| www久久久久| 香蕉久久久久久久| 樱桃视频在线观看一区| 国产一级片免费| 日本韩国欧美国产| 加勒比在线一区| 日韩亚洲欧美在线观看| 日本视频在线观看一区二区三区| 亚洲国产日韩欧美在线图片| av在线电影网| 日韩中文在线观看| 老牛影视精品| 日韩极品精品视频免费观看| 国产黄色在线观看| 久久久久亚洲精品成人网小说| 日韩免费小视频| 亚洲字幕一区二区| 久久资源综合| 亚洲人成人77777线观看| 伊人久久亚洲热| 超碰在线资源站| 国产女人aaa级久久久级| 亚洲综合网在线| 欧美日韩视频免费播放| 国产成人av免费看| 一区二区三区天堂av| а√天堂中文在线资源8| 91精品在线观看视频| 午夜国产福利一区二区| 久久无码av三级| 欧美成人国产精品高潮| 狠狠色狠狠色综合日日小说| 国产哺乳奶水91在线播放| 最新国产精品拍自在线播放| 九色porny视频在线观看| 国产成一区二区| 亚洲裸色大胆大尺寸艺术写真| 欧美一级免费播放| 国产精品综合二区| 六十路息与子猛烈交尾| 成人欧美一区二区三区白人| 在线观看国产区| 国产视频精品一区二区三区| 超免费在线视频| 成人在线一区二区| 久久激情电影| 久久午夜夜伦鲁鲁一区二区| 久久久www成人免费毛片麻豆 | 日韩不卡一区二区三区| 美女搡bbb又爽又猛又黄www| 国产亚洲成aⅴ人片在线观看| 综合激情网五月| 日韩大陆毛片av| 性孕妇free特大另类| 精品国产乱码久久久久久蜜柚| 亚洲电影成人| 人妻无码中文久久久久专区| 国产aⅴ综合色| 成人免费观看网址| 国产精品三级| 无码人妻精品一区二区蜜桃网站| 日韩在线观看一区二区| 国产精品毛片一区二区| 日韩欧美国产中文字幕| 亚洲无码精品国产| 中文字幕亚洲一区| 国精一区二区三区| 91成人免费观看| 日韩欧美国产精品综合嫩v| 国产精品免费入口| 99久久精品免费精品国产| 久久黄色免费网站| 欧美日韩一区二区不卡| 懂色一区二区三区| 91av网站在线播放| 日韩丝袜视频| 99在线免费视频观看| 成人久久久精品乱码一区二区三区| 日本三级网站在线观看| 7777精品伊人久久久大香线蕉超级流畅 | 蜜桃视频日韩| 日韩精品福利网| 懂色av粉嫩av浪潮av| 欧美无砖专区一中文字| 成人在线播放免费观看| 亚洲va码欧洲m码| 欧美在线高清| 一边摸一边做爽的视频17国产| 色综合久久中文字幕| 免费不卡视频| 国产伦精品一区二区三区免 | 久久精品国产秦先生| 99国产精品免费视频| 亚洲成人福利片| 韩国av永久免费| 国产不卡av在线| 青青草原综合久久大伊人精品| 亚洲 中文字幕 日韩 无码| 中文字幕一区二区视频| 亚洲精品一区二区三区四区| 欧美一区二区三区免费观看| 97视频精品| 欧美丰满熟妇bbb久久久| 91成人在线免费观看| a天堂中文在线官网在线| 97中文在线| 久久久噜噜噜| 麻豆天美蜜桃91| 日韩精品中文字| 久久av偷拍| 黄色动漫在线免费看| 亚洲免费观看高清完整版在线观看熊 | 青青青爽久久午夜综合久久午夜 | 国产欧美欧美| 日日噜噜夜夜狠狠久久波多野| 亚洲精品国产精品国自产在线 |