日韩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的概要生成过程的全部內容,希望文章能夠幫你解決所遇到的問題。

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

婷婷六月久久 | 美女网站在线看 | 91精品国产成 | 久久综合五月 | 国产69精品久久久久99 | 国产无套精品久久久久久 | 久久久综合九色合综国产精品 | 99热在线精品观看 | 日韩一区二区免费视频 | 久久免费毛片视频 | 亚洲精品久久激情国产片 | 免费精品在线观看 | 精品成人免费 | 国产精品一区二区免费视频 | 成年人在线播放视频 | 国产小视频精品 | 欧美成人在线免费观看 | 黄色网中文字幕 | 久草视频免费播放 | 在线看污网站 | 色偷偷88888欧美精品久久 | 看片网站黄 | 亚洲高清视频在线播放 | 成人黄色小说在线观看 | 伊人狠狠色丁香婷婷综合 | 久久国产精品99久久久久 | 国产免费一区二区三区网站免费 | 午夜免费久久看 | 91免费视频国产 | 在线中文字母电影观看 | 色综合久久五月天 | 免费高清在线观看电视网站 | 91污视频在线| 亚洲激情综合 | 国产99久久九九精品 | 99久久日韩精品免费热麻豆美女 | 久久久久免费精品国产小说色大师 | 日韩3区 | 成人丝袜 | 国产自产高清不卡 | 国产精品麻豆三级一区视频 | 亚洲欧美成人网 | 99免在线观看免费视频高清 | 久久短视频 | 91久久国产精品 | 国产中出在线观看 | 国产精品午夜8888 | 午夜精品久久久久久久99 | 中文字幕免费高 | 精品久久久久久一区二区里番 | 天天射天天色天天干 | 91av视频在线观看免费 | 亚洲国产日韩精品 | 香蕉视频最新网址 | 色97在线 | 粉嫩一区二区三区粉嫩91 | 亚洲毛片在线观看. | 黄色三几片 | 99热手机在线观看 | 九九九九九九精品任你躁 | 日韩精品视频在线观看网址 | 免费观看成人 | 免费在线色 | av高清一区二区三区 | 91视频免费看网站 | 欧美日韩大片在线观看 | 干干干操操操 | 日韩视频中文字幕 | 亚州精品视频 | 国产视频不卡 | 亚洲精品美女久久久久 | 免费在线a | 中文字幕在线看视频 | 国产午夜在线观看视频 | 成人不用播放器 | 国产精品久久久久影视 | 亚洲激情免费 | 精品久久美女 | 久久久九色精品国产一区二区三区 | 亚洲精品美女久久久久 | 91精品免费在线 | 久久久久久福利 | 亚洲一二三久久 | 一区二区视频电影在线观看 | 超碰在线97观看 | 最近日本mv字幕免费观看 | 另类五月激情 | 最近中文字幕第一页 | 久久中文字幕视频 | 精品久久久久久国产91 | 国产色在线视频 | 日韩夜夜爽| 国产精品视频地址 | 一级一片免费观看 | 97视频在线播放 | 成年人视频在线 | 日本动漫做毛片一区二区 | 一区二区视频欧美 | 久久久久国产精品厨房 | 亚洲精品视频在线观看视频 | 97超级碰碰碰碰久久久久 | 欧美一区二区三区在线视频观看 | 日韩欧美视频在线播放 | 天堂av网在线 | 悠悠av资源片 | 高潮久久久久久久久 | 日韩中文在线观看 | 欧美一区二区精品在线 | 男女免费视频观看 | 国产成人av网站 | 国内外成人免费在线视频 | 成人av电影在线播放 | 成人av在线直播 | 97精品视频在线 | 日韩av图片 | 欧美少妇影院 | 天天操天天操天天 | 在线视频日韩欧美 | 日韩精品中文字幕在线不卡尤物 | 久久这里只有精品首页 | 91在线视频免费91 | 999久久a精品合区久久久 | 97香蕉超级碰碰久久免费软件 | 天天草天天爽 | 国产精品大片免费观看 | 九九99靖品 | 国产精品久久久久久久久搜平片 | 免费av观看网站 | 久久视频这里有久久精品视频11 | 亚洲免费公开视频 | 99久久99久久 | 色网址99| 黄色免费av| 91大神电影| 99免费| 狠狠操导航 | 在线视频观看亚洲 | 日韩成人黄色av | 亚洲蜜桃av| 国产成人av电影在线 | 欧美成人影音 | 国产精品入口麻豆 | 人人爱天天操 | 超碰在线最新网址 | 国产精品情侣视频 | 在线中文字幕av观看 | 视频在线观看一区 | 日日综合网 | 蜜臀久久99精品久久久酒店新书 | 成在线播放 | 国产黄免费 | 亚洲成av人片 | 一区二区精品视频 | 久久综合九色综合久99 | 久久999久久 | 2022久久国产露脸精品国产 | 奇米影视8888 | 99在线热播 | 伊人国产在线播放 | 日本公妇在线观看高清 | 毛片.com| 91一区二区在线 | 在线国产专区 | 日本久久久影视 | av成人在线观看 | 国产精品久久久久久久7电影 | 国产精品丝袜在线 | 午夜久久久影院 | 久久精品香蕉 | av在线电影播放 | 国产高清绿奴videos | 欧美成天堂网地址 | 亚洲理论片在线观看 | 91精品人成在线观看 | 中中文字幕av | 97精品国自产拍在线观看 | 日日干av | 精品久久久久久亚洲综合网站 | 亚洲资源在线观看 | 日韩资源在线观看 | 日本在线中文 | 亚洲视频,欧洲视频 | 久久精品国产一区二区 | 亚洲精品九九 | 最近中文字幕免费观看 | 伊人黄色网 | 久久毛片视频 | 国产视频在线观看免费 | 欧美日韩精品在线观看视频 | 久久一区二 | 91福利社区在线观看 | 成人av电影免费在线播放 | 一本—道久久a久久精品蜜桃 | 九九色在线观看 | av在线电影免费观看 | 国产色视频网站2 | 久久99国产精品久久 | 亚洲成av人影片在线观看 | 免费看v片网站 | 欧美精品视 | 欧美成人h版电影 | 香蕉视频亚洲 | www天天干| 国产精品久久在线 | 国产在线日本 | 激情久久久久久久久久久久久久久久 | 欧美另类网站 | 日韩精品专区在线影院重磅 | 观看免费av| 国产黄色精品在线 | 超碰在线天天 | 免费视频你懂的 | 在线黄色免费 | 操操操com | 亚洲精选国产 | 中文不卡视频在线 | 五月婷婷在线综合 | 日韩av黄 | 午夜婷婷在线播放 | 在线观看av国产 | 欧美成人基地 | 成人黄色在线观看视频 | 欧美激情在线看 | 99免费在线播放99久久免费 | 五月婷婷欧美 | 国产亚洲精品久久久久久大师 | 黄色免费网站下载 | 亚洲91av| 狠狠操狠狠干天天操 | 日日草天天干 | 亚洲视频1 | 欧美色图视频一区 | 国产精品视频免费 | 午夜三级理论 | 天天曰天天 | 91视频免费网站 | 91mv.cool在线观看 | 色视频成人在线观看免 | 特级黄录像视频 | 日本黄网站| 日韩一区二区三区视频在线 | 波多野结衣精品在线 | 2024国产在线 | 97看片吧| 毛片播放网站 | 毛片网免费| 黄色一级大片在线免费看产 | 2019中文最近的2019中文在线 | 香蕉视频4aa | 色在线高清| 丁香视频五月 | 国产精品精品久久久久久 | 日韩电影一区二区在线 | 色综合a| 国产不卡免费av | 国产日韩高清在线 | 日本一区二区高清不卡 | 91av免费观看 | 亚洲黄色av | 日韩r级在线 | 在线精品一区二区 | 在线观看日韩视频 | 成人av在线一区二区 | 在线观看免费黄色 | 日韩欧美一区二区在线观看 | 日本久久久久久久久久久 | 久久综合视频网 | 国产精品福利在线播放 | 在线国产欧美 | 91久久爱热色涩涩 | 日日爱影视 | 色com网| 999视频网| 日日噜噜噜噜夜夜爽亚洲精品 | av观看免费在线 | 97福利在线 | 久草视频中文在线 | 月下香电影 | 国产啊v在线观看 | 日韩精品久久久久久久电影99爱 | 色狠狠干 | 国产精品久久久久久久免费大片 | 国产永久网站 | 91高清不卡 | 在线观影网站 | 欧美成人影音 | 欧美天堂久久 | 国产成人精品一区二 | 成人在线观看网址 | 久久久久久久久亚洲精品 | 中文日韩在线视频 | 日韩激情网 | 日韩高清久久 | 狠狠插狠狠干 | 久久乐九色婷婷综合色狠狠182 | 97在线观 | 久久一区91 | 特级免费毛片 | 中文字幕的 | 久久这里有精品 | 精品视频在线看 | 中文字幕美女免费在线 | 91福利在线观看 | 国产精品观看在线亚洲人成网 | 激情www | 成人97人人超碰人人99 | 国产字幕在线看 | 精品国内自产拍在线观看视频 | 日韩电影一区二区在线 | 久草精品在线播放 | 亚洲国产精品500在线观看 | 国产精品18久久久久久久久久久久 | 天天插综合 | 91观看视频 | www.888av| 一区二区久久久久 | 国产999精品久久久久久麻豆 | 日韩视频免费在线 | 玖玖玖国产精品 | 免费网站污 | 国产视频一区在线免费观看 | 国产剧情在线一区 | 国产精品美女久久久久久2018 | 久久韩国免费视频 | 日韩黄色一区 | 视频一区二区免费 | 夜夜婷婷 | 国产成人福利在线观看 | 中文字幕日韩在线播放 | 热re99久久精品国产66热 | 久久综合激情 | 久久综合九色综合97_ 久久久 | 国产综合精品一区二区三区 | 黄色三级免费看 | 久草在线视频网站 | 国产精品都在这里 | 亚洲精品xx | 精品久久久久久国产偷窥 | av免费在线网站 | 久久公开视频 | 午夜久久美女 | 亚洲精品午夜国产va久久成人 | 国产精品一区二区三区视频免费 | 99精品视频在线观看播放 | 九九99 | 麻豆视频免费 | 亚洲成人av在线播放 | 欧美精品资源 | 五月激情五月激情 | 91九色最新 | 91视频免费 | 久久草网站 | 在线直播av | 亚洲精品毛片一级91精品 | 国产精品毛片久久蜜 | 日韩欧美视频在线免费观看 | 91精品福利在线 | av在线播放亚洲 | 亚州国产精品久久久 | 激情五月看片 | 日韩高清一二区 | 手机av在线不卡 | 国产一区二区视频在线播放 | 欧美综合色在线图区 | 99久久99热这里只有精品 | 精品国产一区二区三区在线 | 亚洲精品乱码久久久久v最新版 | 精品视频免费 | 亚洲春色成人 | 丰满少妇对白在线偷拍 | 天天操伊人 | 久久成人免费电影 | 操碰av| 91黄色小视频 | 久草网在线 | 中文日韩在线 | 欧美日韩三区二区 | 国产福利一区二区三区视频 | 国产一区免费 | 天天插天天操天天干 | 天天干天天玩天天操 | 精品一区二区在线免费观看 | 久久96国产精品久久99软件 | 色网站国产精品 | 日韩成人黄色av | 国产一级小视频 | 精品久久久久久久久久国产 | 亚洲国产精品资源 | 在线观看国产 | 一本色道久久综合亚洲二区三区 | 日韩视频在线不卡 | 四虎伊人| 黄色小说视频在线 | 日韩免费二区 | 精品一区 精品二区 | 久久伊99综合婷婷久久伊 | 成年人免费在线 | 欧美另类v | 亚洲在线免费视频 | 婷婷六月丁 | 奇米影视777四色米奇影院 | 成人三级网址 | 国产精品久久久久影视 | 亚洲涩涩网 | 日本不卡一区二区 | 中文字幕 国产视频 | 免费在线观看亚洲视频 | 2024国产精品视频 | 91porny九色91啦中文 | 久久久受www免费人成 | 精品麻豆入口免费 | 99久久精品国产一区二区三区 | 97精品在线视频 | 夜夜天天干 | 欧美一级特黄高清视频 | 91精品色 | 国产视频 亚洲精品 | 91精品国产综合久久久久久久 | 久久综合九色欧美综合狠狠 | 91在线视频观看 | 天堂av在线网址 | 国产视频一区二区三区在线 | 91网页版在线观看 | 久久综合久久综合久久 | 99精品国产99久久久久久97 | 欧美国产日韩一区二区三区 | 精品国产乱码久久久久久天美 | 91久久一区二区 | 国产日本亚洲高清 | 日本夜夜草视频网站 | 五月婷婷在线观看 | 日本激情中文字幕 | 黄色日本免费 | 91黄色在线看 | 国产自制av | 婷婷亚洲激情 | 日韩午夜av | 免费在线观看中文字幕 | 九九九九九九精品任你躁 | 91亚洲精品久久久蜜桃网站 | 欧美一区二区三区在线播放 | 精品91久久久久 | 免费热情视频 | 国产不卡精品视频 | 天天射射天天 | 国产麻豆精品一区二区 | 成人免费在线观看av | 天堂av观看 | 在线观看韩国av | 国产亚洲综合性久久久影院 | 国产精品久久毛片 | 色综合中文综合网 | 黄色一级大片在线免费看产 | 在线观看精品黄av片免费 | 国产又黄又爽无遮挡 | 午夜免费福利片 | 一区二区三区手机在线观看 | 在线中文日韩 | 91自拍91 | 久久久久久高清 | 伊人婷婷色 | 国产一区免费在线 | 国产码电影 | 黄色毛片视频免费 | 久久久久久久久久网站 | 在线91播放| 香蕉久久久久 | 在线欧美a| 久色 网 | 97在线资源 | 国产精品成人品 | 婷婷色网址 | 97国产电影 | 伊人天堂网 | 成人av电影免费在线观看 | 在线看不卡av | 免费看在线看www777 | 国产精品一区二区三区在线播放 | 色综合久久久久综合99 | 国产91精品一区二区 | 国产成人久久精品77777 | 国产精品9999久久久久仙踪林 | 成人av免费看 | 午夜视频在线观看欧美 | 久久久久黄色 | 国产精品视频999 | 国产午夜精品久久久久久久久久 | 五月天综合色激情 | 黄色一级免费网站 | 国产视频一 | 久久黄网站 | 五月婷网站 | 亚洲国产无 | 日韩在线视频一区二区三区 | 中文字幕黄色 | 丁香久久| 在线网址你懂得 | 97成人精品视频在线播放 | av网站免费看| 精品久久久久久久久久久久久久久久久久 | 激情婷婷亚洲 | 91精品天码美女少妇 | 片网址 | 国产中文字幕第一页 | 波多野结衣在线观看一区 | 天天舔天天射天天操 | 天天操夜夜拍 | 免费高清在线视频一区· | 亚洲欧美综合精品久久成人 | 人人插人人费 | 久久精选 | 久久综合狠狠综合久久狠狠色综合 | 亚洲国产精品电影 | www欧美xxxx | 少妇性aaaaaaaaa视频 | 区一区二区三区中文字幕 | 国产精品免费高清 | 亚洲少妇激情 | 欧美成人91 | 精品一区二区免费在线观看 | 五月天天色| 久久久九九 | 美女视频黄在线 | 久草网首页| 天天色官网 | 色资源在线 | 嫩草av在线 | 国产视频日韩 | 天天天操操操 | 99视频在线观看一区三区 | 久久免费视频1 | 久艹在线观看视频 | 91片黄在线观看 | 中文字幕在线观看视频免费 | 欧美美女激情18p | 日韩在线免费播放 | 国产区在线视频 | 亚洲影院国产 | 久久免费视屏 | 日韩欧美xxx | 久久精品麻豆 | 国产午夜精品一区 | 久久99热精品这里久久精品 | 日韩精品在线观看av | 天天舔天天搞 | 人人爽人人爽人人片 | 日韩在线视频观看 | 天天干天天做天天操 | 在线精品视频免费播放 | 在线激情网 | 国产精品美女久久久久久久 | 国产一区二区精品 | 国产91对白在线播 | 国产成人精品亚洲精品 | av日韩在线网站 | 色婷婷六月 | 久久精品5 | www夜夜| 国产精品嫩草影院99网站 | 久久久久高清 | 欧美日韩精品久久久 | 中文免费观看 | 国产一区二区三区视频在线 | 免费观看全黄做爰大片国产 | 99视频在线 | 久久久久久免费毛片精品 | 中文字幕乱码亚洲精品一区 | 国产一区二区三区网站 | 在线观看国产麻豆 | 久久99久久99精品 | 国产精品美女久久久久久免费 | 色播五月激情五月 | 久久精品视频在线观看免费 | 欧美一区在线观看视频 | 在线亚洲小视频 | 91久久精品一区二区三区 | 国产精品一区二区免费 | 日本中文字幕观看 | 久久99久久99精品免观看软件 | 欧美aa级| 国产日本在线播放 | 日韩av三区 | bbb搡bbb爽爽爽 | 国产精品久久久久aaaa九色 | 中文字幕在线看 | 国产午夜小视频 | 精品久久久久久久久久久久 | 欧美一区日韩一区 | 在线观看国产一区 | 人人澡澡人人 | 国产91在线观 | 欧美日韩国产精品一区二区亚洲 | 国产手机av| 国产一二区视频 | 99在线精品免费视频九九视 | 久久视频国产精品免费视频在线 | 久久精品一二区 | 免费在线观看av | 中文字幕一区二区三区四区 | 欧美永久视频 | 亚洲最新合集 | 国产精品ⅴa有声小说 | 狠狠夜夜| 中文字幕在线播放视频 | 国产999视频 | 国产一区二区在线免费观看 | 亚洲欧美视频在线 | 亚洲片在线资源 | 激情婷婷欧美 | 国产免码va在线观看免费 | 色综合久久久久久久久五月 | 99久久精品久久久久久动态片 | 狠狠狠色丁香综合久久天下网 | 久久99精品久久久久久久久久久久 | 视频一区二区视频 | 一区二区三区免费在线观看视频 | 午夜视频免费 | 亚洲欧洲国产视频 | 国产精品高潮久久av | 丁香婷婷激情网 | 韩国av免费在线 | 亚洲四虎 | 韩日精品在线 | 色播五月婷婷 | 91视频在线观看大全 | 91精品在线视频 | 亚洲欧美在线综合 | 国产精品爽爽爽 | 成人午夜精品久久久久久久3d | 国产午夜精品一区二区三区在线观看 | 国产美腿白丝袜足在线av | 99色免费| 国产成人精品一区二 | 三级黄在线 | 久热精品国产 | 国产精品免费观看网站 | 婷婷深爱五月 | 激情欧美xxxx | 激情小说网站亚洲综合网 | 日韩久久在线 | 国产精品久久久久久久久久久久久久 | 99热最新精品| 在线免费观看的av网站 | 日日夜夜天天操 | 91爱看片| 99精品视频免费看 | 一区二区三区中文字幕在线观看 | 狠狠做六月爱婷婷综合aⅴ 日本高清免费中文字幕 | 成人a级大片 | 婷婷六月色 | 69国产盗摄一区二区三区五区 | 日韩精品视频在线免费观看 | 91少妇精拍在线播放 | 精品国模一区二区三区 | 久久一区二区三区四区 | 黄色电影小说 | 久久99精品国产99久久 | 国产h片在线观看 | 国产第一福利 | 能在线看的av | 国产精品久久久久久久av电影 | 在线www色| 久久99最新地址 | 国产永久免费 | 国产午夜在线 | 亚洲免费精彩视频 | wwwwwww黄| 日韩久久久| 亚洲国产精品视频 | 国产中文字幕在线观看 | 狠狠色伊人亚洲综合网站野外 | 国产成人精品在线播放 | 亚洲综合在线五月 | 99亚洲精品视频 | 激情五月av | 成人久久18免费网站图片 | 亚洲成人资源在线 | 91九色国产蝌蚪 | 男女激情麻豆 | 亚洲国产欧美在线人成大黄瓜 | 天堂在线一区二区 | 99久久婷婷国产综合精品 | 超碰电影在线观看 | 91片网 | 狠狠操狠狠操 | 亚洲精品在线一区二区 | 最新中文字幕在线观看视频 | 日韩在线视频网 | 在线免费观看麻豆视频 | 一本一本久久a久久精品综合妖精 | 伊人色综合网 | 黄色小说视频网站 | 欧美91精品久久久久国产性生爱 | 日韩电影中文字幕在线观看 | 91亚洲视频在线观看 | 国产色女 | 99视频在线免费 | 国产福利免费在线观看 | 成年人免费看片网站 | 草在线| 日韩福利在线观看 | 91免费网 | 在线观看国产麻豆 | 在线欧美日韩 | 日本在线观看中文字幕无线观看 | 日韩av一区在线观看 | 中文字幕在线免费 | 1024手机在线看 | 精品一区精品二区高清 | 日韩午夜精品福利 | 色天天综合久久久久综合片 | 精品在线视频观看 | 欧美综合在线视频 | 亚洲做受高潮欧美裸体 | 国产精品成人一区二区三区 | 久久成年人网站 | 九九久久久久久久久激情 | 日韩在线免费高清视频 | 99精品国产99久久久久久97 | www.精选视频.com | 麻豆视频免费播放 | 久久久资源 | 日本精品中文字幕在线观看 | 色国产在线 | 中国老女人日b | 五月婷婷六月丁香在线观看 | 欧美国产日韩激情 | 免费福利片2019潦草影视午夜 | 亚洲精品国产第一综合99久久 | 91字幕| 中文在线免费一区三区 | 欧美精品久久久久久久久久久 | 人人干人人添 | 精品国产自在精品国产精野外直播 | 欧美成年网站 | 91视频在线观看下载 | 久久精品国产v日韩v亚洲 | 精品一区二区免费 | 久久久精品日本 | 日本精品视频在线观看 | 黄色免费网战 | 91麻豆精品国产91久久久更新时间 | 日本高清中文字幕有码在线 | 九九热视频在线播放 | 成年美女黄网站色大片免费看 | 在线观看久久 | 91麻豆精品91久久久久同性 | 亚洲国产成人高清精品 | 日本精品久久久一区二区三区 | 99久久国产免费,99久久国产免费大片 | 一级欧美日韩 | 日韩在线国产 | 国产日产精品一区二区三区四区的观看方式 | 国产在线小视频 | 亚洲极色 | 蜜臀av网站 | 国产亚洲精品成人av久久ww | 一区二区视频电影在线观看 | 成人黄色片在线播放 | av一区在线 | 欧美激情精品久久久久久免费印度 | 日韩欧美高清不卡 | 97在线看| 国产精品久久久久久av | 亚洲婷婷在线 | 91一区啪爱嗯打偷拍欧美 | 人人澡视频 | 中文字幕国产精品 | 久久久久成人精品免费播放动漫 | 国产va精品免费观看 | 欧美在线视频第一页 | 国产精品欧美一区二区 | 国产精品mv在线观看 | 亚洲午夜久久久久久久久久久 | 精品毛片久久久久久 | 麻豆av一区二区三区在线观看 | 久久精品一二三区白丝高潮 | 亚洲国产精品99久久久久久久久 | 在线91观看 | 亚洲永久国产精品 | 色 免费观看 | 国产精品综合av一区二区国产馆 | 久久精品看 | 99国产在线 | 久久精品视频免费播放 | 国产精品99爱 | 91tv国产成人福利 | 欧美乱码精品一区二区 | 亚洲人成精品久久久久 | 91精品一区二区三区久久久久久 | 日本在线成人 | 国产一区二区成人 | 天天做日日做天天爽视频免费 | 久久96国产精品久久99漫画 | 香蕉在线观看视频 | 99这里只有精品99 | 午夜精品区 | 99在线热播精品免费 | 亚洲三级在线免费观看 | 欧美一二区在线 | 1024手机基地在线观看 | 久久久久久久亚洲精品 | 久久韩国免费视频 | 亚洲精品免费观看视频 | 国产精品成久久久久三级 | 久草网免费 | 丰满少妇高潮在线观看 | 狠狠的日日| 亚洲成av人影片在线观看 | 欧美性生交大片免网 | 欧美精品少妇xxxxx喷水 | 日日夜夜免费精品视频 | 日韩精品免费在线 | 91中文字幕 | 久久久久在线视频 | 国产aaa免费视频 | 玖玖玖国产精品 | 香蕉视频网站在线观看 | 亚洲不卡123 | av看片网址 | 91av视屏 | 97电影网站| 福利视频一二区 | 日本精品视频一区二区 | 国产精品亚洲片在线播放 | 国产手机在线播放 | 亚洲 欧美 日韩 综合 | 韩国一区二区三区视频 | 欧美性生活小视频 | 91传媒激情理伦片 | 亚洲丁香久久久 | 久青草视频 | 午夜精品电影一区二区在线 | 九九99视频 | 亚洲网站在线看 | 又黄又爽又色无遮挡免费 | 国产免费久久精品 | 开心激情网五月天 | 国产亚洲激情视频在线 | 久久电影日韩 | 婷婷电影在线观看 | 亚洲乱码精品 | 毛片网站免费在线观看 | 成人在线播放免费观看 | 日日操天天操夜夜操 | 欧美a√在线 | 激情五月综合网 | 天天摸天天操天天舔 | 日韩中文字幕免费看 | 黄色在线网站噜噜噜 | 亚洲免费观看在线视频 | 国产精品国产三级国产aⅴ无密码 | 高清精品久久 | 91视频a| 中文字幕中文字幕在线中文字幕三区 | 免费在线成人av | 人交video另类hd | 最近的中文字幕大全免费版 | 全久久久久久久久久久电影 | 91麻豆免费看 | 国产高清在线a视频大全 | 天天干天天操天天干 | 人人添人人澡人人澡人人人爽 | 久久免费视频一区 | 中文字幕国产精品一区二区 | 免费色婷婷 | 在线黄色国产 | 国产成人一区二区三区免费看 | 天天综合日日夜夜 | aa级黄色大片 | 日韩欧美视频免费在线观看 | 中文字幕免费高清 | 日韩电影在线观看中文字幕 | 国产在线观看午夜 | 天天干com | 69av在线视频 | av一区在线播放 | 五月激情婷婷丁香 | 午夜在线免费视频 | 欧美日韩视频在线观看免费 | 97香蕉久久超级碰碰高清版 | 国产一级淫片免费看 | 激情片av | 国内视频| 一区二区三区在线免费播放 | 国产尤物在线 | 在线亚洲欧美日韩 | 亚洲专区中文字幕 | 中文字幕中文字幕在线中文字幕三区 | 又黄又色又爽 | 一区二区三区免费在线 | 国产精品 美女 | 国产无遮挡又黄又爽在线观看 | 五月香视频在线观看 | 激情深爱.com| www.狠狠插.com | 三级小视频在线观看 | 碰超在线 | www视频免费在线观看 | 久99精品| 伊人午夜 | 精品影院一区二区久久久 | 欧美日韩免费看 | 久久手机视频 | 在线观看日韩 | 美女搞黄国产视频网站 | 午夜精品在线看 | 成人av免费播放 | 日韩一区二区三区高清在线观看 | 99视频在线免费播放 | 黄色一级动作片 | 欧美国产大片 | 日韩av免费在线电影 | 黄色片网站 | 久久精品视频国产 | 国产黄色片网站 | 91亚洲精| 久久国产一区二区三区 | 婷婷色婷婷 | 黄污网 | 国产精品久久久久久高潮 | 最新av中文字幕 | 草免费视频 | 又爽又黄又无遮挡网站动态图 | 国产精品一区电影 | 99精品久久久久久久久久综合 | 五月婷婷播播 | 欧美日韩高清一区二区 国产亚洲免费看 | 国产成人精品一区二区在线 | 久久国产精品一区二区 | 国产91aaa | 久久久99国产精品免费 | 欧美精品久久久久久久久久久 | 香蕉视频在线播放 | 久久视频国产精品免费视频在线 | 99色在线观看视频 | 午夜色婷婷 | 99视频在线免费看 | 国产一区av在线 | 亚洲 欧美 综合 在线 精品 | 亚洲精品免费在线播放 | 91视频黄色| 天堂av在线网站 | a级片久久久 | 国产成人av电影在线观看 | 欧美日韩在线精品一区二区 | 激情六月婷婷久久 | www日韩高清| 国产成人免费在线观看 | 国产专区欧美专区 | 麻豆影视在线免费观看 | 久久久久国产精品免费 | 久久国产精品免费 | 成人黄色免费在线观看 | 少妇bbbb搡bbbb搡bbbb | 日日夜夜噜噜噜 | 在线精品视频免费播放 | 国产精品一二三 | 亚洲三级在线免费观看 | 99精品国产aⅴ | 狠狠色丁香 | 日韩理论| 91精品久久久久久综合乱菊 | 中文字幕成人在线观看 | 美女精品久久久 | 99久久婷婷国产一区二区三区 | 精品人妖videos欧美人妖 | 国产一区二区精 | 色综合婷婷 | 亚洲欧洲一区二区在线观看 | 亚洲国产婷婷 | 伊人伊成久久人综合网小说 | 国内精品久久久久影院一蜜桃 | 色狠狠一区二区 | 91大神电影 | 91爱看片 | 色多视频在线观看 | 四虎国产精品免费 | 超碰人人草 | 国产中文视频 | 91.精品高清在线观看 | 国产亚洲精品v | 91在线91拍拍在线91 | 午夜视频在线网站 | 另类五月激情 | 国产精品久久久久毛片大屁完整版 | 久久经典国产视频 | 国产对白av | 久草视频在线免费看 | 亚洲高清精品在线 | 91视频午夜 | 亚洲高清视频在线观看免费 | 天堂成人在线 | 国产精品视频永久免费播放 | 亚洲午夜精品久久久 | 免费视频一区 | 精品久久久久久久久中文字幕 | 97在线观 |