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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

4-uboot编译流程

發布時間:2025/3/21 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 4-uboot编译流程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
[uboot] (第四章)uboot流程——uboot編譯流程
2016年11月01日 21:23:36閱讀數:2983

以下例子都以project X項目tiny210(s5pv210平臺,armv7架構)為例

[uboot] uboot流程系列:?
[project X] tiny210(s5pv210)上電啟動流程(BL0-BL2)?
[project X] tiny210(s5pv210)從存儲設備加載代碼到DDR?
[uboot] (第一章)uboot流程——概述?
[uboot] (第二章)uboot流程——uboot-spl編譯流程?
[uboot] (第三章)uboot流程——uboot-spl代碼流程?
[uboot] (第四章)uboot流程——uboot編譯流程?
[uboot] (番外篇)global_data介紹?
[uboot] (番外篇)uboot relocation介紹

建議先看《[project X] tiny210(s5pv210)上電啟動流程(BL0-BL2)》,根據例子了解一下上電之后的BL0\BL1\BL2階段,以及各個階段的運行位置,功能。?
建議先看《[uboot] (第二章)uboot流程——uboot-spl編譯流程》,其編譯流程基本上是類似的。最大區別在于dtb的編譯。

=================================================================================

一、uboot編譯和生成文件

0、說明

現在的uboot已經做得和kernel很像,最主要的一點是,uboot也使用了dtb的方法,將設備樹和代碼分離開來(當然可以通過宏來控制)。?
project-x/u-boot/configs/tiny210_defconfig

CONFIG_OF_CONTROL=y // 用于表示是否使用了dtb的方式CONFIG_OF_SEPARATE=y // 是否將dtb和uboot分離表一
  • 1
  • 2
  • 3
  • 4
  • 5

所以在uboot的編譯中,和spl的最大區別是還要編譯dtb。?(前面我們將的spl是沒有使用dtb的,當然好像也可以使用dtb,只是我沒有試過)。

1、編譯方法

在project X項目中,所有鏡像,包括uboot、kernel、rootfs都是放在build目錄下進行編譯的。具體去參考該項目build的Makefile的實現。?
假設config已經配置完成,在build編譯命令如下:

make uboot
  • 1

Makefile中對應的命令如下:?
project-x/build/Makefile

BUILD_DIR=$(shell pwd) OUT_DIR=$(BUILD_DIR)/out UBOOT_OUT_DIR=$(OUT_DIR)/u-boot UBOOT_DIR=$(BUILD_DIR)/../u-boot uboot:mkdir -p $(UBOOT_OUT_DIR)make -C $(UBOOT_DIR) CROSS_COMPILE=$(CROSS_COMPILE) KBUILD_OUTPUT=$(UBOOT_OUT_DIR) $(BOARD_NAME)_defconfigmake -C $(UBOOT_DIR) CROSS_COMPILE=$(CROSS_COMPILE) KBUILD_OUTPUT=$(UBOOT_OUT_DIR) ## -C $(UBOOT_DIR) 指定了要在../uboot,也就是uboot的代碼根目錄下執行make ## CROSS_COMPILE=$(CROSS_COMPILE) 指定了交叉編譯器 ## KBUILD_OUTPUT=$(UBOOT_OUT_DIR) 指定了最終編譯的輸出目錄是build/out/u-boot.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

最終,相當于進入了uboot目錄執行了make動作。

2、生成文件

最終編譯完成之后,會在project-x/build/out/u-boot下生成如下文件:

arch common dts include net tools u-boot.cfg u-boot.lds u-boot.srec board disk examples lib scripts System.map u-boot u-boot.dtb u-boot.map u-boot.sym cmd drivers fs Makefile source test u-boot.bin u-boot-dtb.bin u-boot-nodtb.bin
  • 1
  • 2
  • 3

其中,arch、common、dts、include、board、drivers、fs等等目錄是對應代碼的編譯目錄,各個目錄下都會生成相應的built.o,是由同目錄下的目標文件連接而成。?
重點說一下以下幾個文件:

文件說明
u-boot初步鏈接后得到的uboot文件
u-boot-nodtb.bin在u-boot的基礎上,經過objcopy去除符號表信息之后的可執行程序
u-boot.dtbdtb文件
u-boot-dtb.bin將u-boot-nodtb.bin和u-boot.dtb打包在一起的文件
u-boot.bin在需要dtb的情況下,直接由u-boot-dtb.bin復制而來,也就是編譯u-boot的最終目標
u-boot.ldsuboot的連接腳本
System.map連接之后的符號表文件
u-boot.cfg由uboot配置生成的文件

二、uboot編譯流程

1、編譯整體流程

根據一、2生成的文件說明可知簡單流程如下:?
(1)各目錄下built-in.o的生成

源文件、代碼文件編譯、匯編目標文件同目錄目標文件連接built-in目標文件

(2)由所有built-in.o以u-boot.lds為連接腳本通過連接來生成u-boot

built-in目標文件以u-boot.lds為連接腳本進行統一連接u-boot

(3)由u-boot生成u-boot-nodtb.bin

u-bootobjcopy動作去掉符號信息表u-boot-nodtb.bin

(4)由生成uboot的dtb文件

dts文件dtc編譯、打包dtb文件u-boot.dtb

(5)由u-boot-nodtb.bin和u-boot.dtb生成u-boot-dtb.bin

u-boot-nodtb.bin和u-boot.dtb追加整合兩個文件u-boot-dtb.bin

(6)由u-boot-dtb.bin復制生成u-boot.bin

u-boot-dtb.bin復制u-boot.bin

2、具體編譯流程分析

我們直接從make uboot命令分析,也就是從uboot下的Makefile的依賴關系來分析整個編譯流程。?
注意,這個分析順序和上述的整體編譯流程的順序是反著的。

  • (1)入口分析?
    在project-x/u-boot/Makefile中
all: $(ALL-y) ALL-y += u-boot.srec u-boot.bin u-boot.sym System.map u-boot.cfg binary_size_check
  • 1
  • 2

u-boot.bin就是我們的目標,所以后需要主要研究u-boot.bin的依賴關系。


  • (2)u-boot.bin的依賴關系?
    在project-x/u-boot/Makefile中
ifeq ($(CONFIG_OF_SEPARATE),y) ## CONFIG_OF_SEPARATE用于定義是否有DTB并且是否是和uboot分開編譯的。 ## tiny210是有定義這個宏的,所以走的是上面這路u-boot-dtb.bin: u-boot-nodtb.bin dts/dt.dtb FORCE$(call if_changed,cat) ## 由u-boot-nodtb.bin和dts/dt.dtb連接在一起,先生成u-boot-dtb.bin ## $(call if_changed,cat)會調用到cmd_cat函數,具體實現我們不分析了u-boot.bin: u-boot-dtb.bin FORCE$(call if_changed,copy) ## 直接將u-boot-dtb.bin復制為u-boot.bin ## $(call if_changed,copy)會調用到cmd_copy函數,具體實現我們不分析了else u-boot.bin: u-boot-nodtb.bin FORCE$(call if_changed,copy) endif
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

對應于上述二、1(5)流程和上述二、1(6)流程。?
后續有兩個依賴關系要分析,分別是u-boot-nodtb.bin和dts/dt.dtb。?
u-boot-nodtb.bin依賴關系參考下述二、2(3)-2(6).?
dts/dt.dtb依賴關系參考下述二、2(7)?
其中u-boot-nodtb.bin的依賴關系和SPL的相當類似,可以先參考一下《[uboot] (第二章)uboot流程——uboot-spl編譯流程》。


  • (3)u-boot-nodtb.bin的依賴關系?
    在project-x/u-boot/Makefile中
u-boot-nodtb.bin: u-boot FORCE$(call if_changed,objcopy)$(call DO_STATIC_RELA,$<,$@,$(CONFIG_SYS_TEXT_BASE))$(BOARD_SIZE_CHECK) ## $(call if_changed,objcopy)表示當依賴文件發生變化時,將依賴文件經過objcopy處理之后得到目標文件。 ## 也就是通過objcopy把u-boot的符號信息以及一些無用信息去掉之后,得到了u-boot-nodtb.bin。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

如上述Makefile代碼u-boot-nodtb.bin依賴于u-boot,并且由u-boot經過objcopy操作之后得到。?
對應于上述二、1(3)流程.

  • (4)u-boot的依賴關系?
    在project-x/u-boot/Makefile中
u-boot: $(u-boot-init) $(u-boot-main) u-boot.lds FORCE$(call if_changed,u-boot__) ## $(call if_changed,u-boot__)來生成目標 ## $(call if_changed,u-boot__)對應cmd_u-boot__命令
  • 1
  • 2
  • 3
  • 4

如上,u-boot依賴于$(u-boot-init) 、$(u-boot-main)和u-boot.lds,并且最終會調用cmd_u-boot__來生成u-boot。?
cmd_u-boot__實現如下?
project-x/u-boot/Makefile

cmd_u-boot__ ?= $(LD) $(LDFLAGS) $(LDFLAGS_u-boot) -o $@ \ -T u-boot.lds $(u-boot-init) \ --start-group $(u-boot-main) --end-group \ $(PLATFORM_LIBS) -Map u-boot.map
  • 1
  • 2
  • 3
  • 4

將cmd_u-boot__通過echo命令打印出來之后得到如下(拆分出來看的):?
project-x/u-boot/Makefile

/project-x/build/arm-none-linux-gnueabi-4.8/bin/arm-none-linux-gnueabi-ld-pie --gc-sections -Bstatic -Ttext 0x23E00000 -o u-boot -T u-boot.lds arch/arm/cpu/armv7/start.o --start-group arch/arm/cpu/built-in.o arch/arm/cpu/armv7/built-in.o arch/arm/lib/built-in.o arch/arm/mach-s5pc1xx/built-in.o board/samsung/common/built-in.o board/samsung/tiny210/built-in.o cmd/built-in.o common/built-in.o disk/built-in.o drivers/built-in.o drivers/dma/built-in.o drivers/gpio/built-in.o drivers/i2c/built-in.o drivers/mmc/built-in.o drivers/mtd/built-in.o drivers/mtd/onenand/built-in.o drivers/mtd/spi/built-in.o drivers/net/built-in.o drivers/net/phy/built-in.o drivers/pci/built-in.o drivers/power/built-in.o drivers/power/battery/built-in.o drivers/power/fuel_gauge/built-in.o drivers/power/mfd/built-in.o drivers/power/pmic/built-in.o drivers/power/regulator/built-in.o drivers/serial/built-in.o drivers/spi/built-in.o drivers/usb/common/built-in.o drivers/usb/dwc3/built-in.o drivers/usb/emul/built-in.o drivers/usb/eth/built-in.o drivers/usb/gadget/built-in.o drivers/usb/gadget/udc/built-in.o drivers/usb/host/built-in.o drivers/usb/musb-new/built-in.o drivers/usb/musb/built-in.o drivers/usb/phy/built-in.o drivers/usb/ulpi/built-in.o fs/built-in.o lib/built-in.o net/built-in.o test/built-in.o test/dm/built-in.o --end-group arch/arm/lib/eabi_compat.o -L /project-x/build/arm-none-linux-gnueabi-4.8/bin/../lib/gcc/arm-none-linux-gnueabi/4.8.3 -lgcc -Map u-boot.map
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

可以看出上述是一條連接命令,以u-boot.lds為鏈接腳本,把$(u-boot-init) 、$(u-boot-main)的指定的目標文件連接到u-boot中。?
并且已經指定輸出文件為u-boot,連接腳本為u-boot.lds。?
連接很重要的東西就是連接標識,也就是?$(LD)?$(LDFLAGS)?$(LDFLAGS_u-boot)的定義。?
嘗試把$(LD) \$(LDFLAGS) \$(LDFLAGS_u-boot)) 打印出來,結果如下:

LD=~/project-x/build/arm-none-linux-gnueabi-4.8/bin/arm-none-linux-gnueabi-ld LDFLAGS= LDFLAGS_u-boot=-pie --gc-sections -Bstatic -Ttext 0x23E00000
  • 1
  • 2
  • 3

LDFLAGS_u-boot定義如下

LDFLAGS_u-boot += -pie LDFLAGS_u-boot += $(LDFLAGS_FINAL) ifneq ($(CONFIG_SYS_TEXT_BASE),) LDFLAGS_u-boot += -Ttext $(CONFIG_SYS_TEXT_BASE) endif## 當指定CONFIG_SYS_TEXT_BASE時,會配置連接地址。在tiny210項目中,定義如下: ## ./include/configs/tiny210.h:52:#define CONFIG_SYS_TEXT_BASE 0x23E00000## $(LDFLAGS_FINAL)在如下幾個地方定義了 ## ./config.mk:19:LDFLAGS_FINAL := ## ./config.mk:80:LDFLAGS_FINAL += -Bstatic ## ./arch/arm/config.mk:16:LDFLAGS_FINAL += --gc-sections ## 通過上述LDFLAGS_u-boot=-pie --gc-sections -Bstatic -Ttext 0x23E00000也就可以理解了 ## 對應于上述二、1(2)流程。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

對應于上述二、1(2)流程。?
關于u-boot依賴的說明在(5)、(6)中繼續介紹


  • (5)u-boot-init & u-boot-main依賴關系(代碼是如何被編譯的)?
    先看一下這兩個值打印出來的
u-boot-init=arch/arm/cpu/armv7/start.o u-boot-main= arch/arm/cpu/built-in.o arch/arm/cpu/armv7/built-in.o arch/arm/lib/built-in.o arch/arm/mach-s5pc1xx/built-in.o board/samsung/common/built-in.o board/samsung/tiny210/built-in.o cmd/built-in.o common/built-in.o disk/built-in.o drivers/built-in.o drivers/dma/built-in.o drivers/gpio/built-in.o drivers/i2c/built-in.o drivers/mmc/built-in.o drivers/mtd/built-in.o drivers/mtd/onenand/built-in.o drivers/mtd/spi/built-in.o drivers/net/built-in.o drivers/net/phy/built-in.o drivers/pci/built-in.o drivers/power/built-in.o drivers/power/battery/built-in.o drivers/power/fuel_gauge/built-in.o drivers/power/mfd/built-in.o drivers/power/pmic/built-in.o drivers/power/regulator/built-in.o drivers/serial/built-in.o drivers/spi/built-in.o drivers/usb/common/built-in.o drivers/usb/dwc3/built-in.o drivers/usb/emul/built-in.o drivers/usb/eth/built-in.o drivers/usb/gadget/built-in.o drivers/usb/gadget/udc/built-in.o drivers/usb/host/built-in.o drivers/usb/musb-new/built-in.o drivers/usb/musb/built-in.o drivers/usb/phy/built-in.o drivers/usb/ulpi/built-in.o fs/built-in.o lib/built-in.o net/built-in.o test/built-in.o test/dm/built-in.o
  • 1
  • 2

可以觀察到是一堆目標文件的路徑。這些目標文件最終都要被連接到u-boot中。?
u-boot-init & u-boot-main的定義如下代碼:?
project-x/u-boot/Makefile

u-boot-init := $(head-y) ## head-y定義在如下位置 ## ./arch/arm/Makefile:73:head-y := arch/arm/cpu/$(CPU)/start.olibs-y += lib/ libs-y += fs/ libs-y += net/ libs-y += disk/ libs-y += drivers/ libs-y += drivers/dma/ libs-y += drivers/gpio/ libs-y += drivers/i2c/ ... u-boot-dirs := $(patsubst %/,%,$(filter %/, $(libs-y))) tools examples ## 過濾出路徑之后,加上tools目錄和example目錄libs-y := $(patsubst %/, %/built-in.o, $(libs-y)) ## 先加上后綴built-in.ou-boot-main := $(libs-y)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

那么u-boot-init & u-boot-main是如何生成的呢??
需要看一下對應的依賴如下:

$(sort $(u-boot-init) $(u-boot-main)): $(u-boot-dirs) ; ## 也就是說$(u-boot-init) $(u-boot--main)依賴于$(u-boot-dirs) ## sort函數根據首字母進行排序并去除掉重復的。 ##u-boot-dirs := $(patsubst %/,%,$(filter %/, $(libs-y))) tools examples ## $(filter %/, $(libs-y)過濾出'/'結尾的字符串,注意,此時$(libs-y)的內容還沒有加上built-in.o文件后綴 ## patsubst去掉字符串中最后的'/'的字符。 ## 最后u-boot-dirs打印出來如下: ## u-boot-dirs=arch/arm/cpu arch/arm/cpu/armv7 arch/arm/lib arch/arm/mach-s5pc1xx board/samsung/common board/samsung/tiny210 cmd common disk drivers drivers/dma drivers/gpio drivers/i2c drivers/mmc drivers/mtd drivers/mtd/onenand drivers/mtd/spi drivers/net drivers/net/phy drivers/pci drivers/power drivers/power/battery drivers/power/fuel_gauge drivers/power/mfd drivers/power/pmic drivers/power/regulator drivers/serial drivers/spi drivers/usb/common drivers/usb/dwc3 drivers/usb/emul drivers/usb/eth drivers/usb/gadget drivers/usb/gadget/udc drivers/usb/host drivers/usb/musb-new drivers/usb/musb drivers/usb/phy drivers/usb/ulpi fs lib net test test/dm tools examples
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

u-boot-dirs依賴規則如下:

PHONY += $(u-boot-dirs) $(u-boot-dirs): prepare scripts$(Q)$(MAKE) $(build)=$@ ## 依賴于prepare scripts ## prepare會導致prepare0、prepare1、prepare2、prepare3目標被執行,最終編譯了tools目錄下的東西,生成了一些工具 ## 然后執行$(Q)$(MAKE) $(build)=$@ ## 也就是會對每一個目標文件依次執行make \$(build)=目標文件
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

對每一個目標文件依次執行make?$(build)=目標文件?
$(build)定義如下:?
project-x/u-boot/scripts/Kbuild.include

build := -f $(srctree)/scripts/Makefile.build obj
  • 1

以arch/arm/mach-s5pc1xx為例?
“$(MAKE)?$(build)=$@”展開后格式如下?
make -f project-x/u-boot/scripts/Makefile.build obj=arch/arm/mach-s5pc1xx。

Makefile.build定義built-in.o、.lib以及目標文件.o的生成規則。這個Makefile文件生成了子目錄的.lib、built-in.o以及目標文件.o。?
Makefile.build第一個編譯目標是__build,如下

PHONY := __build __build: ## 所以會直接編譯執行__build這個目標,其依賴如下 __build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y)) \$(if $(KBUILD_MODULES),$(obj-m) $(modorder-target)) \$(subdir-ym) $(always)@: ## 和built-in.o相關的是依賴builtin-target。下面來看這個依賴。 builtin-target := $(obj)/built-in.o ## 以obj=arch/arm/mach-s5pc1xx為例,那么builtin-target就是arch/arm/mach-s5pc1xx/built-in.o.## 依賴關系如下: $(builtin-target): $(obj-y) FORCE$(call if_changed,link_o_target) ## $(call if_changed,link_o_target)將所有依賴連接到$(builtin-target),也就是相應的built-in.o中了。 ## 具體實現可以查看cmd_link_o_target的實現,這里不詳細說明了。## 那么$(obj-y)是從哪里來的呢?是從相應目錄下的Makefile中include得到的。 # The filename Kbuild has precedence over Makefile kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src)) kbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile) include $(kbuild-file) ## 當obj=arch/arm/mach-s5pc1xx時,得到對應的kbuild-file=u-boot/arch/arm/mach-s5pc1xx/Makefile ## 而在u-boot/arch/arm/mach-s5pc1xx/Makefile中定義了obj-y如下: ## obj-y = cache.o ## obj-y += reset.o ## obj-y += clock.o ## 對應obj-y對應一些目標文件,由C文件編譯而來,這里就不說明了。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

后面來看目標文件的編譯流程?
./scripts/Makefile.build/scripts/Makefile.build

# Built-in and composite module parts $(obj)/%.o: $(src)/%.c $(recordmcount_source) FORCE$(call cmd,force_checksrc)$(call if_changed_rule,cc_o_c) ## 調用cmd_cc_o_c對.c文件進行編譯## cmd_cc_o_c格式如下: cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $< ## $(CC) $(c_flags)打印出來如下: ## CC=/home/disk3/xys/temp/project-x/build/arm-none-linux-gnueabi-4.8/bin/arm-none-linux-gnueabi-gcc ## c_flags=-Wp,-MD,arch/arm/mach-s5pc1xx/.clock.o.d -nostdinc -isystem /home/disk3/xys/temp/project-x/build/arm-none-linux-gnueabi-4.8/bin/../lib/gcc/arm-none-linux-gnueabi/4.8.3/include -Iinclude -I/home/disk3/xys/temp/project-x/u-boot/include -I/home/disk3/xys/temp/project-x/u-boot/arch/arm/include -include /home/disk3/xys/temp/project-x/u-boot/include/linux/kconfig.h -I/home/disk3/xys/temp/project-x/u-boot/arch/arm/mach-s5pc1xx -Iarch/arm/mach-s5pc1xx -D__KERNEL__ -D__UBOOT__ -Wall -Wstrict-prototypes -Wno-format-security -fno-builtin -ffreestanding -Os -fno-stack-protector -fno-delete-null-pointer-checks -g -fstack-usage -Wno-format-nonliteral -D__ARM__ -marm -mno-thumb-interwork -mabi=aapcs-linux -mword-relocations -fno-pic -mno-unaligned-access -ffunction-sections -fdata-sections -fno-common -ffixed-r9 -msoft-float -pipe -march=armv7-a -I/home/disk3/xys/temp/project-x/u-boot/arch/arm/mach-s5pc1xx/include -DKBUILD_STR(s)=#s -DKBUILD_BASENAME=KBUILD_STR(clock) -DKBUILD_MODNAME=KBUILD_STR(clock)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

對應于上述二、1(1)流程。


  • (6)u-boot.lds依賴關系?
    這里主要是為了找到一個匹配的連接文件。
u-boot.lds: $(LDSCRIPT) prepare FORCE$(call if_changed_dep,cpp_lds) ifndef LDSCRIPTifeq ($(wildcard $(LDSCRIPT)),)LDSCRIPT := $(srctree)/board/$(BOARDDIR)/u-boot.ldsendififeq ($(wildcard $(LDSCRIPT)),)LDSCRIPT := $(srctree)/$(CPUDIR)/u-boot.ldsendififeq ($(wildcard $(LDSCRIPT)),)LDSCRIPT := $(srctree)/arch/$(ARCH)/cpu/u-boot.ldsendif endif ## 也就是說依次從board/板級目錄、cpudir目錄、arch/架構/cpu/目錄下去搜索u-boot.lds文件。 ## 例如,tiny210(s5vp210 armv7)最終會在./arch/arm/cpu/下搜索到u-boot.lds
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

綜上,最終指定了project-X/u-boot/arch/arm/cpu/u-boot.lds作為連接腳本。


  • (7)dts/dt.dtb依賴關系?
    該依賴關系的主要目的是生成dtb文件。?
    首先了解dts文件被放在了arch/arm/dts里面,并通過dts下的Makefile進行選擇。?
    Makefile如下(剪切出一部分)?
    project-X/u-boot/arch/arm/dts/Makefile
dtb-$(CONFIG_S5PC110) += s5pc1xx-goni.dtb dtb-$(CONFIG_EXYNOS5) += exynos5250-arndale.dtb \exynos5250-snow.dtb \exynos5250-spring.dtb \exynos5250-smdk5250.dtb \exynos5420-smdk5420.dtb \exynos5420-peach-pit.dtb \exynos5800-peach-pi.dtb \exynos5422-odroidxu3.dtb dtb-$(CONFIG_TARGET_TINY210) += \s5pv210-tiny210.dtb ## 填充選擇dtb-ytargets += $(dtb-y)# Add any required device tree compiler flags here DTC_FLAGS += ## 用于添加DTC編譯選項PHONY += dtbs dtbs: $(addprefix $(obj)/, $(dtb-y))@: ## 偽目標,其依賴為$(dtb-y)加上了源路徑,如下 ## arch/arm/dts/s5pc1xx-goni.dtb ## arch/arm/dts/s5pv210-tiny210.dtb ## 后續會使用到這個偽目標
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

接下來看一下dts/dt.dtb的依賴關系

dtbs dts/dt.dtb: checkdtc u-boot$(Q)$(MAKE) $(build)=dts dtbs ## checkdtc依賴用于檢查dtc的版本 ## u-boot一旦發生變化那么就重新編譯一遍dtb ## 重點關注命令 $(Q)$(MAKE) $(build)=dts dtbs ## 展開來就是make -f ~/project-x/u-boot/scripts/Makefile.build obj=dts dtbs ## 我們相當于值在/scripts/Makefile.build下執行了目標dtbs
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在scripts/Makefile.build中dtbs的目標定義在哪里呢?
project-X/u-boot/scripts/Makefile.build

kbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile) include $(kbuild-file) ## 把對應的Makefile路徑包含了進去,也就是arch/arm/dts/Makefile ## 如前面所說,arch/arm/dts/Makefile中定義了dtbs的目標 ## dtbs: $(addprefix $(obj)/, $(dtb-y)) ## @: ## 這里我們就找到對應的依賴關系了,依賴就是$(obj)/, $(dtb-y),舉個例子就是arch/arm/dts/s5pv210-tiny210.dtbinclude scripts/Makefile.lib ## 包含了scripts/Makefile.lib,在編譯dts的時候會用到
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

接下來就是$(obj)/,?$(dtb-y)的依賴關系了?
project-X/u-boot/scripts/Makefile.lib

$(obj)/%.dtb: $(src)/%.dts FORCE$(call if_changed_dep,dtc) ## 使用了通配符的方式 ## 這樣就通過dtc對dts編譯生成了dtb文件
  • 1
  • 2
  • 3
  • 4

對應于上述二、1(4)流程。


三、一些重點定義

  • 1、連接標志?
    在二、2(4)中說明。?
    連接命令在cmd_u-boot__中,如下
cmd_u-boot__ ?= $(LD) $(LDFLAGS) $(LDFLAGS_u-boot) -o $@ \ -T u-boot.lds $(u-boot-init) \ --start-group $(u-boot-main) --end-group \ $(PLATFORM_LIBS) -Map u-boot.map
  • 1
  • 2
  • 3
  • 4

連接標識如下:

LD=~/project-x/build/arm-none-linux-gnueabi-4.8/bin/arm-none-linux-gnueabi-ld LDFLAGS= LDFLAGS_u-boot=-pie --gc-sections -Bstatic -Ttext 0x23E00000
  • 1
  • 2
  • 3

LDFLAGS_u-boot定義如下

LDFLAGS_u-boot += -pie LDFLAGS_u-boot += $(LDFLAGS_FINAL) ifneq ($(CONFIG_SYS_TEXT_BASE),) LDFLAGS_u-boot += -Ttext $(CONFIG_SYS_TEXT_BASE) endif
  • 1
  • 2
  • 3
  • 4
  • 5

‘-o’指定了輸出文件是u-boot,’-T’是指定了連接腳本是當前目錄下的u-boot.lds, -Ttext指定了連接地址是CONFIG_SYS_TEXT_BASE。

  • 2、連接地址?
    在二、2(4)中說明。?
    CONFIG_SYS_TEXT_BASE指定了u-boot.bin的連接地址。這個地址也就是uboot的起始運行地址。?
    對于tiny210,其定義如下(可以進行修改)?
    /include/configs/tiny210.h
#define CONFIG_SYS_TEXT_BASE 0x23E00000
  • 1
  • 3、連接腳本?
    在二、2(6)中說明。?
    u-boot/arch/arm/cpu/u-boot.lds
u-boot.lds: $(LDSCRIPT) prepare FORCE$(call if_changed_dep,cpp_lds) ifndef LDSCRIPTifeq ($(wildcard $(LDSCRIPT)),)LDSCRIPT := $(srctree)/board/$(BOARDDIR)/u-boot.ldsendififeq ($(wildcard $(LDSCRIPT)),)LDSCRIPT := $(srctree)/$(CPUDIR)/u-boot.ldsendififeq ($(wildcard $(LDSCRIPT)),)LDSCRIPT := $(srctree)/arch/$(ARCH)/cpu/u-boot.ldsendif endif
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

綜上,最終指定了project-X/u-boot/arch/arm/cpu/u-boot.lds作為連接腳本。

四、uboot鏈接腳本說明

1、連接腳本整體分析

相對比較簡單,直接看連接腳本的內容project-x/u-boot/arch/arm/cpu/u-boot.lds?
前面有一篇分析連接腳本的文章了《[kernel 啟動流程] 前篇——vmlinux.lds分析》,可以參考一下。?
參考如下,只提取了一部分:

ENTRY(_start) //定義了地址為_start的地址,所以我們分析代碼就是從這個函數開始分析的!!!. = 0x00000000;//以下定義文本段. = ALIGN(4);.text :{__image_copy_start = .; //定義__image_copy_start這個標號地址為當前地址*(.vectors) //所有目標文件的vectors段,也就是中斷向量表連接到這里來CPUDIR/start.o (.text*) //start.o文件的.text段鏈接到這里來*(.text*) //所有目標文件的.text段鏈接到這里來}//以下定義只讀數據段. = ALIGN(4);.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }//以下定義數據段. = ALIGN(4);.data : {*(.data*) //所有目標文件的.data段鏈接到這里來}. = ALIGN(4);//以下定義u_boot_list段,具體功能未知. = ALIGN(4);.u_boot_list : {KEEP(*(SORT(.u_boot_list*)));}. = ALIGN(4);.image_copy_end :{*(.__image_copy_end)} //定義__image_copy_end符號的地址為當前地址 //從__image_copy_start 到__image_copy_end的區間,包含了代碼段和數據段。.rel_dyn_start :{*(.__rel_dyn_start)} //定義__rel_dyn_start 符號的地址為當前地址,后續在代碼中會使用到.rel.dyn : {*(.rel*)}.rel_dyn_end :{*(.__rel_dyn_end)} //定義__rel_dyn_end 符號的地址為當前地址,后續在代碼中會使用到 //從__rel_dyn_start 到__rel_dyn_end 的區間,應該是在代碼重定向的過程中會使用到,后續遇到再說明。.end :{*(.__end)}_image_binary_end = .; //定義_image_binary_end 符號的地址為當前地址// 以下定義堆棧段.bss_start __rel_dyn_start (OVERLAY) : {KEEP(*(.__bss_start));__bss_base = .;}.bss __bss_base (OVERLAY) : {*(.bss*). = ALIGN(4);__bss_limit = .;}.bss_end __bss_limit (OVERLAY) : {KEEP(*(.__bss_end));} }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87

2、以下以.vectors段做說明,

.vectors是uboot鏈接腳本第一個鏈接的段,也就是_start被鏈接進來的部分,也負責鏈接異常中斷向量表?
先看一下代碼project-x/u-boot/arch/arm/lib/vectors.S

.globl _start.section ".vectors", "ax" @@ 定義在.vectors段中_start:b resetldr pc, _undefined_instructionldr pc, _software_interruptldr pc, _prefetch_abortldr pc, _data_abortldr pc, _not_usedldr pc, _irqldr pc, _fiq.globl _undefined_instruction.globl _software_interrupt.globl _prefetch_abort.globl _data_abort.globl _not_used.globl _irq.globl _fiq @@ 定義了異常中斷向量表
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

通過“arm-none-linux-gnueabi-objdump -D u-boot > uboot_objdump.txt”進行反編譯之后,得到了如下指令

23e00000 <__image_copy_start>: 23e00000: ea0000be b 23e00300 <reset> 23e00004: e59ff014 ldr pc, [pc, #20] ; 23e00020 <_undefined_instruction> 23e00008: e59ff014 ldr pc, [pc, #20] ; 23e00024 <_software_interrupt> 23e0000c: e59ff014 ldr pc, [pc, #20] ; 23e00028 <_prefetch_abort> 23e00010: e59ff014 ldr pc, [pc, #20] ; 23e0002c <_data_abort> 23e00014: e59ff014 ldr pc, [pc, #20] ; 23e00030 <_not_used> 23e00018: e59ff014 ldr pc, [pc, #20] ; 23e00034 <_irq> 23e0001c: e59ff014 ldr pc, [pc, #20] ; 23e00038 <_fiq> // 可以看出以下是異常終端向量表 23e00020 <_undefined_instruction>: 23e00020: 23e00060 mvncs r0, #96 ; 0x60 // 其中,23e00020存放的是未定義指令處理函數的地址,也就是23e00060 // 以下以此類推23e00024 <_software_interrupt>: 23e00024: 23e000c0 mvncs r0, #192 ; 0xc0 23e00028 <_prefetch_abort>: 23e00028: 23e00120 mvncs r0, #8 23e0002c <_data_abort>: 23e0002c: 23e00180 mvncs r0, #3223e00030 <_not_used>: 23e00030: 23e001e0 mvncs r0, #56 ; 0x38 23e00034 <_irq>: 23e00034: 23e00240 mvncs r0, #4 23e00038 <_fiq>: 23e00038: 23e002a0 mvncs r0, #10 23e0003c: deadbeef cdple 14, 10, cr11, cr13, cr15, {7}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

3、符號表中需要注意的符號

前面我們說過了在tiny210中把連接地址設置為0x23e00000。?
project-x/build/out/u-boot/spl/u-boot.map

Linker script and memory mapAddress of section .text set to 0x23e00000 .text 0x23e00000 0x29b28*(.__image_copy_start).__image_copy_start0x23e00000 0x0 arch/arm/lib/built-in.o0x23e00000 __image_copy_start*(.vectors).vectors 0x23e00000 0x300 arch/arm/lib/built-in.o0x23e00000 _start0x23e00020 _undefined_instruction0x23e00024 _software_interrupt0x23e00028 _prefetch_abort0x23e0002c _data_abort0x23e00030 _not_used0x23e00034 _irq0x23e00038 _fiq0x23e00040 IRQ_STACK_START_IN*(.__image_copy_end).__image_copy_end0x23e36b78 0x0 arch/arm/lib/built-in.o*(.__rel_dyn_start).__rel_dyn_start0x23e36b78 0x0 arch/arm/lib/built-in.o*(.__rel_dyn_end).__rel_dyn_end0x23e3cbb8 0x0 arch/arm/lib/built-in.o0x23e3cbb8 _image_binary_end = .*(.__bss_start).__bss_start 0x23e36b78 0x0 arch/arm/lib/built-in.o0x23e36b78 __bss_start.__bss_end 0x23e6b514 0x0 arch/arm/lib/built-in.o0x23e6b514 __bss_end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

重點關注?
* __image_copy_start & __image_copy_end?
界定了代碼空間的位置,用于重定向代碼的時候使用,在uboot relocate的過程中,需要把這部分拷貝到uboot的新的地址空間中,后續在新地址空間中運行。?
具體可以參考《[uboot] (番外篇)uboot relocation介紹》。?
* _start?
在u-boot-spl.lds中ENTRY(_start),也就規定了代碼的入口函數是_start。所以后續分析代碼的時候就是從這里開始分析。?
* __rel_dyn_start & __rel_dyn_end?
由鏈接器生成,存放了絕對地址符號的label的地址,用于修改uboot relocate過程中修改絕對地址符號的label的值。?
具體可以參考《[uboot] (番外篇)uboot relocation介紹》。?
* _image_binary_end

綜上,u-boot的編譯就完成了。

總結

以上是生活随笔為你收集整理的4-uboot编译流程的全部內容,希望文章能夠幫你解決所遇到的問題。

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

国产在线色站 | 美女av免费看 | 亚洲精品乱码久久久久久蜜桃欧美 | 97av在线视频 | 91看片麻豆 | 国产视频999 | 久久一区二区三区国产精品 | 香蕉视频在线看 | 成年人视频在线 | 成人羞羞视频在线观看免费 | 国产91综合一区在线观看 | 欧美性视频网站 | 亚洲五月综合 | 婷婷色网| 国内精品国产三级国产aⅴ久 | 国产在线中文 | 国产高清在线看 | 天天爱天天射天天干天天 | 超碰97成人| av在线收看 | 日韩欧美在线综合网 | av资源网在线播放 | 丁香久久| 九九九热精品免费视频观看 | 日韩剧| 2023av在线| 伊人宗合| 午夜视频在线网站 | 91精品视频免费在线观看 | 欧美性猛片, | av电影中文字幕 | 午夜国产一区 | 久久在线免费视频 | 亚洲精品tv久久久久久久久久 | 精品视频区 | 91麻豆精品 | 久久日本视频 | 久久人人爽人人爽人人片 | 日韩在线观看第一页 | 成人黄在线观看 | 黄色日批网站 | 久久精品国产亚洲aⅴ | 欧美乱熟臀69xxxxxx | 一本一本久久aa综合精品 | 三级a毛片 | 黄色成人免费电影 | 中文字幕在线免费观看视频 | 欧美性生活免费 | 999色视频| 日本久久免费电影 | 亚洲成人第一区 | 五月婷婷开心 | 麻豆影音先锋 | 成人av一区二区三区 | 国产女人40精品一区毛片视频 | 狠狠色狠狠色综合系列 | 国语精品视频 | 91亚洲精品在线观看 | 99热在线国产 | 日韩一级理论片 | 97电影在线看视频 | 日韩电影在线观看一区 | 精品久久久久久久久久久院品网 | 激情五月亚洲 | 国产.精品.日韩.另类.中文.在线.播放 | 久久一久久 | 久久观看免费视频 | 美女黄频免费 | 久久免费电影网 | 天天综合中文 | 日韩美女久久 | 欧美亚洲国产日韩 | 亚洲精品一区中文字幕乱码 | 亚洲日本国产精品 | 伊人一级 | 久久综合九色综合欧美就去吻 | 一区二区三区免费播放 | 久久99精品久久只有精品 | 亚洲久在线 | 国产色视频123区 | .国产精品成人自产拍在线观看6 | 免费看污污视频的网站 | 九九九九热精品免费视频点播观看 | 国产午夜精品免费一区二区三区视频 | 久久久久久亚洲精品 | www.黄色小说.com | 天天射天天干天天爽 | 涩五月婷婷| 欧美精品亚洲精品日韩精品 | 国产成人三级在线 | 欧美成年黄网站色视频 | 婷婷五天天在线视频 | 欧美一级黄大片 | 日韩美女一级片 | 99国产精品久久久久久久久久 | 黄色软件在线观看视频 | 日本中文字幕在线视频 | 国产精品美女在线 | 成人黄色大片 | av激情五月| 婷婷精品在线视频 | 亚洲爱av| 香蕉视频在线免费 | 视频一区在线播放 | 美女网站在线看 | 国产一区私人高清影院 | 日韩电影精品 | 91香蕉视频| 久久99亚洲精品久久久久 | 成av在线 | 久99热| 色天天综合久久久久综合片 | 亚洲免费精品一区二区 | 97av在线| 国产精品高清一区二区三区 | 国产区精品 | 日韩天天综合 | 亚洲黄色三级 | 国产一区电影在线观看 | 日韩av黄 | 欧美成人中文字幕 | 五月婷婷中文网 | 国产小视频精品 | 国产一区视频免费在线观看 | 黄色成人91 | 精品久久久亚洲 | 色吊丝在线永久观看最新版本 | 久久九九影院 | 久久看毛片 | 夜色成人av| 97超碰在线久草超碰在线观看 | 日韩成人免费电影 | 日韩高清一区 | 成人国产精品一区二区 | 婷婷在线五月 | 国产无套精品久久久久久 | 精品国产一区二区三区久久 | 亚洲精品欧美专区 | 欧美成人亚洲成人 | 日韩精品久久久久久中文字幕8 | 国产精品 亚洲精品 | 91中文字幕一区 | 国产九九九精品视频 | 久久久午夜精品福利内容 | 黄色av一区二区 | 亚洲黄色在线免费观看 | 中国精品一区二区 | 黄色美女免费网站 | 欧美日韩xx| 国产精品黄色 | 99福利影院 | 992tv成人免费看片 | 免费美女久久99 | 国产小视频免费在线网址 | 欧美日韩不卡一区二区 | 国产精品一区二区麻豆 | 久热电影 | 亚洲国产电影在线观看 | 成人一级在线观看 | 亚洲电影久久 | 久久国产午夜精品理论片最新版本 | 精品国产乱码久久久久久1区二区 | 久久优 | 精品视频免费 | 在线99 | 成人免费在线播放 | 久久av影视 | 久久伊人精品天天 | 日韩理论在线播放 | 成人资源站 | 97成人在线观看视频 | av黄色影院 | 曰韩精品 | 成人免费视频在线观看 | 在线免费av播放 | 夜色资源站wwwcom | 伊人干综合 | 日韩高清不卡一区二区三区 | 久久小视频 | 久久天天躁 | 亚洲精品视频www | 亚洲精品乱码久久久久久9色 | 亚洲国产成人在线观看 | 国产精品一区二区三区电影 | 97成人免费 | 在线91网| 久久99国产精品自在自在app | 免费看毛片网站 | 一性一交视频 | 国产91亚洲 | 欧美亚洲国产精品久久高清浪潮 | 欧美在线视频一区二区三区 | 五月激情天 | 天天操天天干天天插 | 国内成人精品视频 | 99视频在线观看视频 | 三级在线视频观看 | 中文字幕xxxx | 最近中文字幕高清字幕免费mv | 国产视频日本 | 免费看一级特黄a大片 | 国产精品一区二区果冻传媒 | 中文字幕资源在线 | 亚洲精品国产视频 | 99久久精品国 | 国产精品久久久久永久免费看 | 国产区网址 | 东方av免费在线观看 | 国产精品视频99 | 色www免费视频 | 激情综合色综合久久综合 | 午夜婷婷综合 | 久久综合一本 | 一区二区三区播放 | 国产精品岛国久久久久久久久红粉 | 91免费视频网站在线观看 | 久久在线视频在线 | 国产精品日韩在线播放 | 久久综合之合合综合久久 | 日韩色综合网 | 91看国产| 欧美日韩视频在线一区 | 国产高清视频在线播放 | 在线日韩中文 | 91黄色在线看 | 国精产品999国精产品视频 | 日韩资源在线播放 | 国产视频首页 | 久久色在线观看 | 又污又黄的网站 | 免费福利视频网站 | 高清在线观看av | 在线看毛片网站 | 国产手机在线观看视频 | 精品国产免费av | 久久精品一二三区 | 91精品久久久久久综合乱菊 | 91女人18片女毛片60分钟 | 国产在线一卡 | 久久的色| 色激情五月 | 人人爱人人做人人爽 | 久久精品一区二区三区国产主播 | 一区二区三区四区在线 | 欧美日韩一级久久久久久免费看 | 欧美成人播放 | 成年人在线看片 | 日韩av免费一区 | 亚洲欧美怡红院 | 久久综合9988久久爱 | 97超碰人人模人人人爽人人爱 | 99久久网站 | 九九精品视频在线观看 | 久久久国产毛片 | 日b视频在线观看网址 | 亚洲国产精品成人av | 五月婷婷视频 | 国产手机在线观看视频 | 免费网站观看www在线观看 | 亚洲高清不卡av | 少妇bbb好爽 | 成年人免费看 | 精品在线观看一区二区三区 | 高清国产午夜精品久久久久久 | 精品国内自产拍在线观看视频 | 日韩激情在线 | 久久综合九色综合97婷婷女人 | 国产精品一区电影 | 最新av在线播放 | 欧美在线视频一区二区三区 | 日韩精品视| 久久专区| 日韩在线观看视频一区二区三区 | 91精品综合在线观看 | 成人a毛片 | 91九色视频导航 | 99精品视频一区二区 | 超碰97成人 | 国产精品成人av电影 | 中文字幕在线电影 | 911亚洲精品第一 | 又黄又刺激又爽的视频 | 日本女人b| www.色午夜,com | 日韩精品中文字幕在线不卡尤物 | 91精品啪在线观看国产线免费 | 久久免费激情视频 | 99精品久久久久久久久久综合 | zzijzzij亚洲成熟少妇 | 国产午夜精品一区二区三区欧美 | 国产99久久精品一区二区永久免费 | 日本性久久 | 五月婷婷在线视频观看 | 久av电影| 久久刺激视频 | 91九色蝌蚪国产 | 国内精品久久久久影院优 | 韩国视频一区二区三区 | 黄色在线看网站 | 香蕉国产91 | 国产精品久久久av | 国产不卡高清 | 日韩欧美视频免费看 | 日韩中文在线播放 | 亚洲午夜久久久久久久久久久 | 免费视频国产 | 日韩在观看线 | 免费看色的网站 | 国产在线91精品 | 国产亚洲精品久久久久动 | 天天操天天舔天天干 | 天天伊人狠狠 | 五月天电影免费在线观看一区 | 国产黄视频在线观看 | 91大片网站 | 国产91在线观看 | 亚洲综合成人专区片 | 成 人 黄 色 视频免费播放 | 天天综合网天天 | 国产精品成人久久 | 国产精品久久久久久久婷婷 | 日本一区二区三区免费观看 | 日韩欧美专区 | 久久久国产精品人人片99精片欧美一 | 在线观看一区二区精品 | 在线天堂日本 | 日韩精品极品视频 | 国产精品99久久久久久小说 | 精品国产乱子伦一区二区 | 亚洲人成综合 | 国产资源在线观看 | 国产成人精品三级 | 久久免费视频在线 | 久久精品视频免费播放 | 人人看人人做人人澡 | 国产美女精品 | 一级一片免费观看 | 国产免费二区 | 在线免费高清一区二区三区 | 亚洲h色精品 | 一区二区三区四区免费视频 | 欧美专区国产专区 | 国产在线1区 | 国产亚洲在线视频 | 亚洲无线视频 | 免费av免费观看 | 国产成人精品国内自产拍免费看 | 久久黄网站 | 狠狠干网| 国产午夜精品免费一区二区三区视频 | 高清av中文字幕 | 日韩精品首页 | 偷拍福利视频一区二区三区 | 国产区在线 | 婷婷草| 欧美在线一级片 | 一级a毛片高清视频 | 欧美激情精品一区 | 成人午夜电影久久影院 | 国产色视频一区二区三区qq号 | 91视频这里只有精品 | 亚洲午夜久久久久久久久 | 亚洲视频,欧洲视频 | 日日操日日干 | 久久成人福利 | 国产视频精品免费 | 午夜av免费 | 亚洲欧洲国产精品 | 国产亚洲一区二区在线观看 | 久久精品视频中文字幕 | 久久综合影院 | 日日干天夜夜 | 人人玩人人添人人澡97 | 91在线免费视频观看 | avove黑丝| 国产一区免费看 | 综合色狠狠 | 日韩中文字幕亚洲一区二区va在线 | 久久精品亚洲一区二区三区观看模式 | 亚洲黄色成人网 | 色www.| 成人18视频 | 国产精品精品久久久久久 | 欧美激情一区不卡 | 午夜精品久久久久久 | 深夜免费福利 | 久久精品站 | a级国产乱理论片在线观看 伊人宗合网 | 国产精品videoxxxx | 夜夜夜夜爽 | 免费亚洲片 | 射久久久 | 亚洲 欧美 国产 va在线影院 | 国产成人精品亚洲 | 欧美日韩国产综合一区二区 | 亚洲伊人成综合网 | 婷婷丁香狠狠爱 | 丁香六月久久综合狠狠色 | 天堂va欧美va亚洲va老司机 | 国产成人在线精品 | 亚洲韩国一区二区三区 | 2019久久精品| 久久久久久久久久久免费视频 | 在线国产高清 | 天天操狠狠操夜夜操 | 91片黄在线观看动漫 | 久久一级片 | 国产精品mv| 久久99国产精品久久99 | 日日夜夜精品免费 | 国产成人一区二区三区免费看 | 91黄色成人 | 久久久久久久久久电影 | 国产精品久久久久av福利动漫 | 911香蕉视频 | 免费看片网页 | 91视频成人免费 | 天堂在线一区二区三区 | 99久久婷婷国产综合亚洲 | 婷婷在线免费观看 | 国产精品久久毛片 | 国产美女精品在线 | 午夜婷婷在线播放 | 亚洲国产天堂av | 欧美日韩一区二区免费在线观看 | 黄色一区三区 | 国产特级毛片aaaaaaa高清 | 四虎国产视频 | 日韩一区二区三区免费视频 | 在线日本看片免费人成视久网 | 日韩色高清 | 国产黄色片网站 | 岛国av在线免费 | 久久综合之合合综合久久 | 黄色网址国产 | 综合网天天色 | 天天干天天上 | 日韩最新中文字幕 | 狠狠躁日日躁 | 欧美乱淫视频 | 国产精品午夜av | 亚洲在线视频播放 | 婷婷综合亚洲 | 久久久国产高清 | 一区二区精品 | 国内精品久久久久久久久久 | 91 中文字幕 | 久久久久久久电影 | 99久久久国产精品美女 | 国产婷婷一区二区 | 欧美高清成人 | 久章操 | 奇米影视777影音先锋 | 久久精品国产99国产 | 亚洲天天看 | 国产伦理久久 | 色婷婷丁香 | 亚洲美女精品 | 久久黄网站 | 欧美精品久久久久久久亚洲调教 | 九九热re | 国产精品久久久久久爽爽爽 | 狠狠色丁香久久婷婷综合五月 | 这里有精品在线视频 | 成年人电影毛片 | 成人午夜影视 | 欧美精品久久99 | 成人一级在线 | 天天天干天天射天天天操 | 日日夜夜狠狠操 | 欧美亚洲免费在线一区 | 国产亚洲欧美精品久久久久久 | 成年人在线免费看 | 欧美一区三区四区 | 69国产精品视频 | 久草在线视频首页 | 精品二区视频 | av中文字幕剧情 | 91精品国产一区二区在线观看 | 成人禁用看黄a在线 | 亚洲视频六区 | 国产高清视频免费在线观看 | 国产韩国精品一区二区三区 | 成人香蕉视频 | 国产精品久久久久久久久搜平片 | 国产专区精品 | 99精品成人 | 亚洲国产视频直播 | 中文字幕一区av | 久久欧洲视频 | 国产成人黄色网址 | av一级久久| 欧美一二区视频 | 亚洲午夜在线视频 | 成人av电影在线观看 | 中文不卡视频在线 | 超碰97人人爱 | 一区二区不卡视频在线观看 | 九九久久成人 | 国产精品国产三级国产不产一地 | 伊人看片 | 欧美日韩视频在线 | 亚洲成a人片77777kkkk1在线观看 | 国产视| 一区二区在线不卡 | 天天干,天天射,天天操,天天摸 | 中文在线中文a | 粉嫩aⅴ一区二区三区 | 亚洲资源网 | 欧美日韩在线免费视频 | 午夜视频一区二区三区 | 国产精品va在线 | 不卡的av电影在线观看 | 国产精品初高中精品久久 | 91亚·色| 中文欧美字幕免费 | 国产精品资源网 | 激情图片久久 | 色婷婷a| 欧美日韩国产精品一区二区 | 91福利视频一区 | 国产精品久久久久一区二区三区 | 欧美少妇xx | 九九热精品视频在线播放 | 国产高清精品在线观看 | 国产91对白在线 | 狠狠干 狠狠操 | 日韩一区二区三区免费视频 | a级成人毛片 | 成人av在线亚洲 | 国产高清亚洲 | 91色影院| 午夜精品久久久久久久99热影院 | 国产一级a毛片视频爆浆 | 51久久夜色精品国产麻豆 | av天天在线观看 | 青青河边草免费观看完整版高清 | 亚洲电影成人 | 午夜美女av| 天天综合成人 | 日本在线精品视频 | 激情综合狠狠 | 免费av小说 | 成年人在线观看免费视频 | 久久久久久久毛片 | 亚洲免费av电影 | 96av麻豆蜜桃一区二区 | 九月婷婷人人澡人人添人人爽 | 久久tv视频| www.亚洲精品视频 | 最新婷婷色 | 香蕉影视| 在线小视频国产 | 国产精品国产三级国产不产一地 | 婷婷久久精品 | 国产免费专区 | 国产精品专区在线观看 | 高清视频一区二区三区 | 欧美日韩69 | 午夜久操| 91精品免费视频 | 久久国产热视频 | 91爱爱视频| 91欧美在线| 精品国自产在线观看 | 国产婷婷一区二区 | 久久精品毛片 | 99热这里只有精品久久 | www.黄色小说.com | 日韩免费一级a毛片在线播放一级 | 国产精品久久一区二区三区不卡 | 午夜av一区二区三区 | 国产精品视频内 | 欧美日韩国产精品一区二区 | 日韩欧美一区二区三区在线 | 婷婷久月 | 久久精品久久精品 | 国产大尺度视频 | av天天色 | 97超碰中文字幕 | 亚洲免费av电影 | 日韩视频一区二区 | 精品国产_亚洲人成在线 | 日韩欧美精品一区 | 日日夜夜艹 | 国产午夜在线 | 免费a级大片 | 美女视频黄免费 | 天天艹天天 | 手机av网站| 一本之道乱码区 | 亚洲综合色网站 | 免费亚洲婷婷 | 日本大尺码专区mv | 不卡的av在线播放 | 韩国av免费观看 | 久草精品视频在线观看 | 蜜桃传媒一区二区 | 激情丁香婷婷 | 91av视频观看 | 性色av免费在线观看 | 白丝av在线 | 手机成人在线 | 免费精品人在线二线三线 | 综合久久精品 | 日韩在线高清 | 亚洲永久精品在线观看 | 夜色资源网| 国产精品 9999 | 九九视频网 | 久久99久久99精品免观看粉嫩 | 在线不卡中文字幕播放 | 91传媒视频在线观看 | 久久蜜臀av | 丁香婷婷社区 | 日韩亚洲国产中文字幕 | 成人国产精品免费观看 | 又黄又色又爽 | 五月天,com| 国产拍在线 | 中文字幕视频三区 | 亚洲国产成人在线播放 | 九九视频在线播放 | 亚洲国产精品激情在线观看 | 久久精品人 | 久草青青在线观看 | 粉嫩av一区二区三区入口 | 黄a在线看 | 麻豆国产视频 | 免费看黄电影 | 国产一区二区视频在线 | 97av.com| 久久久综合九色合综国产精品 | 久久亚洲影院 | 99在线国产| 97精品在线视频 | 一 级 黄 色 片免费看的 | 波多野结衣视频一区二区 | va视频在线 | 欧美一区三区四区 | 日日夜夜网 | 日韩av男人的天堂 | 日日爽日日操 | 国产亚洲精品电影 | 国产在线观看你懂得 | 国产专区第一页 | 成人va天堂 | 国产亚洲小视频 | 日本不卡123区 | 欧美成人亚洲 | 成人在线一区二区三区 | 久久久精品国产一区二区 | 欧美一区日韩精品 | av中文字幕免费在线观看 | 亚洲一区日韩 | 天天草天天插 | 九九色在线 | 欧美中文字幕久久 | 天天草av| 亚洲精品视频播放 | 天天干天天操天天入 | 中文字幕人成乱码在线观看 | 国产资源在线视频 | 免费69视频 | 在线91av| 国产在线视频一区 | 国产精品久久久久久一二三四五 | 激情视频国产 | 亚洲精品动漫成人3d无尽在线 | 丁香婷婷久久 | 亚洲春色综合另类校园电影 | 亚洲专区在线视频 | 亚洲有 在线 | 欧美日韩在线第一页 | 久久综合九色九九 | 久久婷婷国产 | 国产免费一区二区三区网站免费 | 亚洲毛片一区二区三区 | 久久国产亚洲精品 | 激情文学丁香 | 亚洲精品免费在线观看视频 | 婷婷六月丁香激情 | 国产精品99页 | 日韩电影在线观看中文字幕 | 五月婷婷丁香六月 | 中文字幕成人网 | 色999在线 | 精品国产精品国产偷麻豆 | 91麻豆视频| 国产一区免费 | 一级片免费在线 | 日本精品va在线观看 | 国产精品麻豆三级一区视频 | 日韩在线观看视频网站 | 97成人在线 | 日本久久片 | 日韩久久久久久久久 | 97日日碰人人模人人澡分享吧 | 啪啪av在线| 国产999精品久久久久久绿帽 | 久久激情日本aⅴ | 精品久久一区 | 日本aa在线 | 亚洲国产视频在线 | 香蕉网在线观看 | 久久精品精品电影网 | 国产欧美日韩一区 | 日韩黄色影院 | 成人午夜免费福利 | 亚洲女欲精品久久久久久久18 | 日本视频高清 | 成人精品福利 | www黄色大片| 丁香激情五月婷婷 | 一区二区三区免费播放 | 夜夜爽88888免费视频4848 | 日本精品一区二区三区在线播放视频 | 欧美 日韩 国产 成人 在线 | 日韩欧美在线观看 | 亚洲高清激情 | 国产精品美女久久久久久久网站 | 成人免费看电影 | 69国产精品成人在线播放 | 亚洲人成综合 | 成年人免费观看在线视频 | 中文字幕中文字幕在线中文字幕三区 | 久久国产区| 最近乱久中文字幕 | 夜夜爽88888免费视频4848 | 黄网av在线 | www.午夜色.com | 国产精品尤物视频 | 久久久综合九色合综国产精品 | 91麻豆精品91久久久久同性 | 狠狠做六月爱婷婷综合aⅴ 日本高清免费中文字幕 | 婷婷综合影院 | 精品一区二区久久久久久久网站 | 日日夜夜精品免费视频 | 婷婷色中文 | 日韩亚洲在线观看 | 中文字幕久久久精品 | av黄色国产 | 看全黄大色黄大片 | 九九免费在线视频 | 日韩在线高清视频 | 97视频人人澡人人爽 | 欧美日韩视频在线观看一区二区 | 久久午夜色播影院免费高清 | 99久久久成人国产精品 | 国产专区欧美专区 | 在线 视频 亚洲 | 一区二区视频在线看 | 免费在线观看不卡av | 久草精品在线播放 | 欧美日韩免费视频 | 国产男男gay做爰 | 欧美日韩视频在线观看免费 | 五月婷婷丁香网 | 日韩两性视频 | 在线免费黄色av | 精品在线观看一区二区 | 成人资源网| 成人毛片一区 | 免费午夜网站 | 久久久不卡影院 | 亚洲视频一区二区三区在线观看 | 日本精品视频在线观看 | 亚洲综合色视频在线观看 | 久久视频二区 | 亚洲精品美女久久久久网站 | 国产精品一区二区久久久 | 国产中文字幕91 | 在线看片91 | 啪啪资源 | 精品国产乱码久久久久久1区2匹 | 久久夜色精品国产欧美乱极品 | 中文字幕日韩在线播放 | 国产精品免费小视频 | 999ZYZ玖玖资源站永久 | 国产精品久久久久久久久蜜臀 | 免费色视频在线 | 日韩免费在线观看视频 | 欧美日韩免费一区二区 | 国产日韩欧美中文 | 网站免费黄 | 亚洲精品久久久久久久蜜桃 | 一本—道久久a久久精品蜜桃 | 1024手机基地在线观看 | 亚洲毛片在线观看. | 国内久久久 | 久久人人爽人人 | 啪啪午夜免费 | 国产美女搞久久 | 欧美日韩国产一区二区三区在线观看 | 99资源网| 在线观看完整版免费 | 久久精品99久久久久久2456 | 午夜三级理论 | 香蕉在线影院 | 久久久久中文字幕 | 日韩伦理片hd | 成人app在线免费观看 | 日本中文在线观看 | 开心婷婷色 | 亚洲小视频在线 | 在线观看日韩免费视频 | 欧美黑人xxxx猛性大交 | 天天插天天干天天操 | 亚洲精品日韩在线观看 | 久久国产精品久久久 | 国产精品专区h在线观看 | 欧美激情精品一区 | 一二三四精品 | .精品久久久麻豆国产精品 亚洲va欧美 | 三级av中文字幕 | 婷婷色婷婷 | 日韩一区二区免费在线观看 | 午夜黄色| 亚洲精品资源在线 | 男女精品久久 | 国产精品一区二区av影院萌芽 | 日韩视频一区二区三区 | 国产破处视频在线播放 | 成年人国产视频 | 国产高清视频免费观看 | 天堂资源在线观看视频 | 精品国产伦一区二区三区观看说明 | av看片在线 | av专区在线 | 亚洲更新最快 | 日韩免费视频观看 | 激情av网 | 亚洲精品a区 | 免费成人在线电影 | 丝袜一区在线 | 狠狠躁18三区二区一区ai明星 | 亚洲在线视频免费 | 成 人 黄 色 免费播放 | 国产区精品在线观看 | 亚洲欧洲精品一区二区 | 91手机在线看片 | 久久黄页 | 日韩在线视频精品 | 91九色网站| 成人免费视频视频在线观看 免费 | 精品1区二区 | 国产在线免费av | 国产一区二区久久精品 | 国产二区视频在线观看 | 久久精品福利 | 国产精品自产拍在线观看中文 | 91看片在线免费观看 | 五月色婷 | 亚洲另类人人澡 | 丝袜美女视频网站 | 中文字幕欲求不满 | 日日操日日操 | 国产一级免费在线 | 久久久免费精品国产一区二区 | 中文字幕黄色 | 97色婷婷成人综合在线观看 | 精品国产乱码久久久久 | 欧美成人亚洲成人 | 91久久精品一区二区三区 | 亚洲精品中文字幕视频 | 中文字幕在线看视频国产中文版 | 综合激情| 色偷偷网站视频 | 欧美一级电影在线观看 | 五月婷婷av| 一级一片免费看 | 免费在线观看日韩 | 91在线porny国产在线看 | 久久在线一区 | 精品国产伦一区二区三区观看说明 | 亚洲欧美日韩一区二区三区在线观看 | 91尤物国产尤物福利在线播放 | 91c网站色版视频 | 伊人伊成久久人综合网小说 | 亚洲精品资源 | 亚洲在线免费视频 | 中文字幕超清在线免费 | 精品久久久久久久久久久久久久久久久久 | 爱爱av网 | 亚洲天堂网在线播放 | 五月婷影院 | 国内偷拍精品视频 | 天天操天天干天天综合网 | 国产成人精品av在线 | 500部大龄熟乱视频使用方法 | 国产五月色婷婷六月丁香视频 | 久久精品91久久久久久再现 | 中文字幕黄色网址 | 欧美一级片免费在线观看 | 99久久99久久免费精品蜜臀 | 久草视频手机在线 | 国产成人精品一区二区三区 | 91高清一区 | 成人影片在线免费观看 | 国产在线精品一区二区三区 | 成人在线黄色电影 | 亚洲欧美视频在线播放 | 麻豆传媒视频在线播放 | 日日操操操 | 久久99亚洲精品久久久久 | 国产精品一区二区你懂的 | 欧美日韩视频在线观看免费 | 成人av免费看 | 久久久久福利视频 | 高清久久久久久 | 91日韩免费| 91热视频在线观看 | 在线视频a | 在线电影a | 91九色丨porny丨丰满6 | 欧美大码xxxx | www.狠狠插.com| 狠狠干夜夜爽 | 精品国产免费av | 欧美一区,二区 | 81国产精品久久久久久久久久 | 伊人官网 | 午夜私人影院久久久久 | 精品在线播放视频 | 丁香婷婷色综合亚洲电影 | 欧美不卡在线 | 精品无人国产偷自产在线 | 国产精品久久久一区二区三区网站 | 婷婷视频导航 | 久久不色 | 亚洲一区二区三区四区在线视频 | www.黄色片网站 | 国产精品久久久久久高潮 | 97成人在线免费视频 | 一区二区三区电影在线播 | 中文字幕一区二区三区在线播放 | 9999精品视频 | 五月婷视频| 国产精品一区二区在线免费观看 | 国产成人免费网站 | 久久久麻豆 | 黄色的网站在线 | 免费在线色视频 | 久久午夜色播影院免费高清 | 亚洲精品欧美成人 | 美女久久 | 97视频在线观看网址 | 久久观看最新视频 | 免费av福利 | 久久狠狠亚洲综合 | 亚洲桃花综合 | 国产玖玖在线 | 久久综合亚洲鲁鲁五月久久 | 久久99精品热在线观看 | 亚洲成人av一区二区 | 日日爽视频 | 91精品视屏 | 四虎永久免费网站 | 国产麻豆成人传媒免费观看 | 在线观看国产福利片 | av电影免费看 | 日本黄色大片儿 | 日韩高清激情 | 日本黄色大片免费 | 婷婷激情综合五月天 | 欧美色精品天天在线观看视频 | 亚洲 欧洲av| 在线免费观看国产黄色 | 国产一区视频在线观看免费 | 91porny九色在线播放 | 国产剧情在线一区 | 五月开心六月婷婷 | 色香天天 | 国产99久久 | 夜夜高潮夜夜爽国产伦精品 | 国产一级大片在线观看 | 美女福利视频 | 国产一区二区精品在线 | 精品久久一二三区 | 亚洲精品456在线播放第一页 | 玖玖在线免费视频 | 久久久99精品免费观看app | 久久视频精品 | 福利视频区 | 亚洲日本成人 | 中文在线免费看视频 | 综合精品久久久 | 欧美日韩精品区 | 精品国产美女 | 黄色软件视频网站 | 91亚洲激情 | 97视频入口免费观看 | 日韩三级免费观看 | 丝袜精品视频 | 亚洲狠狠丁香婷婷综合久久久 | 丁香婷婷基地 | 日韩高清精品一区二区 | 精精国产xxxx视频在线播放 |