日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

bzImage的概要生成过程

發(fā)布時間:2025/3/20 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bzImage的概要生成过程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1 找到執(zhí)行目標bzImage
A make bzImage → /top/Makefile
ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/)
include arch/$(ARCH)/Makefile
注解:對于386架構而言,ARCH將會被展開成i386,由于bzImage目標在當前的Makefile中并未找到,因此會到該Makefile中包含的子Makefile中尋找,而/top/arch/i386/Makefile中包含了bzImage目標,故最終會跳到那里去執(zhí)行。

B make bzImage → /top/Makefile → /top/arch/i386/Makefile
MAKEBOOT = $(MAKE) -C arch/$(ARCH)/boot
vmlinux: arch/i386/vmlinux.lds
bzImage: vmlinux
@$(MAKEBOOT) bzImage
注解:在這里make bzImage才得以被執(zhí)行,注意這里表要依靠目標vmlinux,同時給目標vmlinux增加ld腳本arch/i386/vmlinux.lds,而vmlinux定義在/top/Makefile中,當vmlinux完全生成后,才會執(zhí)行下面的@$(MAKEBOOT) bzImage。
2 vmlinux的生成
A make bzImage → /top/Makefile
vmlinux: $(CONFIGURATION) init/main.o init/version.o linuxsubdirs
$(LD) $(LINKFLAGS) $(HEAD) init/main.o init/version.o /
--start-group /
$(CORE_FILES) /
$(DRIVERS) /
$(NETWORKS) /
$(LIBS) /
--end-group /
-o vmlinux
注解:這里CONFIGURATION沒有用,在使用.config當前條件下可以認為未定義,make在碰到該未定義關鍵字時自動略過。而回到這里的時候,vmlinux的依賴已經變成了$(CONFIGURATION) init/main.o init/version.o linuxsubdirs arch/i386/vmlinux.lds 。至于其他的定義,分別如下:
CROSS_COMPILE =
TOPDIR := $(shell if [ "$$PWD" != "" ]; then echo $$PWD; else pwd; fi)
LD = $(CROSS_COMPILE)ld
CC = $(CROSS_COMPILE)gcc
CORE_FILES =kernel/kernel.o mm/mm.o fs/fs.o ipc/ipc.o(注意和下面對CORE_FILES的擴展)
SUBDIRS =kernel drivers mm fs net ipc lib
另外在經過/top/arch/i386/Makefile之后:
LD=$(CROSS_COMPILE)ld -m elf_i386
OBJCOPY=$(CROSS_COMPILE)objcopy -O binary -R .note -R .comment -S
LDFLAGS=-e stext
LINKFLAGS =-T $(TOPDIR)/arch/i386/vmlinux.lds $(LDFLAGS)
vmlinux: arch/i386/vmlinux.lds
HEAD := arch/i386/kernel/head.o arch/i386/kernel/init_task.o
SUBDIRS += arch/i386/kernel arch/i386/mm arch/i386/lib
可見這些變量定義已經被找到,同時LD以及OBJCOPY還被重新定義,vmlinux增加了依賴。
init/version.o: init/version.c include/linux/compile.h include/config/MARKER
$(CC) $(CFLAGS) $(CFLAGS_KERNEL) -DUTS_MACHINE='"$(ARCH)"' -c -o init/version.o init/version.c
init/main.o: init/main.c include/config/MARKER
$(CC) $(CFLAGS) $(CFLAGS_KERNEL) $(PROFILING) -c -o $*.o $<

關鍵點一:DRIVERS
這里關于DRIVERS需要特殊說明下,從/top/Makefile中可知:
ifeq (.config,$(wildcard .config))
include .config
endif

DRIVERS-y :=
DRIVERS =drivers/block/block.o /
drivers/char/char.o /
drivers/misc/misc.o /
drivers/net/net.o /
drivers/media/media.o
DRIVERS-$(CONFIG_PARPORT) += drivers/parport/driver.o
…….
DRIVERS-$(CONFIG_DRM) += drivers/char/drm/drm.o
DRIVERS += $(DRIVERS-y)
這里的首先解釋下ifeq (.config,$(wildcard .config)) ,$(wildcard .config)表示wildcard函數(shù),而.config是該函數(shù)的參數(shù),這個函數(shù)表示當前目錄下是否存在.config文件,如果存在就返回.config,如果不存在就返回空,一般情況下,我們在編譯內核的時候,都會首先執(zhí)行make menuconfig然后save,這時候就會在/top目錄下生成一個.config文件,因此當make走到此處的時候,該條件為真,也就是將會include .config 。.config文件中的內容一般如下:
…..
CONFIG_PARPORT =y
CONFIG_DRM =y
…..
也就是我們在make menuconfig中選擇某個選項的時候,相應的變量例如CONFIG_X86_BSWAP的值就被設置成y,而在前面/top/Makefile中DRIVERS-y:則會依據(jù)這些宏定義而不斷地增加需要編譯的對象,例如DRIVERS-$(CONFIG_PARPORT) += drivers/parport/driver.o就表示,如果CONFIG_PARPORT=y,也就是我們在make menuconfig的時候,選擇了parport,則.config將會設置CONFIG_PARPORT =y,而/top/Makefile中又包含了.config,因此DRIVERS-$(CONFIG_PARPORT) += drivers/parport/driver.o就被擴展成: DRIVERS-y += drivers/parport/driver.o。如果沒選擇parport,則就被擴展成DRIVERS- += drivers/parport/driver.o,而DRIVERS-在Makefile中時不會用到的,但是從DRIVERS += $(DRIVERS-y)可知,DRIVER-y是被合并到DRIVERS中的,DRIVERS又被vmlinux所使用,故最終將會將drivers/parport/driver.o編譯到vmlinux中去的。至于NETWORKS、LIBS和DRIVERS類似,這里就不再詳敘。

關鍵點二:linuxsubdirs
關于linuxsubdirs其最后的展開就是make -C 所有的子目錄SUBDIRS=kernel drivers mm fs net ipc lib(也是在/top/Makefile中定義的),而其在編譯每個子目錄的時候,子目錄決定是否編譯相應的對象文件也是依賴于.config中的類似CONFIG_PARPORT =y的定義。

關鍵點三:關于--start-group ARCHIVES --end-group
ARCHIVES為一系列的對象文件,所有的這些對象中的符號引用將會共享。
The ARCHIVES should be a list of archive files. They may be either explicit file names, or `-l' options. The specified archives are searched repeatedly until no new undefined references are created. Normally, an archive is searched only once in the order that it is specified on the command line. If a symbol in that archive is needed to resolve an undefined symbol referred to by an object in an archive that appears later on the command line, the linker would not be able to resolve that reference. By grouping the archives, they all be searched repeatedly until all possible references are resolved. Using this option has a significant performance cost. It is best to use it only when there are unavoidable circular references between two or more archives.

關鍵點四:關于Rules.make
在所有的linuxsubdirs中的Makefile中都有include Rules.make語句,而Rules.make中包含了一些通用的編譯規(guī)則。

最終展開為:
gcc -D__KERNEL__ -I/root/linux/include -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -fno-strict-aliasing -pipe -mpreferred-stack-boundary=2 -march=i686 -c -o init/main.o init/main.c
gcc -D__KERNEL__ -I/root/linux/include -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -fno-strict-aliasing -pipe -mpreferred-stack-boundary=2 -march=i686 -DUTS_MACHINE='"i386"' -c -o init/version.o init/version.c
這里解釋下各個符號參數(shù)的含義:
&#61548; -DXX,將源碼中所有的宏XX 替代為1;
&#61548; -I,增加頭文件搜索目錄;
&#61548; -Wall,打開所有的可選警告;
&#61548; -Wstrict-prototypes,如果定義或者聲明的函數(shù)沒有指定參數(shù)類型,則警告;
&#61548; -O2,最佳優(yōu)化
&#61548; -pipe,使用管道在編譯stage之間通信,而不使用臨時文件;
&#61548; -march,產生指定架構類型的代碼;
&#61548; -c,編譯/匯編源文件,但是不連接,這里這樣是因為最后我們會自己調用ld來連接;
&#61548; -o ‘FILE’,指定輸出文件名,如果沒有指定,則將使用默認的文件名;

// 編譯kernel目錄下的文件
make CFLAGS="-D__KERNEL__ -I/root/linux/include -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -fno-strict-aliasing -pipe -mpreferred-stack-boundary=2 -march=i686 " -C kernel
make[1]: Entering directory `/root/linux/kernel'
make all_targets
make[2]: Entering directory `/root/linux/kernel'
make[2]: Nothing to be done for `all_targets'.
make[2]: Leaving directory `/root/linux/kernel'
make[1]: Leaving directory `/root/linux/kernel'
// 編譯drivers目錄下的文件
make CFLAGS="-D__KERNEL__ -I/root/linux/include -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -fno-strict-aliasing -pipe -mpreferred-stack-boundary=2 -march=i686 " -C drivers
make[1]: Entering directory `/root/linux/drivers'
make -C block
make[2]: Entering directory `/root/linux/drivers/block'
make all_targets
……
make all_targets
make[2]: Entering directory `/root/linux/drivers'
make[2]: Nothing to be done for `all_targets'.
make[2]: Leaving directory `/root/linux/drivers'
make[1]: Leaving directory `/root/linux/drivers'
// 編譯mm目錄下的文件
make CFLAGS="-D__KERNEL__ -I/root/linux/include -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -fno-strict-aliasing -pipe -mpreferred-stack-boundary=2 -march=i686 " -C mm
make[1]: Entering directory `/root/linux/mm'
……
// 編譯arch/i386/kernel下的文件
make CFLAGS="-D__KERNEL__ -I/root/linux/include -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -fno-strict-aliasing -pipe -mpreferred-stack-boundary=2 -march=i686 " -C arch/i386/kernel
make[1]: Entering directory `/root/linux/arch/i386/kernel'
make[1]: Nothing to be done for `all'.
make[1]: Leaving directory `/root/linux/arch/i386/kernel'
// 編譯arch/i386/mm下的文件
make CFLAGS="-D__KERNEL__ -I/root/linux/include -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -fno-strict-aliasing -pipe -mpreferred-stack-boundary=2 -march=i686 " -C arch/i386/mm
make[1]: Entering directory `/root/linux/arch/i386/mm'
make all_targets
make[2]: Entering directory `/root/linux/arch/i386/mm'
make[2]: Nothing to be done for `all_targets'.
make[2]: Leaving directory `/root/linux/arch/i386/mm'
make[1]: Leaving directory `/root/linux/arch/i386/mm'
// 編譯arch/i386/lib下的文件
make CFLAGS="-D__KERNEL__ -I/root/linux/include -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -fno-strict-aliasing -pipe -mpreferred-stack-boundary=2 -march=i686 " -C arch/i386/lib
make[1]: Entering directory `/root/linux/arch/i386/lib'
make all_targets
make[2]: Entering directory `/root/linux/arch/i386/lib'
make[2]: Nothing to be done for `all_targets'.
make[2]: Leaving directory `/root/linux/arch/i386/lib'
make[1]: Leaving directory `/root/linux/arch/i386/lib'
// 好,到此為止,所有涉及到內核的子目錄都已經編譯完畢,將他們鏈接起來
ld -m elf_i386 -T /root/linux/arch/i386/vmlinux.lds -e stext arch/i386/kernel/head.o arch/i386/kernel/init_task.o init/main.o init/version.o /
--start-group /
arch/i386/kernel/kernel.o arch/i386/mm/mm.o kernel/kernel.o mm/mm.o fs/fs.o ipc/ipc.o /
drivers/block/block.o drivers/char/char.o drivers/misc/misc.o drivers/net/net.o drivers/media/media.o drivers/char/drm/drm.o drivers/ide/idedriver.o drivers/scsi/scsidrv.o drivers/cdrom/driver.o drivers/sound/sounddrivers.o drivers/pci/driver.o drivers/pcmcia/pcmcia.o drivers/net/pcmcia/pcmcia_net.o drivers/pnp/pnp.o drivers/video/video.o drivers/usb/usbdrv.o /
net/network.o /
/root/linux/arch/i386/lib/lib.a /root/linux/lib/lib.a /root/linux/arch/i386/lib/lib.a /
--end-group /
-o vmlinux
這里解釋下各個符號參數(shù)的含義:
&#61548; -mEMULATION,仿效EMULATION鏈接器,例如-m elf_i386。ld –verbose用來顯示當前l(fā)d所支持的連接器,同時還會顯示該鏈接器涉及到的環(huán)境變量定義腳本;
&#61548; -T,指定鏈接腳本文件;
&#61548; -e ENTRY,使用ENTRY符號作為程序開始執(zhí)行點;
至此,包含內核所有相關模塊的文件vmlinux已經完全生成,注意,我們在腳本文件vmlinux.lds中將其實地址設置成0xC0100000,這樣內核中所有的符號絕對地址都以0xC0100000加上其相對于文件0位置的偏移地址構成,0xC0100000該地址經過Linux+CPU頁式影射后就是物理地址0x100000。
3 vmlinux.lds
/*********************************************************************************************************
OUTPUT_FORMAT(DEFAULT, BIG, LITTLE)
改命令告訴ld輸出文件的格式,另外,如果選擇了-EB選項,ld將會使用BIG來控制輸出格式,如果選擇了-EL,ld將會使用LITTLE來控制輸出格式,否則ld將會使用DEFAULT來控制輸出格式。-EB用來指定大端字節(jié),-EL用來指定小端字節(jié)。

OUTPUT_ARCH(BFDARCH)
指定特定計算機架構的輸出格式。

ENTRY(SYMBOL)
程序中第一條指令稱之為入口點,ENTRY用來設置入口點,入口點為源碼中的符號,這里就是_start。
*********************************************************************************************************/
OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
OUTPUT_ARCH(i386)
ENTRY(_start)
/*********************************************************************************************************
SECTIONS命令用來告訴ld如何將輸入sections影射到輸出sections,以及在內存中如何放置這些sections。
*********************************************************************************************************/
SECTIONS
{
/*********************************************************************************************************
這里’.’為當前位置計數(shù)器,這里將代碼加載在起始位置為0xC0000000 + 0x100000處;_text = .用來獲取當前位置計數(shù)器的值。
*********************************************************************************************************/
. = 0xC0000000 + 0x100000;
_text = .; /* Text and read-only data */
/*********************************************************************************************************
這里*(.text)、*(.fixup)、*(.gnu.warning)指示所有的.text、.fixup、.gnu.warning輸入sections都被放在輸出的.text中。0x9090用來填充幾個section之間的空洞的數(shù)值,通常這個空洞是由于設置’.’造成的,這里沒有其實沒有空洞的。
*********************************************************************************************************/
.text : {
*(.text)
*(.fixup)
*(.gnu.warning)
} = 0x9090
.text.lock : { *(.text.lock) } /* out-of-line lock text */

_etext = .; /* End of text section */

.rodata : { *(.rodata) }
.kstrtab : { *(.kstrtab) }
/*********************************************************************************************************
這里ALIGN(EXP),用來設置當前位置計數(shù)器的位置,但是位置時在當前位置后面的第一個和EXP對齊的位置。
*********************************************************************************************************/
. = ALIGN(16); /* Exception table */
__start___ex_table = .;
__ex_table : { *(__ex_table) }
__stop___ex_table = .;

__start___ksymtab = .; /* Kernel symbol table */
__ksymtab : { *(__ksymtab) }
__stop___ksymtab = .;

.data : { /* Data */
*(.data)
CONSTRUCTORS
}

_edata = .; /* End of data section */

. = ALIGN(8192); /* init_task */
.data.init_task : { *(.data.init_task) }

. = ALIGN(4096); /* Init code and data */
__init_begin = .;
.text.init : { *(.text.init) }
.data.init : { *(.data.init) }
. = ALIGN(16);
__setup_start = .;
.setup.init : { *(.setup.init) }
__setup_end = .;
__initcall_start = .;
.initcall.init : { *(.initcall.init) }
__initcall_end = .;
. = ALIGN(4096);
__init_end = .;

. = ALIGN(4096);
.data.page_aligned : { *(.data.idt) }

. = ALIGN(32);
.data.cacheline_aligned : { *(.data.cacheline_aligned) }

__bss_start = .; /* BSS */
.bss : {
*(.bss)
}
_end = . ;
/*********************************************************************************************************
/DISCARD/ section非常特殊,其用來丟棄指定的輸入sections,這些sections將不會出現(xiàn)在輸出文件中。
*********************************************************************************************************/
/DISCARD/ : {
*(.text.exit)
*(.data.exit)
*(.exitcall.exit)
}
/*********************************************************************************************************
這里的.stab 0 :中的0表示該段起始于位置0處。
*********************************************************************************************************/
/* 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) }
}

關于程序中.text,.data,.bss等段的說明:
由于歷史原因,C程序一直由下列幾部分組成:
1、 正文段。這是由CPU執(zhí)行的機器指令部分。通常,正文段是可共享的,所以即使是經常執(zhí)行的程序(如文本編輯程序、C編譯程序、shell等)在存儲器中也只需有一個副本,另外,正文段常常是只讀的,以防止程序由于意外事故而修改其自身的指令。
2、 初始化數(shù)據(jù)段。通常將此段稱為數(shù)據(jù)段,它包含了程序中需賦初值的變量。例如, C程序中任何函數(shù)之外的說明:
int maxcount = 99; 使此變量以初值存放在初始化數(shù)據(jù)段中。
3、 非初始化數(shù)據(jù)段。通常將此段稱為bss 段,在程序開始執(zhí)行之前,內核將此段初始化為0。函數(shù)外的說明:
long sum[1000] ; 使此變量存放在非初始化數(shù)據(jù)段中。
4、 棧。自動變量以及每次函數(shù)調用時所需保存的信息都存放在此段中。每次函數(shù)調用時,其返回地址、以及調用者的環(huán)境信息(例如某些機器寄存器)都存放在棧中。然后,新被調用的函數(shù)在棧上為其自動和臨時變量分配存儲空間。通過以這種方式使用棧, C函數(shù)可以遞歸調用。
5、 堆。通常在堆中進行動態(tài)存儲分配。由于歷史上形成的慣例,堆位于非初始化數(shù)據(jù)段頂和棧底之間。

|--------------------|
| 命令行參數(shù)和 |
| 環(huán)境變量 |
|--------------------|
| 棧 |
|--------------------|
| ↓ |
| |
| |
| |
| |
| ↑ |
|--------------------|
| 堆 |
|--------------------|+--
| | |
| 未初始化的數(shù)據(jù) | ++ 由exec賦初值0
| | |
|--------------------|+--
| 初始化的數(shù)據(jù) | |
|--------------------| ++ exec從程序文件中讀取
| 正文 | |
|--------------------|+--

從圖中可以看到末初始化數(shù)據(jù)段的內容并不存放在磁盤程序文件中。需要存放在磁盤程序文件中的段只有正文段和初始化數(shù)據(jù)段。

關于ld主要功能簡介
1、 ld用來組合對象文件和檔案文件,重新部署其中的數(shù)據(jù)以及綁定符號引用。編譯程序的最后一步通常就是ld, ld通常使用BFD庫來操作對象文件,這使得ld可以按照多種不同的格式例如COFF、a.out,來讀取、組合以及寫對象文件。不同的格式可以組合在一起產生任何可用類型的目標文件;
2、 ld 接受按照AT&T鏈接命令語言語法編寫的鏈接命令語言文件,從而對鏈接過程實施明確的整體上的控制;
3、 每個鏈接過程都是通過鏈接腳本來控制的,該腳本按照鏈接器命令語言編寫。鏈接腳本的主要目的就是用來描述輸入文件中的section應該如何被影射到輸出文件中去,同時還控制輸出文件的內存布局。如果沒有提供鏈接腳本給鏈接器,那么連接器將會采用缺省的腳本,其已經被編譯到鏈接器可執(zhí)行文件中去了。使用ld –verbose可以顯示缺省的鏈接腳本。
4 bboosect和bsetup的生成
A make bzImage → /top/Makefile → /top/arch/i386/Makefile
MAKEBOOT = $(MAKE) -C arch/$(ARCH)/boot
vmlinux: arch/i386/vmlinux.lds
bzImage: vmlinux
@$(MAKEBOOT) bzImage
現(xiàn)在到達@$(MAKEBOOT) bzImage,這里的@表示執(zhí)行該條命令的時候不要在顯示器上顯示,-C表示執(zhí)行子目錄中的Makefile。對于MAKEBOOT中的$(MAKE),make命令在執(zhí)行Makefile時會自動將其解釋為make,也就是make命令本身。ARCH則為/top/Makefile中導出的ARCH,即i386:
export VERSION PATCHLEVEL SUBLEVEL EXTRAVERSION KERNELRELEASE ARCH /
CONFIG_SHELL TOPDIR HPATH HOSTCC HOSTCFLAGS CROSS_COMPILE AS LD CC /
CPP AR NM STRIP OBJCOPY OBJDUMP MAKE MAKEFILES GENKSYMS MODFLAGS PERL
最終@$(MAKEBOOT) bzImage被解釋為:@make -C arch/i386/boot bzImage,我們來看看其究竟做了些什么。

B make bzImage → /top/Makefile → /top/arch/i386/Makefile→ /top/arch/i386/boot/Makefile
bzImage: $(CONFIGURE) bbootsect bsetup compressed/bvmlinux tools/build
$(OBJCOPY) compressed/bvmlinux compressed/bvmlinux.out
tools/build -b bbootsect bsetup compressed/bvmlinux.out $(ROOT_DEV) > bzImage
注解:在這里make bzImage才得以被執(zhí)行,執(zhí)行前,需要依靠的對象為bbootsect bsetup compressed/bvmlinux tools/build,因此將首先編譯這四個對象。

* bbosect的生成過程
bbootsect的編譯還是在當前的/top/arch/i386/boot/Makefile中:
bbootsect: bbootsect.o
$(LD) -Ttext 0x0 -s -oformat binary $< -o $@
bbootsect.o: bbootsect.s
$(AS) -o $@ $<
bbootsect.s: bootsect.S Makefile $(BOOT_INCL)
$(CPP) $(CPPFLAGS) -D__BIG_KERNEL__ -traditional $(SVGA_MODE) $(RAMDISK) $< -o $@
這里$<為所依賴對象的第一個元素,例如第四行的$<即bboosect.S,而$@表示目的,例如第四行的$@表示bboosect.o。
LD、AS和CPP的定義均在/top/Makefile中,至于SVGA_MODE和RAMDISK這時暫無需考慮,不影響理解:
HPATH = $(TOPDIR)/include
CROSS_COMPILE =
AS = $(CROSS_COMPILE)as
LD = $(CROSS_COMPILE)ld
CC = $(CROSS_COMPILE)gcc
CPP = $(CC) –E
CPPFLAGS := -D__KERNEL__ -I$(HPATH)
而在/top/arch/i386Makefile中,LD又被重新定義,表示該目錄及該目錄下的子目錄統(tǒng)統(tǒng)使用當前的LD定義:
LD=$(CROSS_COMPILE)ld -m elf_i386
BOOT_INCL定義在/top/arch/i386/boot/Makefile中:
BOOT_INCL = $(TOPDIR)/include/linux/config.h /
$(TOPDIR)/include/linux/autoconf.h /
$(TOPDIR)/include/asm/boot.h
因此這里最終的展開為:
gcc -E -D__KERNEL__ -I/root/linux/include -D__BIG_KERNEL__ -traditional -DSVGA_MODE=NORMAL_VGA bootsect.S -o bbootsect.s
as -o bbootsect.o bbootsect.s
ld -m elf_i386 -Ttext 0x0 -s -oformat binary bbootsect.o -o bbootsect
這里我們解釋下其中的一些含義,其中第一句中關于gcc:
&#61548; -E,我們知道編譯可以分為4個階段,預處理,編譯,匯編和鏈接。前三個步驟適用于源文件,結果產生一個object文件;而第四個步驟用于將所有的Object文件鏈接組合到可執(zhí)行文件中。-E選項用來表示在預處理階段之后就不要繼續(xù)下一步了,直接停止,輸出即為經過預處理的源代碼,對于C語言而言,就是將所有的外部引用添加到目標文件中;
&#61548; - traditional,用于支持傳統(tǒng)的C語法;
&#61548; -DSVGA_MODE=NORMAL_VGA,也是-D的一個用法,用來將源碼中所有的SVGA_MODE宏替換成NORMAL_VGA;
&#61548; -o FILE,將結果輸出到FILE;
這里產生的bbootsect.s基本語法和bootsect.S中本完全一樣,只是所有的變量以及宏定義的外部引用全部被實際的數(shù)值所代替,使其不再依賴于其他文件。

第二句中關于as,注意as輸出的指示只是輸出還沒有鏈接的object文件:
&#61548; -o,使用as必定有對象文件輸出,缺省的為a.out,除非用-o來指定一個特定文件名的文件。

第三句關于ld:
&#61548; -Ttext ORG,用來設置.text段的起始地址,這里為0x0;
&#61548; -s,在輸出文件中忽略所有的符號信息;
&#61548; -oformat,用來設置輸出文件的類型,可以通過objdump –i來查看可用的二進制格式。
這里產生的bbootsect即是鏈接后的二進制文件,其中已經去處了所有的符號信息,所有的其他非相關信息,只剩下純代碼,并且第一條指令的起始地址為0。

* bsetup的生成過程
bsetup: bsetup.o
$(LD) -Ttext 0x0 -s -oformat binary -e begtext -o $@ $<
bsetup.o: bsetup.s
$(AS) -o $@ $<
bsetup.s: setup.S video.S Makefile $(BOOT_INCL) $(TOPDIR)/include/linux/version.h $(TOPDIR)/include/linux/compile.h
$(CPP) $(CPPFLAGS) -D__BIG_KERNEL__ -traditional $(SVGA_MODE) $(RAMDISK) $< -o $@
基本原理和bbootsect類似,最終展開為:
gcc -E -D__KERNEL__ -I/root/linux/include -D__BIG_KERNEL__ -traditional -DSVGA_MODE=NORMAL_VGA setup.S -o bsetup.s
as -o bsetup.o bsetup.s
ld -m elf_i386 -Ttext 0x0 -s -oformat binary -e begtext -o bsetup bsetup.o
這里唯一不同的就是最后一句的-e begtext,此處的begtext=0,定義在setup.S中。另外需要注意的是,bbootsect和bsetup的起始地址都為0,但是其被拷貝到內存中的時候起始地址卻為0x90000和0x90200,這樣假設原來bootsect.S中有個變量A,則在編譯鏈接之后,變量A所暗示的物理內存地址就是其相對于bbootsect的起始地址的偏移+bbootsect的起始地址=Addr,訪問A處的指令中的地址也就是為Addr。但真實的拷貝到內存中時,A的真實物理地址卻未0x90000+Addr,那么該如何辦呢?其實在bootsetup.S,一開始首先通過指令ljmp $INITSEG, $go設置CS=9000H,IP為go相對于該文件開始初的偏移,同時也將自己的DS、ES、FS設置成0x9000,這樣雖然A的地址是A,但是CPU訪問A的地址是通過DS:Addr的方式,也就相當于邏輯地址Addr加到DS*10H上從而實現(xiàn)了物理地址0x90000+Addr,因此才得以正確訪問所有的數(shù)據(jù)和指令,對于指令就是CS:IP,則順著CS:go往下走就好了;對于setup.S,由于setup.S是bootsect.S調用的,而bootsect.S在調用setup.S的時候采用的是ljmp $SETUPSEG, $0,從而將CS:IP設置成9020H:0000,剛好是bsetup在內存中的起始位置,隨后也同時設置了DS,因此也可以正確訪問所有的指令和數(shù)據(jù)。
5 compressed/bvmlinux的生成
A make bzImage → /top/Makefile → /top/arch/i386/Makefile → /top/arch/i386/boot /Makefile → /top/arch/i386/boot /compressed/Makefile
HEAD = head.o
SYSTEM = $(TOPDIR)/vmlinux
OBJECTS = $(HEAD) misc.o
CFLAGS = $(CPPFLAGS) -O2 -DSTDC_HEADERS
ZLDFLAGS = -e startup_32
BZIMAGE_OFFSET = 0x100000
BZLINKFLAGS = -Ttext $(BZIMAGE_OFFSET) $(ZLDFLAGS)
bvmlinux: piggy.o $(OBJECTS)
$(LD) $(BZLINKFLAGS) -o bvmlinux $(OBJECTS) piggy.o
head.o: head.S
$(CC) $(AFLAGS) -traditional -c head.S
misc.o: misc.c
$(CC) $(CFLAGS) -c misc.c
piggy.o: $(SYSTEM)
tmppiggy=_tmp_$$$$piggy; /
rm -f $$tmppiggy $$tmppiggy.gz $$tmppiggy.lnk; /
$(OBJCOPY) $(SYSTEM) $$tmppiggy; /
gzip -f -9 < $$tmppiggy > $$tmppiggy.gz; /
echo "SECTIONS { .data : { input_len = .; LONG(input_data_end - input_data) input_data = .; *(.data) input_data_end = .; }}" > $$tmppiggy.lnk; /
$(LD) -r -o piggy.o -b binary $$tmppiggy.gz -b elf32-i386 -T $$tmppiggy.lnk; /
rm -f $$tmppiggy $$tmppiggy.gz $$tmppiggy.lnk
這里涉及到/top/Makefile中的一些定義:
CPPFLAGS := -D__KERNEL__ -I$(HPATH)
AFLAGS := -D__ASSEMBLY__ $(CPPFLAGS)
最終展開為:
tmppiggy=_tmp_$$piggy; /
rm -f $tmppiggy $tmppiggy.gz $tmppiggy.lnk; /
objcopy -O binary -R .note -R .comment -S /root/linux/vmlinux $tmppiggy; /
gzip -f -9 < $tmppiggy > $tmppiggy.gz; /
echo "SECTIONS { .data : { input_len = .; LONG(input_data_end - input_data) input_data = .; *(.data) input_data_end = .; }}" > $tmppiggy.lnk; /
ld -m elf_i386 -r -o piggy.o -b binary $tmppiggy.gz -b elf32-i386 -T $tmppiggy.lnk; /
rm -f $tmppiggy $tmppiggy.gz $tmppiggy.lnk
gcc -D__ASSEMBLY__ -D__KERNEL__ -I/root/linux/include -traditional -c head.S
gcc -D__KERNEL__ -I/root/linux/include -O2 -DSTDC_HEADERS -c misc.c
ld -m elf_i386 -Ttext 0x100000 -e startup_32 -o bvmlinux head.o misc.o piggy.o
前面生成的vmlinux是elf-i386類型的可執(zhí)行文件,這里objcopy用來將所有的這些可執(zhí)行文件頭信息全部去除掉,這里解釋下其中的參數(shù):
&#61548; -O BFDNAME,將輸出文件設置成binary格式,去除所有的可執(zhí)行文件格式的文件;
&#61548; -R SECTIONNAME,將SECTIONNAME的section從輸出文件中去除;
&#61548; -S,不要拷貝relocation和symbol信息;
這樣拷貝后的文件就不帶任何用來識別可執(zhí)行文件的信息了,而是完全的執(zhí)行代碼文件$tmppiggy,再將其通過gzip壓縮,壓縮后的文件$tmppiggy.gz又成了elf文件,通過ld來relocation該文件,目標位piggy.o 。最后將head.o,misc.o,piggy.o鏈接到一起,構成了bvmlinux = head.o + misc.o + piggy.o, 最后的bvmlinux其實地址為0x100000,開始符號為startup_32,也就是讓startup_32的地址為0x100000,剛好是bvmlinux被bootsect.S拷貝到1M內存處的第一條指令執(zhí)行內存地址。
6 tools/build的生成
bulid.c的生成采用普通的make build。

7 bzImage的生成
A make bzImage → /top/Makefile → /top/arch/i386/Makefile→ /top/arch/i386/boot/Makefile
bzImage: $(CONFIGURE) bbootsect bsetup compressed/bvmlinux tools/build
$(OBJCOPY) compressed/bvmlinux compressed/bvmlinux.out
tools/build -b bbootsect bsetup compressed/bvmlinux.out $(ROOT_DEV) > bzImage
我們回到/top/arch/i386/boot/Makefile中,展開即為:
objcopy -O binary -R .note -R .comment -S compressed/bvmlinux compressed/bvmlinux.out
tools/build -b bbootsect bsetup compressed/bvmlinux.out CURRENT > bzImage
首先將bvmlinux剝除掉可執(zhí)行文件信息生成bvmlinux.out,然后通過tools/build將bboosect,bsetup,compressed/bvmlinux.out 和CURRENT組合,形成了bzImage。這里bboosect,bsetup,compressed/bvmlinux.out統(tǒng)統(tǒng)為純二進制指令文件,沒有其他的信息。
8 build.c的流程
如果內核為壓縮的,則在調用build的時候應該加上-b選項,如果啟動root文件系統(tǒng)沒有指定,則應該加上CURRENT選項:
build -b bbootsect bsetup compressed/bvmlinux.out CURRENT > bzImage
build會將bbootsect共512K放在bzImage文件的最起始處,bsetup放在隨后,而bvmlinux.out放在最后,最后構成了真正的內核bzImage,另外build還有做如下這幾個事情:
&#61548; 如果有-b選項,則會檢測bvmlinux.out的大小不要超過0x280000(2.5M),否則大小不要超過0x7F000(508K);
&#61548; 將bvmlinux.out的大小/16寫入到bbootsect的500字節(jié)處;
&#61548; 將bsetup的大小/512,也就是bsetup要占用的扇區(qū)數(shù)寫入到bbootsect的497字節(jié)處;
&#61548; 依據(jù)CURRENT將當前 / 所處的root minor_root major_root寫入到bbootsect的508字節(jié)處;

bzImage的組成:

bootsect <---ld bootsect.o
setup <---ld setup.o
vmlinux.bin <---objcopy arch/i386/boot/compressed/vmlinux

|--------------|------------|------------------------|
|bootsect------|---setup-----|------vmlinux.bin----|
|--------------|------------|------------------------|

arch/i386/boot/compressed/vmlinux的組成:

head.o <--- head.S
misc.o <--- misc.c
piggy.o <--- vmlinux.bin.gz <--- vmlinux.bin <--- vmlinux(源碼目錄下)

|-----------|-------------|---------------------------------|
|head.o-----|--misc.o-----|--------------piggy.o------------|
|-----------|-------------|---------------------------------|

注意不要混淆:

編譯過程中會產生兩個vmlinux.bin:
arch/i386/boot/vmlinux.bin <---objcopy arch/i386/boot/compressed/vmlinux
arch/i386/boot/compressed/vmlinux.bin <---objcopy vminux

兩個vmlinux:
源碼根目錄下的vmlinux
arch/i386/boot/compressed/vmlinux <---head.o misc.o piggy.o

---------------------bzImage
-------------------------|
----------------|--------|-------------------|
------------bootsect--setup-------------vmlinux.bin
--------------------------------------------|
-------------------------------------------vmlinux
--------------------------------------|----------|-----------------|
----------------------------------head.o---misc.o-------------piggy.o
------------------------------------------------------------------|
----------------------------------------------------------------vmlinux.bin.gz
------------------------------------------------------------------|
----------------------------------------------------------------vmlinux.bin
------------------------------------------------------------------|
----------------------------------------------------------------vmlinux

其中最后是由實用程序build(在build目錄下生成的)將bootsect,setup,vmlinux.bin拼接到一塊成為bzImage


轉載于:https://www.cnblogs.com/yuzaipiaofei/archive/2011/08/02/4124432.html

總結

以上是生活随笔為你收集整理的bzImage的概要生成过程的全部內容,希望文章能夠幫你解決所遇到的問題。

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

免费在线黄色av | 27xxoo无遮挡动态视频 | 亚洲人成在线电影 | 久久草在线视频国产 | 国产成人99久久亚洲综合精品 | 天天躁天天狠天天透 | 国产精品久久久久久久久久ktv | a在线免费 | 欧美在线一二 | 久久久久久久影院 | 日韩肉感妇bbwbbwbbw | 婷婷丁香七月 | 欧美日韩精品在线观看 | 九九欧美视频 | 日韩电影在线观看中文字幕 | 久久你懂得 | 91亚洲精品国产 | 国产色在线,com | 欧美国产高清 | 色资源中文字幕 | 免费男女羞羞的视频网站中文字幕 | 98超碰在线 | 在线免费观看黄色av | 精品夜夜嗨av一区二区三区 | 国产色婷婷在线 | 中文字幕文字幕一区二区 | 国产精品久久久久久69 | 伊人伊成久久人综合网小说 | 成 人 黄 色 免费播放 | 欧美激情综合色 | 久久久在线视频 | 国内精品视频一区二区三区八戒 | 国产精品中文字幕在线 | 免费下载高清毛片 | 97超碰超碰 | 玖玖国产精品视频 | 国产亚洲精品久久久久久久久久久久 | 久久国产精品久久久久 | 国产免费高清 | 精品九九九九 | 在线观看成人网 | 97夜夜澡人人爽人人免费 | 精品免费视频 | 91精品视频一区二区三区 | 欧美一级欧美一级 | 日韩性xxxx | 国产精品欧美日韩在线观看 | 午夜 在线| 91av在线电影 | 91精品国产乱码在线观看 | 91精品网站 | 操操操天天操 | 日韩久久精品一区二区 | www黄色 | 天天操伊人| 久久久精品电影 | 亚洲欧美va | 在线观看免费黄色 | 狠狠干夜夜爱 | 蜜臀av夜夜澡人人爽人人桃色 | www天天操 | 国产精品高清一区二区三区 | 在线免费观看黄色小说 | 亚洲精品小视频在线观看 | 国产 日韩 在线 亚洲 字幕 中文 | 天天摸天天干天天操天天射 | 看片网站黄 | 国产成人中文字幕 | 国产 在线 高清 精品 | 精品国产网址 | 亚洲电影黄色 | 亚洲福利精品 | 午夜 久久 tv | 亚洲成熟女人毛片在线 | 久久免费99 | 精品99久久| 人人看人人做人人澡 | 亚洲.www | 91av中文| 五月天激情综合 | 免费看三片 | 亚洲一级片在线看 | 女人高潮一级片 | 深爱激情五月综合 | 亚洲精品国产精品国自产观看 | 欧洲一区精品 | 亚洲精品色视频 | 免费国产黄线在线观看视频 | 国内精品二区 | 最近免费中文字幕 | www成人精品 | 精品99视频| 成人亚洲精品久久久久 | 久久中文精品视频 | 97在线免费观看 | 国内精品中文字幕 | 亚洲乱亚洲乱亚洲 | 97成人资源 | 天天操狠狠操夜夜操 | 免费久久99精品国产婷婷六月 | 国产黑丝一区二区三区 | 欧美五月婷婷 | 国产精品一区专区欧美日韩 | 激情五月婷婷综合网 | 久碰视频在线观看 | 日韩在线观看一区二区 | 久久精品国产一区二区 | 精品久久久久久久久久久久久久久久 | 久久国产经典视频 | 国产精品wwwwww | 69夜色精品国产69乱 | 色香com. | 久草在线视频免赞 | www.福利 | 亚洲欧洲xxxx| 亚洲欧美怡红院 | 亚洲一区久久 | jizzjizzjizz亚洲 | 天天操天天色综合 | 一级黄色片在线免费看 | 午夜影院三级 | 亚洲精品1区2区3区 超碰成人网 | 在线观看亚洲精品 | 国产精品久久一区二区无卡 | av网站地址 | 久久任你操 | 日韩av片免费在线观看 | 99在线热播精品免费 | 国产精品a久久久久 | 日韩r级在线 | 精品视频123区在线观看 | 欧美日韩三级在线观看 | 精品久久91| 不卡中文字幕在线 | 五月天激情视频在线观看 | 九九在线免费视频 | 在线观看一级片 | 91香蕉视频在线下载 | 国产美女视频黄a视频免费 久久综合九色欧美综合狠狠 | 久视频在线播放 | 夜夜摸夜夜爽 | 一区二区三区四区五区在线 | 黄色小网站在线 | 少妇性bbb搡bbb爽爽爽欧美 | 日韩视频免费播放 | 久久人人爽爽人人爽人人片av | www.99热精品 | 色偷偷97| 国产精品日韩 | 国产午夜精品一区二区三区在线观看 | 久草网站在线观看 | 久久成人国产精品 | 蜜桃传媒一区二区 | 成人综合日日夜夜 | 91精品一区二区三区蜜桃 | 久久黄色成人 | av福利免费 | 一区二区视频在线播放 | 国产字幕av | 成人a视频在线观看 | 色婷婷丁香 | 午夜婷婷在线观看 | 欧美精品国产综合久久 | 超碰免费97| 伊人久久国产精品 | 91精品综合在线观看 | 亚洲一区天堂 | 在线观看91精品国产网站 | 日韩系列| 福利视频第一页 | 一区二区视频在线观看免费 | 亚洲一区免费在线 | 欧美一二在线 | 国产一区在线免费观看视频 | 色欲综合视频天天天 | 免费黄色av电影 | 天天干天天想 | a极黄色片 | 日韩在线视频网 | 精品国产99 | 一级一级一片免费 | 国产剧情在线一区 | 欧美一区在线观看视频 | 久久在线影院 | 99热99热 | 日韩欧美电影网 | 欧美激情精品一区 | 日日夜夜草 | 国产糖心vlog在线观看 | 天天色天天骑天天射 | 日韩av免费在线电影 | 怡红院成人在线 | 超碰人人射 | www.国产在线| 亚洲精品视频在线观看免费视频 | 99国产情侣在线播放 | 国产精品毛片 | 欧美另类视频 | 国产日产欧美在线观看 | 国产精品爽爽久久久久久蜜臀 | 美女黄色网在线播放 | 日本精品一区二区三区在线观看 | a成人在线| 在线看片一区 | 91chinesexxx | 久久久久国产免费免费 | a在线视频v视频 | bbbb操bbbb| 91视频啪| 亚洲国产成人在线观看 | 国产男女无遮挡猛进猛出在线观看 | 欧美精选一区二区三区 | 日本一区二区高清不卡 | www.色午夜.com | 国产精品九九视频 | 91精彩视频 | 婷婷在线色 | 亚洲一区二区三区四区在线视频 | 国产69精品久久久久久久久久 | 中文一区在线观看 | 国际精品久久 | 亚洲美女免费精品视频在线观看 | 亚洲九九精品 | 亚洲成人av一区二区 | 久久久久久久久久影院 | 国产精品18久久久久久久网站 | 欧美精品久久久久久久免费 | 亚洲精品18日本一区app | 69精品视频在线观看 | 九九热在线播放 | 91精品久久久久久综合五月天 | 久草视频一区 | 狠狠色综合网站久久久久久久 | 成人毛片一区二区三区 | 国产福利免费在线观看 | 久久综合九色综合久99 | 欧美日韩三级在线观看 | 日韩大片在线免费观看 | 精品国产免费人成在线观看 | 亚洲欧美日韩一二三区 | 成人av一区二区在线观看 | 99久免费精品视频在线观看 | 91在线视频观看免费 | 国产精品久久久久av | 欧美成年人在线观看 | 中文字幕首页 | 国产色就色 | 久久久久久国产精品999 | 国产精品免费久久久久久 | 麻豆91在线播放 | 中文在线字幕观看电影 | 黄色免费视频在线观看 | 97人人模人人爽人人喊中文字 | 欧美特一级片 | 久草91视频 | 天天干天天怕 | 国内精品久久久精品电影院 | 久久伊人爱 | 精品国产一区二区三区蜜臀 | 国产一区欧美日韩 | 国产精品黄网站在线观看 | 成人免费观看视频网站 | 国产成人免费在线观看 | 中文字幕日本在线观看 | 日韩欧美在线观看 | 国际av在线 | 不卡的av电影在线观看 | 日韩在线高清免费视频 | 久久九九久久 | 色网站黄| 人人干免费 | 亚洲午夜在线视频 | 久久天| 欧美韩国日本在线 | 亚洲 欧美 日韩 综合 | 日韩在线色 | 高清在线一区二区 | 久草视频看看 | 激情五月开心 | av网站免费在线 | 国产精品一级在线 | av资源在线观看 | 免费日韩一区二区三区 | 欧美激情视频在线免费观看 | 99久久99久久综合 | 黄色精品在线看 | a视频免费| 奇米影视777四色米奇影院 | 黄污网| 亚洲乱码久久 | 欧美精品久久久久久 | 96国产在线 | 久久久久亚洲精品男人的天堂 | 日日草天天干 | 成人免费一级 | 四虎国产精品成人免费影视 | 国产区欧美 | 91在线免费看片 | 福利精品在线 | 99国产精品久久久久老师 | 欧美日韩一区二区在线观看 | 深爱综合网 | 日韩三区在线观看 | 欧美国产一区二区 | 中文字幕乱在线伦视频中文字幕乱码在线 | 日韩二区三区在线 | 国产精品视频免费看 | h文在线观看免费 | 99视频免费在线观看 | 天天操天天操天天 | 91片黄在线观看动漫 | 日批在线观看 | 久久国产精品久久国产精品 | 人人草在线视频 | 国产污视频在线观看 | 色综合亚洲精品激情狠狠 | 九九久久精品 | 亚洲精品乱码久久久久久按摩 | 久久久亚洲精华液 | 精品一区二区在线观看 | av免费看网站 | 美女久久久久久久久久 | 99产精品成人啪免费网站 | 成人在线观看免费 | 五月天久久综合 | 91av视频在线观看免费 | 国产第一页精品 | 久久99精品久久久久久三级 | 天天操天天舔天天爽 | 成人黄色影片在线 | 午夜黄网| 日韩资源在线观看 | 香蕉91视频 | 国产一区二区久久久久 | 午夜精品一区二区三区视频免费看 | 蜜臀av性久久久久蜜臀aⅴ涩爱 | 国产成人福利在线 | 精品一区二区三区久久久 | 精品视频成人 | 婷婷综合导航 | 欧美一二三区在线播放 | 久久激情婷婷 | 四虎国产精品免费 | 日韩视频欧美视频 | 国产伦理一区二区 | 在线视频 区| 色就色,综合激情 | 精品91在线 | 亚州国产精品 | 色婷婷综合在线 | 麻豆免费观看视频 | 久草网站 | 亚洲 欧美 另类人妖 | 一二三区视频在线 | 99精品免费在线观看 | av成人黄色 | 中文字幕成人在线 | 97超级碰碰碰视频在线观看 | 久久精品一区二区三区中文字幕 | 成人av直播 | 日韩一级电影网站 | 有码中文字幕在线观看 | av资源在线看 | 91精品国自产在线偷拍蜜桃 | 中中文字幕av在线 | 免费观看www视频 | 天天干天天操天天搞 | 在线免费国产视频 | av成人资源| 日韩高清在线一区二区三区 | 久久在线视频精品 | 黄色av网站在线观看免费 | 免费观看一级一片 | 在线免费三级 | 91av短视频 | av在线播放网址 | 91桃色国产在线播放 | 久久国产成人午夜av影院宅 | 日韩一区二区三免费高清在线观看 | 麻豆视频国产精品 | 国产高清视频网 | 97伊人网| 国产精品99久久久久久人免费 | 国产小视频在线免费观看视频 | 国产精品青草综合久久久久99 | 天天草天天草 | 国产精品毛片一区二区 | 日韩国产精品久久久久久亚洲 | 久久精品日产第一区二区三区乱码 | 日本中文字幕视频 | 国产第一页精品 | 久久99这里只有精品 | 免费日韩一级片 | 亚洲精品中文字幕在线 | 黄a在线看 | 欧美一级性生活 | 亚洲黄色一级电影 | 亚洲视频 视频在线 | 五月天av在线 | 中文字幕在线一二 | 日日夜夜91 | 欧美日韩在线看 | 91网在线观看 | 在线播放国产一区二区三区 | 国产在线小视频 | 99精品在线看 | 久草在线资源观看 | 人人爽人人爽人人片av免 | 天天操天天色天天射 | 日韩精品一区二区在线观看 | 亚洲乱码在线 | 日韩啪啪小视频 | 去看片| 国产日韩欧美在线 | 日韩三级在线观看 | 最近中文字幕视频网 | 天天操夜夜爱 | 91久久国产综合精品女同国语 | 久久9999久久免费精品国产 | 亚洲精品在线国产 | 99精品在线直播 | 丁香久久| 色综合天天做天天爱 | 国产精久久| 最近免费观看的电影完整版 | 最新av观看| 欧美另类美少妇69xxxx | 中文字幕精品一区久久久久 | 丁香六月在线观看 | 激情 婷婷 | 中文字幕亚洲综合久久五月天色无吗'' | 亚洲第一区在线观看 | www久久九 | av天天澡天天爽天天av | 国产精品入口传媒 | 国产精品美女视频 | 91x色| 亚洲aaa毛片| 91精品国产自产老师啪 | 日韩欧美在线免费 | 午夜av日韩| 欧美激情视频一区二区三区 | 亚洲激情在线播放 | 美女激情影院 | 最近高清中文字幕在线国语5 | 亚洲 精品在线视频 | 成人电影毛片 | www日| www四虎影院 | 久久久久久久久久久久久久av | 97超碰成人 | 中文在线免费视频 | 99这里都是精品 | 精品久久久久久久久久岛国gif | 久久国产高清视频 | 五月婷影院 | 欧美性爽爽 | 亚洲91中文字幕无线码三区 | 激情五月开心 | 久久激五月天综合精品 | 四川bbb搡bbb爽爽视频 | 在线观看深夜福利 | 在线观看免费版高清版 | 在线免费观看的av | 天天色天天射天天综合网 | 国产精品18久久久 | 91精品免费在线 | 99中文字幕视频 | 色婷婷丁香 | 亚洲精品视频网址 | 亚洲精品视频在线免费播放 | 亚洲精品一区二区三区新线路 | 一区二区视 | 国产色婷婷精品综合在线手机播放 | 亚洲国产网址 | 久久免费一| 日韩精品一区二区电影 | 国产又粗又猛又爽又黄的视频免费 | 国产成人精品电影久久久 | 91人人爽人人爽人人精88v | 69国产精品视频 | 免费性网站 | 夜夜躁日日躁狠狠久久88av | 亚洲精品91天天久久人人 | 在线免费国产 | 国产成人香蕉 | 三级黄色网址 | 成av在线 | 亚洲婷婷丁香 | 97精品一区二区三区 | 国产精品av免费在线观看 | 亚洲天天摸日日摸天天欢 | 色综合久久五月天 | 国产免费视频在线 | 国产理论一区二区三区 | 国产美女无遮挡永久免费 | 夜夜夜夜猛噜噜噜噜噜初音未来 | 色天天综合久久久久综合片 | 久久精品欧美一区二区三区麻豆 | 波多野结衣一区三区 | 五月天国产 | 国产精品不卡视频 | 国产精品午夜免费福利视频 | 国产福利91精品一区 | 色吧av色av | 一区二区三区 中文字幕 | 成人av电影网址 | wwwwww色| 久久精品1区2区 | 99视频精品全部免费 在线 | 91c网站色版视频 | 色综合久久99 | 国产欧美综合在线观看 | 亚洲精品久久激情国产片 | 欧美精品一区二区在线播放 | 天天操夜夜做 | 色综合久久88色综合天天免费 | 精品五月天 | 久久r精品 | 亚洲精品国产精品久久99热 | 在线国产专区 | 欧美在线1| 精品久久久久国产 | 日本久久久久久久久久 | 最新黄色av网址 | 豆豆色资源网xfplay | 99热国产在线中文 | 99色人| 亚洲精品小区久久久久久 | 欧美日韩国产一二三区 | 少妇自拍av | 国产一区高清在线观看 | 一级特黄aaa大片在线观看 | 亚洲精品视频免费在线 | 国产 一区二区三区 在线 | 日本公妇在线观看高清 | 五月综合色婷婷 | 国内精品久久久久久久久久久 | 精品久久久久久久久久国产 | 日日干日日 | 久久线视频 | 亚洲成人资源在线观看 | 日韩欧美精品在线 | 日韩二级毛片 | 青草视频在线免费 | 国产视频 亚洲精品 | 一区二区精品在线视频 | 午夜免费电影院 | 热久久电影 | 国产精品中文 | 韩国av一区二区 | 国产精品伦一区二区三区视频 | 国际精品久久久 | 欧美日韩视频在线 | 国产精品久久久久久久久久久杏吧 | 在线观看视频在线观看 | 九九久久电影 | 国产精品精品国产婷婷这里av | www.看片网站 | 丁香综合激情 | 国产999精品久久久 免费a网站 | 99久国产| av电影亚洲 | 欧美日韩不卡在线视频 | 91视频这里只有精品 | 亚洲人久久久 | 国产精品免费麻豆入口 | 日韩欧美国产免费播放 | 91福利社区在线观看 | 1024手机基地在线观看 | 成人三级网址 | 国产精品久久久久久久7电影 | 精品字幕 | a级国产乱理伦片在线观看 亚洲3级 | 国产一区精品在线观看 | 国产人成看黄久久久久久久久 | 在线视频婷婷 | 亚洲天天在线日亚洲洲精 | 亚洲 欧美 成人 | 久久少妇免费视频 | 在线综合 亚洲 欧美在线视频 | 夜夜夜夜猛噜噜噜噜噜初音未来 | 麻豆91网站 | 婷婷久久亚洲 | freejavvideo日本免费 | 国产麻豆精品久久 | 欧美日本中文字幕 | 国产成人精品综合久久久 | 国内精品二区 | 99视频精品| 日韩精品一区不卡 | 国产成人av片 | 香蕉网在线播放 | 午夜色影院 | 国产视频18 | 视频在线观看入口黄最新永久免费国产 | 91超碰免费在线 | 在线看日韩| 97在线影院 | 国产九色在线播放九色 | 在线国产能看的 | 一区三区视频在线观看 | 午夜av网站 | 正在播放国产91 | 深夜免费福利视频 | 成人黄色片免费 | 一区二区三区日韩在线 | 视频国产一区二区三区 | 国产精品中文 | 在线中文字幕网站 | 日日干视频 | 毛片永久新网址首页 | 午夜久草 | 久久9视频 | 日日操天天操狠狠操 | 久久久久国产一区二区 | 亚洲1区 在线 | 成人黄色免费观看 | 成人av免费播放 | 天天操人人干 | 探花视频网站 | 国产精品s色 | 在线a人片免费观看视频 | zzijzzij亚洲成熟少妇 | 婷婷网五月天 | 香蕉视频网址 | 91亚州 | 天天躁日日躁狠狠躁av麻豆 | 国产成人黄色 | 最近最新mv字幕免费观看 | av免费在线免费观看 | 玖玖玖国产精品 | 国产精品色在线 | 福利一区二区在线 | 超碰个人在线 | 国产一二区视频 | 日日操日日干 | 99久久久久久久久久 | 国产精品一码二码三码在线 | 日本黄色大片免费 | 九九热视频在线免费观看 | 91亚·色| 久久免费视频在线观看 | 蜜桃视频在线观看一区 | 亚洲精品国产自产拍在线观看 | 狠狠干我 | 久久久高清视频 | 日韩中文字幕免费电影 | 久久99热精品 | 人人操日日干 | 7777xxxx | 最新av在线播放 | 一区二区精品在线观看 | 日韩3区 | 在线免费视频a | 在线观看国产福利片 | 激情五月在线观看 | 中文字幕在线视频国产 | 精品一区91 | 91成人免费视频 | 91视频在线免费看 | 在线视频福利 | 国产精品久久久久久久久蜜臀 | 国产精品一区久久久久 | 激情深爱五月 | 欧美激情综合五月色丁香 | www.超碰97.com | 一本一道久久a久久精品蜜桃 | 99精品久久只有精品 | 麻豆91精品91久久久 | 亚洲激情视频在线观看 | 日韩欧美在线免费观看 | 欧美日韩精品在线视频 | 美女视频黄免费 | 二区三区在线视频 | 国产区精品在线观看 | 人人爽久久涩噜噜噜网站 | 97色国产 | 黄色免费看片网站 | 欧美一级日韩免费不卡 | 国产美女搞久久 | 97视频免费看| 色av男人的天堂免费在线 | 激情久久久久久久久久久久久久久久 | 在线观看黄色的网站 | 国产精品1区2区3区在线观看 | 欧美xxxx性xxxxx高清 | 亚洲国产网址 | 欧美做受69 | 国产成人精品一区二区三区在线 | 成人网色 | 91字幕 | 成人免费视频网站 | 久久精选视频 | 在线观看日本高清mv视频 | 最近中文字幕免费视频 | 国产人免费人成免费视频 | 国产精品久久精品国产 | 六月丁香社区 | 深爱激情五月网 | 婷婷精品 | 日本激情动作片免费看 | 欧美一级片免费在线观看 | 亚洲成人网av | 黄色国产大片 | 99视频精品免费视频 | 手机av电影在线观看 | 在线观看黄网站 | 91成人网在线观看 | 精品国产亚洲日本 | 999成人 | 天天干天天干天天 | 欧美91精品 | 天天草天天干天天射 | 欧美久久九九 | 五月天婷婷在线视频 | 成人影片在线免费观看 | 一区二区三区国产欧美 | 亚洲国产美女久久久久 | 成人午夜电影在线观看 | 天堂网一区二区 | 亚洲国产精品500在线观看 | 91av在线免费播放 | 久久视频在线免费观看 | 久久这里只有精品23 | 国产精品 视频 | 久久久亚洲麻豆日韩精品一区三区 | 国产精品久久久久久爽爽爽 | 国产精品www | 国产专区视频在线观看 | 久久超| 在线视频日韩欧美 | 狠狠干狠狠操 | 在线观看色网站 | 成人资源在线播放 | 欧美日韩国产在线精品 | 国产免费中文字幕 | 国产高清不卡在线 | 国内成人精品2018免费看 | 日韩视频免费观看高清完整版在线 | 欧美成年人在线观看 | 色在线免费观看 | 在线免费高清一区二区三区 | 九九精品久久久 | 性色av香蕉一区二区 | 欧美日韩一区二区三区免费视频 | 久久精品福利视频 | 97av超碰 | 91日本在线播放 | 午夜精品久久久久久久久久 | 黄网站色视频免费观看 | 国产黄色电影 | 日韩午夜在线 | 亚洲精品男人天堂 | 欧美日韩亚洲精品在线 | 日韩av一区二区三区在线观看 | 91精品伦理 | v片在线播放 | 啪啪午夜免费 | 午夜精选视频 | 亚洲成a人片综合在线 | 五月婷婷操 | 视频一区二区在线观看 | 91网在线| 91看片成人| 久久国产精品免费一区二区三区 | 久草在线免费新视频 | 欧美激情视频久久 | av片中文| 国产精品精品国产婷婷这里av | 九九视频免费观看视频精品 | 欧美福利网址 | 成年人免费在线看 | 毛片网站免费在线观看 | 精品国产视频在线 | 超碰在线观看av | 欧美一级免费黄色片 | 欧美在线视频二区 | 日韩精品一区二区三区不卡 | 狠狠干天天干 | 亚洲国产精品99久久久久久久久 | 97视频在线观看成人 | 91黄色小视频 | av在线激情 | www.五月天| 黄色视屏免费在线观看 | 国产成人精品福利 | 欧美性成人 | 中文字幕av专区 | 国产一区二区电影在线观看 | 亚洲一区二区三区91 | 日韩一区二区三区观看 | 欧美色图亚洲图片 | 99性视频 | 久久久精品网站 | 国产精品色视频 | 天天操综合 | 中文字幕区| 日韩精品中文字幕av | 久久经典视频 | 亚洲精品中文字幕在线观看 | 狠狠色狠狠色合久久伊人 | 国产主播大尺度精品福利免费 | 免费看污在线观看 | 国产黄网站在线观看 | 国产精品久久久久久久久免费看 | 亚洲午夜久久久综合37日本 | 国产精品高清免费在线观看 | 日韩精品免费在线 | av免费在线观看网站 | 99久国产 | 日本久久久久久久久久久 | 久久精品这里热有精品 | 国产手机在线精品 | 亚洲一区日韩精品 | 欧美一二三视频 | 久久视频在线免费观看 | 999成人| 在线观看免费一区 | 精品一区二区久久久久久久网站 | 国产伦精品一区二区三区照片91 | 国产乱对白刺激视频在线观看女王 | 青草视频免费观看 | 精品国产中文字幕 | 色婷婷视频 | 中日韩男男gay无套 日韩精品一区二区三区高清免费 | 天天操欧美 | 欧美日韩高清一区二区三区 | 国产男女爽爽爽免费视频 | 丁香激情综合久久伊人久久 | 美女免费视频网站 | 欧美二区三区91 | 亚洲va在线va天堂 | 97电影院网 | 色视频网站在线 | 99精品视频免费观看视频 | 免费看片网页 | 久二影院 | 婷婷在线网 | 91精品国产综合久久久久久久 | 在线观看国产成人av片 | 激情久久伊人 | 91精品视频观看 | bayu135国产精品视频 | 91免费观看视频网站 | 欧美激情第28页 | 成人在线播放网站 | 国产精品成人在线观看 | 成人动漫一区二区 | 国产69精品久久久久9999apgf | 国产日韩欧美自拍 | 色夜影院 | 欧美精品免费在线 | 免费av网站在线 | 超碰人人在 | www.伊人网 | 欧美日韩xxxxx | 国产精品免费大片视频 | 国产99久久九九精品免费 | 亚洲精品在线观看中文字幕 | 91精品国产综合久久福利不卡 | 亚洲成人资源 | 激情网站免费观看 | 国产精品欧美一区二区三区不卡 | 天堂va在线观看 | 国产成人av片| 午夜精品久久久久久久99 | 国产精品1000 | 欧美黑人xxxx猛性大交 | 久久久久国产精品视频 | 精品999久久久 | 久久久99精品免费观看 | 亚洲丁香久久久 | 国产精品一区二区中文字幕 | 91精品久久久久久久久久久久久 | 色a在线观看 | 久久久久久毛片 | 婷婷在线色 | 天天干亚洲 | 波多野结衣在线视频免费观看 | 免费在线观看污 | 中文国产在线观看 | 精品一区二区综合 | 日本久久影视 | 黄色精品视频 | 狠狠插狠狠干 | 粉嫩av一区二区三区四区 | 国产精品久久99精品毛片三a | 97电影在线看视频 | 91久久在线观看 | 日韩欧美精选 | 激情婷婷欧美 | 国产精品色视频 | 国产精品成人一区二区三区吃奶 | 国产一级做a爱片久久毛片a | 在线国产中文 | 四虎国产精品成人免费影视 | av在线等| 久久国产免费 | 中文字幕高清视频 | 欧美在线一 | 伊人国产女 | 欧美日本一区 | 在线观看一二三区 | 亚洲资源在线网 | 久久视频国产精品免费视频在线 | 在线免费试看 | 91视频国产高清 | 中文日韩在线视频 | 中文字幕一区二区三区久久 | 中文字幕 国产精品 | 国产一级二级在线观看 | 精品久久福利 | 久久精品99北条麻妃 | 99久久精品免费看国产免费软件 | 麻豆视频一区 | 黄色一级大片在线观看 | 天天操网| 极品久久久久久久 | 四虎成人精品永久免费av九九 | 911免费视频 | 久久久久久美女 | 特级xxxxx欧美 | 国产在线观看二区 | 伊人伊成久久人综合网小说 | 开心色婷婷 | 中文字幕高清av | 国产精品乱码高清在线看 | 国产九九九精品视频 | 色av资源网| 四虎在线视频免费观看 | 中文乱码视频在线观看 | 国产专区在线看 | 日韩欧美一区二区三区视频 | 在线亚洲日本 | 日韩电影在线观看一区二区三区 | 特级西西人体444是什么意思 | 亚洲成人av片在线观看 | 九九精品视频在线观看 | 国产精品精 | 国产xxxx做受性欧美88 | 黄色毛片一级片 | 男女啪啪网站 | 国产一区二区在线免费播放 | 三级黄色在线观看 | 亚洲综合成人av | 国产人成免费视频 | 九草视频在线 | 亚洲人成人在线 | 亚洲 中文 欧美 日韩vr 在线 | 在线观看视频h | 97超碰色偷偷 | 亚洲美女在线国产 | 久草网免费 | 天天做日日爱夜夜爽 | 欧美一级片在线观看视频 | 国产黄色精品在线观看 | 国产视频91在线 | 日韩久久精品一区二区三区下载 | 久草香蕉在线 | 在线观看爱爱视频 | 日韩精品视频免费在线观看 | 久草视频精品 | 国产99久久九九精品 | 在线观看黄av | 欧美精品久久久久久久久免 | 一区二区三区免费在线播放 | 免费日韩一区二区三区 | 亚洲一级电影 | 欧美在线a视频 | 丁香婷婷久久久综合精品国产 | 最近中文字幕高清字幕免费mv | 亚洲毛片一区二区三区 | 欧美日韩国产在线观看 | 1000部国产精品成人观看 | 久久人网 | 国产黄色片在线免费观看 | 成人动图 | 九九免费在线观看视频 | 九九热视频在线播放 | 婷婷在线网站 | 国产日韩欧美在线一区 | 一区在线观看 | 久久精品综合一区 | 久久视精品 | 夜夜狠狠 | 久久久91精品国产一区二区三区 | 久草资源在线观看 | 少妇高潮冒白浆 | 欧美午夜一区二区福利视频 | 69视频国产 | 超碰在线97观看 | 亚洲一区尤物 | 国产中年夫妇高潮精品视频 | 国产专区精品视频 | 亚洲精品综合在线观看 | 97电影网站 | 日韩在线首页 |