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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux 内核顶层Makefile 详解

發(fā)布時間:2023/12/10 linux 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux 内核顶层Makefile 详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

  • 前602行分析
  • make xxx_defconfig 過程
  • Makefile.build 腳本分析
  • make 過程
  • built-in.o 文件編譯生成過程
  • make zImage 過程

前幾章我們重點講解了如何移植uboot 到I.MX6U-ALPHA 開發(fā)板上,從本章開始我們就開始學(xué)習(xí)如何移植Linux 內(nèi)核。同uboot 一樣,在具體移植之前,我們先來學(xué)習(xí)一下Linux 內(nèi)核的頂層Makefile 文件,因為頂層Makefile 控制著Linux 內(nèi)核的編譯流程。

前602行分析

Linux 的頂層Makefile 和uboot 的頂層Makefile 非常相似,因為uboot 參考了Linux,前602行幾乎一樣,所以前面部分我們大致看一下就行了。

1、版本號
頂層Makefile 一開始就是Linux 內(nèi)核的版本號,如下所示:

1 VERSION = 4 2 PATCHLEVEL = 1 3 SUBLEVEL = 15 4 EXTRAVERSION =

可以看出,Linux 內(nèi)核版本號為4.1.15。

2、MAKEFLAGS 變量
MAKEFLAGS 變量設(shè)置如下所示:

16 MAKEFLAGS += -rR --include-dir=$(CURDIR)

3、命令輸出
Linux 編譯的時候也可以通過“V=1”來輸出完整的命令,這個和uboot 一樣,相關(guān)代碼如下所示:

69 ifeq ("$(origin V)", "command line") 70 KBUILD_VERBOSE = $(V) 71 endif 72 ifndef KBUILD_VERBOSE 73 KBUILD_VERBOSE = 0 74 endif 75 76 ifeq ($(KBUILD_VERBOSE),1) 77 quiet = 78 Q = 79 else 80 quiet=quiet_ 81 Q = @ 82 endif

4、靜默輸出
Linux 編譯的時候使用“make -s”就可實現(xiàn)靜默編譯,編譯的時候就不會打印任何的信息,同uboot 一樣,相關(guān)代碼如下:

87 ifneq ($(filter 4.%,$(MAKE_VERSION)),) # make-4 88 ifneq ($(filter %s ,$(firstword x$(MAKEFLAGS))),) 89 quiet=silent_ 90 endif 91 else # make-3.8x 92 ifneq ($(filter s% -s%,$(MAKEFLAGS)),) 93 quiet=silent_ 94 endif 95 endif 96 97 export quiet Q KBUILD_VERBOSE

5、設(shè)置編譯結(jié)果輸出目錄
Linux 編譯的時候使用“O=xxx”即可將編譯產(chǎn)生的過程文件輸出到指定的目錄中,相關(guān)代碼如下

116 ifeq ($(KBUILD_SRC),) 117 118 # OK, Make called in directory where kernel src resides 119 # Do we want to locate output files in a separate directory? 120 ifeq ("$(origin O)", "command line") 121 KBUILD_OUTPUT := $(O) 122 endif

6、代碼檢查
Linux 也支持代碼檢查,使用命令“make C=1”使能代碼檢查,檢查那些需要重新編譯的文件。“make C=2”用于檢查所有的源碼文件,頂層Makefile 中的代碼如下:

172 ifeq ("$(origin C)", "command line") 173 KBUILD_CHECKSRC = $(C) 174 endif 175 ifndef KBUILD_CHECKSRC 176 KBUILD_CHECKSRC = 0 177 endif

7、模塊編譯
Linux 允許單獨編譯某個模塊,使用命令“make M=dir”即可,舊語法“make SUBDIRS=dir”也是支持的。頂層Makefile 中的代碼如下:

179 # Use make M=dir to specify directory of external module to build 180 # Old syntax make ... SUBDIRS=$PWD is still supported 181 # Setting the environment variable KBUILD_EXTMOD take precedence 182 ifdef SUBDIRS 183 KBUILD_EXTMOD ?= $(SUBDIRS) 184 endif 185 186 ifeq ("$(origin M)", "command line") 187 KBUILD_EXTMOD := $(M) 188 endif 189 190 # If building an external module we do not care about the all: rule 191 # but instead _all depend on modules 192 PHONY += all 193 ifeq ($(KBUILD_EXTMOD),) 194 _all: all 195 else 196 _all: modules 197 endif 198 199 ifeq ($(KBUILD_SRC),) 200 # building in the source tree 201 srctree := . 202 else 203 ifeq ($(KBUILD_SRC)/,$(dir $(CURDIR))) 204 # building in a subdirectory of the source tree 205 srctree := .. 206 else 207 srctree := $(KBUILD_SRC) 208 endif 209 endif 210 objtree := . 211 src := $(srctree) 212 obj := $(objtree) 213 214 VPATH := $(srctree)$(if $(KBUILD_EXTMOD),:$(KBUILD_EXTMOD)) 215 216 export srctree objtree VPATH

外部模塊編譯過程和uboot 也一樣,最終導(dǎo)出srctree、objtree 和VPATH 這三個變量的值,其中srctree=.,也就是當(dāng)前目錄,objtree 同樣為“.”。

8、設(shè)置目標(biāo)架構(gòu)和交叉編譯器

同uboot 一樣,Linux 編譯的時候需要設(shè)置目標(biāo)板架構(gòu)ARCH 和交叉編譯器CROSS_COMPILE,在頂層Makefile 中代碼如下:

252 ARCH ?= $(SUBARCH) 253 CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%)

為了方便,一般直接修改頂層Makefile 中的ARCH 和CROSS_COMPILE,直接將其設(shè)置為對應(yīng)的架構(gòu)和編譯器,比如本教程將ARCH 設(shè)置為為arm,CROSS_COMPILE 設(shè)置為arm-linux-gnueabihf-,如下所示:

252 ARCH ?= arm 253 CROSS_COMPILE ?= arm-linux-gnueabihf-

設(shè)置好以后我們就可以使用如下命令編譯Linux 了:

make xxx_defconfig //使用默認(rèn)配置文件配置Linux make menuconfig //啟動圖形化配置界面 make -j16 //編譯Linux

9、調(diào)用scripts/Kbuild.include 文件

同uboot 一樣,Linux 頂層Makefile 也會調(diào)用文件scripts/Kbuild.include,頂層Makefile 相應(yīng)代碼如下:

348 # We need some generic definitions (do not try to remake the file). 349 scripts/Kbuild.include: ; 350 include scripts/Kbuild.include

10、交叉編譯工具變量設(shè)置
頂層Makefile 中其他和交叉編譯器有關(guān)的變量設(shè)置如下:

353 AS = $(CROSS_COMPILE)as 354 LD = $(CROSS_COMPILE)ld 355 CC = $(CROSS_COMPILE)gcc 356 CPP = $(CC) -E 357 AR = $(CROSS_COMPILE)ar 358 NM = $(CROSS_COMPILE)nm 359 STRIP = $(CROSS_COMPILE)strip 360 OBJCOPY = $(CROSS_COMPILE)objcopy 361 OBJDUMP = $(CROSS_COMPILE)objdump

LA、LD、CC 等這些都是交叉編譯器所使用的工具。

11、頭文件路徑變量

頂層Makefile 定義了兩個變量保存頭文件路徑:USERINCLUDE 和LINUXINCLUDE,相關(guān)代碼如下:

381 USERINCLUDE := \ 382 -I$(srctree)/arch/$(hdr-arch)/include/uapi \ 383 -Iarch/$(hdr-arch)/include/generated/uapi \ 384 -I$(srctree)/include/uapi \ 385 -Iinclude/generated/uapi \ 386 -include $(srctree)/include/linux/kconfig.h 387 388 # Use LINUXINCLUDE when you must reference the include/ directory. 389 # Needed to be compatible with the O= option 390 LINUXINCLUDE := \ 391 -I$(srctree)/arch/$(hdr-arch)/include \ 392 -Iarch/$(hdr-arch)/include/generated/uapi \ 393 -Iarch/$(hdr-arch)/include/generated \ 394 $(if $(KBUILD_SRC), -I$(srctree)/include) \ 395 -Iinclude \ 396 $(USERINCLUDE)

第381~386 行是USERINCLUDE 是UAPI 相關(guān)的頭文件路徑,第390~396 行是LINUXINCLUDE 是Linux 內(nèi)核源碼的頭文件路徑。重點來看一下LINUXINCLUDE,其中 srctree=.,hdr-arch=arm,KBUILD_SRC 為空,因此,將USERINCLUDE 和LINUXINCLUDE 展開以后為:

USERINCLUDE := \ -I./arch/arm/include/uapi \ -Iarch/arm/include/generated/uapi \ -I./include/uapi \ -Iinclude/generated/uapi \ -include ./include/linux/kconfig.h LINUXINCLUDE := \ -I./arch/arm/include \ -Iarch/arm/include/generated/uapi \ -Iarch/arm/include/generated \ -Iinclude \ -I./arch/arm/include/uapi \ -Iarch/arm/include/generated/uapi \ -I./include/uapi \ -Iinclude/generated/uapi \ -include ./include/linux/kconfig.h

12、導(dǎo)出變量

頂層Makefile 會導(dǎo)出很多變量給子Makefile 使用,導(dǎo)出的這些變量如下:

417 export VERSION PATCHLEVEL SUBLEVEL KERNELRELEASE KERNELVERSION 418 export ARCH SRCARCH CONFIG_SHELL HOSTCC HOSTCFLAGS CROSS_COMPILE AS LD CC 419 export CPP AR NM STRIP OBJCOPY OBJDUMP 420 export MAKE AWK GENKSYMS INSTALLKERNEL PERL PYTHON UTS_MACHINE 421 export HOSTCXX HOSTCXXFLAGS LDFLAGS_MODULE CHECK CHECKFLAGS 422 423 export KBUILD_CPPFLAGS NOSTDINC_FLAGS LINUXINCLUDE OBJCOPYFLAGS LDFLAGS 424 export KBUILD_CFLAGS CFLAGS_KERNEL CFLAGS_MODULE CFLAGS_GCOV CFLAGS_KASAN 425 export KBUILD_AFLAGS AFLAGS_KERNEL AFLAGS_MODULE 426 export KBUILD_AFLAGS_MODULE KBUILD_CFLAGS_MODULE KBUILD_LDFLAGS_MODULE 427 export KBUILD_AFLAGS_KERNEL KBUILD_CFLAGS_KERNEL 428 export KBUILD_ARFLAGS

make xxx_defconfig 過程

第一次編譯Linux 之前都要使用“make xxx_defconfig”先配置Linux 內(nèi)核,在頂層Makefile中有“%config”這個目標(biāo),如下所示:

490 config-targets := 0 491 mixed-targets := 0 492 dot-config := 1 493 494 ifneq ($(filter $(no-dot-config-targets), $(MAKECMDGOALS)),) 495 ifeq ($(filter-out $(no-dot-config-targets), $(MAKECMDGOALS)),) 496 dot-config := 0 497 endif 498 endif 499 500 ifeq ($(KBUILD_EXTMOD),) 501 ifneq ($(filter config %config,$(MAKECMDGOALS)),) 502 config-targets := 1 503 ifneq ($(words $(MAKECMDGOALS)),1) 504 mixed-targets := 1 505 endif 506 endif 507 endif 508 509 ifeq ($(mixed-targets),1) 510 # ================================================================= 511 # We're called with mixed targets (*config and build targets). 512 # Handle them one by one. 513 514 PHONY += $(MAKECMDGOALS) __build_one_by_one 515 516 $(filter-out __build_one_by_one, $(MAKECMDGOALS)): __build_one_by_one 517 @: 518 519 __build_one_by_one: 520 $(Q)set -e; \ 521 for i in $(MAKECMDGOALS); do \ 522 $(MAKE) -f $(srctree)/Makefile $$i; \ 523 done 524 525 else 526 ifeq ($(config-targets),1) 527 # ================================================================ 528 # *config targets only - make sure prerequisites are updated, and 529 # descend in scripts/kconfig to make the *config target 530 531 # Read arch specific Makefile to set KBUILD_DEFCONFIG as needed. 532 # KBUILD_DEFCONFIG may point out an alternative default 533 # configuration used for 'make defconfig' 534 include arch/$(SRCARCH)/Makefile 535 export KBUILD_DEFCONFIG KBUILD_KCONFIG 536 537 config: scripts_basic outputmakefile FORCE 538 $(Q)$(MAKE) $(build)=scripts/kconfig $@ 539 540 %config: scripts_basic outputmakefile FORCE 541 $(Q)$(MAKE) $(build)=scripts/kconfig $@ 542 543 else 563 endif # KBUILD_EXTMOD ......

第490~507 行和uboot 一樣,都是設(shè)置定義變量config-targets、mixed-targets 和dot-config
的值,最終這三個變量的值為:

config-targets= 1 mixed-targets= 0 dot-config= 1

因為config-targets=1,因此第534 行~541 行成立。第534 行引用arch/arm/Makefile 這個文件,這個文件很重要,因為zImage、uImage 等這些文件就是由arch/arm/Makefile 來生成的。

第535 行導(dǎo)出變量KBUILD_DEFCONFIG KBUILD_KCONFIG。

第537 行,沒有目標(biāo)與之匹配,因此不執(zhí)行。

第540 行,“make xxx_defconfig”與目標(biāo)“%config”匹配,因此執(zhí)行。“%config”依賴scripts_basic、outputmakefile 和FORCE,“%config”真正有意義的依賴就只有scripts_basic,scripts_basic 的規(guī)則如下:

448 scripts_basic: 449 $(Q)$(MAKE) $(build)=scripts/basic 450 $(Q)rm -f .tmp_quiet_recordmcount

build 定義在文件scripts/Kbuild.include 中,值為build := -f $(srctree)/scripts/Makefile.build
obj,因此將示例代碼35.5.1.2 展開就是:

scripts_basic: @make -f ./scripts/Makefile.build obj=scripts/basic //也可以沒有@,視配置而定 @rm -f . tmp_quiet_recordmcount //也可以沒有@

接著回到示例代碼35.5.1.1 的目標(biāo)“%config”處,內(nèi)容如下:

%config: scripts_basic outputmakefile FORCE$(Q)$(MAKE) $(build)=scripts/kconfig $@

將命令展開就是:

@make -f ./scripts/Makefile.build obj=scripts/kconfig xxx_defconfig

Makefile.build 腳本分析

從上一小節(jié)可知,“make xxx_defconfig“配置Linux 的時候如下兩行命令會執(zhí)行腳本
scripts/Makefile.build:

@make -f ./scripts/Makefile.build obj=scripts/basic @make -f ./scripts/Makefile.build obj=scripts/kconfig xxx_defconfig

我們依次來分析一下:

1、scripts_basic 目標(biāo)對應(yīng)的命令

scripts_basic 目標(biāo)對應(yīng)的命令為:@make -f ./scripts/Makefile.build obj=scripts/basic。打開文件scripts/Makefile.build,有如下代碼:

41 # The filename Kbuild has precedence over Makefile 42 kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src)) 43 kbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile) 44 include $(kbuild-file)

將kbuild-dir 展開后為:

kbuild-dir=./scripts/basic

將kbuild-file 展開后為:

kbuild-file= ./scripts/basic/Makefile

最后將59 行展開,即:

include ./scripts/basic/Makefile

繼續(xù)分析scripts/Makefile.build,如下代碼:

94 __build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y)) \ 95 $(if $(KBUILD_MODULES),$(obj-m) $(modorder-target)) \ 96 $(subdir-ym) $(always) 97 @:

__build 是默認(rèn)目標(biāo),因為命令“@make -f ./scripts/Makefile.build obj=scripts/basic”沒有指
定目標(biāo),所以會使用到默認(rèn)目標(biāo)__build。在頂層Makefile 中,KBUILD_BUILTIN 為1,
KBUILD_MODULES 為空,因此展開后目標(biāo)__build 為:

__build:$(builtin-target) $(lib-target) $(extra-y)) $(subdir-ym) $(always) @:

可以看出目標(biāo)__build 有5 個依賴:builtin-target、lib-target、extra-y、subdir-ym 和always。
這5 個依賴的具體內(nèi)容如下:

builtin-target = lib-target = extra-y = subdir-ym = always = scripts/basic/fixdep scripts/basic/bin2c

只有always 有效,因此__build 最終為:

__build: scripts/basic/fixdep scripts/basic/bin2c @:

__build 依賴于scripts/basic/fixdep 和scripts/basic/bin2c,所以要先將scripts/basic/fixdep 和scripts/basic/bin2c.c 這兩個文件編譯成fixdep 和bin2c。

綜上所述,scripts_basic 目標(biāo)的作用就是編譯出scripts/basic/fixdep 和scripts/basic/bin2c 這兩個軟件。

2、%config 目標(biāo)對應(yīng)的命令
%config 目標(biāo)對應(yīng)的命令為:@make -f ./scripts/Makefile.build obj=scripts/kconfig xxx_defconfig,此命令會使用到的各個變量值如下:

src= scripts/kconfig kbuild-dir = ./scripts/kconfig kbuild-file = ./scripts/kconfig/Makefile include ./scripts/kconfig/Makefile

可以看出,Makefile.build 會讀取scripts/kconfig/Makefile 中的內(nèi)容,此文件有如下所示內(nèi)容:

113 %_defconfig: $(obj)/conf 114 $(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)

目標(biāo)%_defconfig 與xxx_defconfig 匹配,所以會執(zhí)行這條規(guī)則,將其展開就是:

%_defconfig: scripts/kconfig/conf @ scripts/kconfig/conf --defconfig=arch/arm/configs/%_defconfig Kconfig

%_defconfig 依賴scripts/kconfig/conf,所以會編譯scripts/kconfig/conf.c 生成conf 這個軟件。此軟件就會將%_defconfig 中的配置輸出到.config 文件中,最終生成Linux kernel 根目錄下的.config 文件。

make 過程

使用命令“make xxx_defconfig”配置好Linux 內(nèi)核以后就可以使用“make”或者“make all”命令進(jìn)行編譯。頂層Makefile 有如下代碼:

125 PHONY := _all 126 _all: ...... 192 PHONY += all 193 ifeq ($(KBUILD_EXTMOD),) 194 _all: all 195 else 196 _all: modules 197 endif ...... 608 all: vmlinux

第126 行,_all 是默認(rèn)目標(biāo),如果使用命令“make”編譯Linux 的話此目標(biāo)就會被匹配。
第193 行,如果KBUILD_EXTMOD 為空的話194 行的代碼成立。
第194 行,默認(rèn)目標(biāo)_all 依賴all。
第608 行,目標(biāo)all 依賴vmlinux,所以接下來的重點就是vmlinux!
頂層Makefile 中有如下代碼:

904 # Externally visible symbols (used by link-vmlinux.sh) 905 export KBUILD_VMLINUX_INIT := $(head-y) $(init-y) 906 export KBUILD_VMLINUX_MAIN := $(core-y) $(libs-y) $(drivers-y) $(net-y) 907 export KBUILD_LDS := arch/$(SRCARCH)/kernel/vmlinux.lds 908 export LDFLAGS_vmlinux 909 # used by scripts/pacmage/Makefile 910 export KBUILD_ALLDIRS := $(sort $(filter-out arch/%,$(vmlinux-alldirs)) arch Documentation include samples scripts tools virt) 911 912 vmlinux-deps := $(KBUILD_LDS) $(KBUILD_VMLINUX_INIT) $(KBUILD_VMLINUX_MAIN) 913 914 # Final link of vmlinux 915 cmd_link-vmlinux = $(CONFIG_SHELL) $< $(LD) $(LDFLAGS) $(LDFLAGS_vmlinux) 916 quiet_cmd_link-vmlinux = LINK $@ 917 918 # Include targets which we want to 919 # execute if the rest of the kernel build went well. 920 vmlinux: scripts/link-vmlinux.sh $(vmlinux-deps) FORCE 921 ifdef CONFIG_HEADERS_CHECK 922 $(Q)$(MAKE) -f $(srctree)/Makefile headers_check 923 endif 924 ifdef CONFIG_SAMPLES 925 $(Q)$(MAKE) $(build)=samples 926 endif 927 ifdef CONFIG_BUILD_DOCSRC 928 $(Q)$(MAKE) $(build)=Documentation 929 endif 930 ifdef CONFIG_GDB_SCRIPTS 931 $(Q)ln -fsn `cd $(srctree) && /bin/pwd`/scripts/gdb/vmlinux-gdb.py 932 endif 933 +$(call if_changed,link-vmlinux)

從第920 行可以看出目標(biāo)vmlinux 依賴scripts/link-vmlinux.sh $(vmlinux-deps) FORCE。第912 行定義了vmlinux-deps,值為:
vmlinux-deps= $(KBUILD_LDS) $(KBUILD_VMLINUX_INIT) $(KBUILD_VMLINUX_MAIN)

第905 行,KBUILD_VMLINUX_INIT= $(head-y) $(init-y)。

第906 行,KBUILD_VMLINUX_MAIN = $(core-y) $(libs-y) $(drivers-y) $(net-y)。

第907 行,KBUILD_LDS= arch/ $ (SRCARCH)/kernel/vmlinux.lds,其中SRCARCH=arm,因此KBUILD_LDS= arch/arm/kernel/vmlinux.lds。

綜上所述,vmlinux 的依賴為:scripts/link-vmlinux.sh、$ (head-y) 、$ (init-y)、$ (core-y) 、$ (libs-y) 、$ (drivers-y) 、$ (net-y)、arch/arm/kernel/vmlinux.lds 和FORCE。

第933 行的命令用于鏈接生成vmlinux。

重點來看一下$ (head-y) 、$ (init-y)、$ (core-y) 、$ (libs-y) 、$ (drivers-y) 和$ (net-y)這六個變量的值。

1、head-y
head-y 定義在文件arch/arm/Makefile 中,內(nèi)容如下:

135 head-y := arch/arm/kernel/head$(MMUEXT).o

當(dāng)不使能MMU 的話MMUEXT=-nommu,如果使能MMU 的話為空,因此head-y 最終的值為:

head-y = arch/arm/kernel/head.o

2、init-y、drivers-y 和net-y
在頂層Makefile 中有如下代碼:

558 init-y := init/ 559 drivers-y := drivers/ sound/ firmware/ 560 net-y := net/ ...... 896 init-y := $(patsubst %/, %/built-in.o, $(init-y)) 898 drivers-y := $(patsubst %/, %/built-in.o, $(drivers-y)) 899 net-y := $(patsubst %/, %/built-in.o, $(net-y))

從示例代碼35.5.3.4 可知,init-y、libs-y、drivers-y 和net-y 最終的值為:

init-y = init/built-in.o drivers-y = drivers/built-in.o sound/built-in.o firmware/built-in.o net-y = net/built-in.o

3、libs-y

libs-y 基本和init-y 一樣,在頂層Makefile 中存在如下代碼: 561 libs-y := lib/ ...... 900 libs-y1 := $(patsubst %/, %/lib.a, $(libs-y)) 901 libs-y2 := $(patsubst %/, %/built-in.o, $(libs-y)) 902 libs-y := $(libs-y1) $(libs-y2)

根據(jù)示例代碼35.5.3.5 可知,libs-y 應(yīng)該等于“l(fā)ib.a built-in.o”,這個只正確了一部分!因為
在arch/arm/Makefile 中會向libs-y 中追加一些值,代碼如下:

286 libs-y := arch/arm/lib/ $(libs-y)

arch/arm/Makefile 將libs-y 的值改為了:arch/arm/lib $(libs-y),展開以后為:

libs-y = arch/arm/lib lib/

因此根據(jù)示例代碼35.5.3.5 的第900~902 行可知,libs-y 最終應(yīng)該為:

libs-y = arch/arm/lib/lib.a lib/lib.a arch/arm/lib/built-in.o lib/built-in.o

4、core-y
core-y 和init-y 也一樣,在頂層Makefile 中有如下代碼:

532 core-y := usr/ ...... 887 core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/

但是在arch/arm/Makefile 中會對core-y 進(jìn)行追加,代碼如下:

269 core-$(CONFIG_FPE_NWFPE) += arch/arm/nwfpe/ 270 core-$(CONFIG_FPE_FASTFPE) += $(FASTFPE_OBJ) 271 core-$(CONFIG_VFP) += arch/arm/vfp/ 272 core-$(CONFIG_XEN) += arch/arm/xen/ 273 core-$(CONFIG_KVM_ARM_HOST) += arch/arm/kvm/ 274 core-$(CONFIG_VDSO) += arch/arm/vdso/ 275 276 # If we have a machine-specific directory, then include it in the build. 277 core-y += arch/arm/kernel/ arch/arm/mm/ arch/arm/common/ 278 core-y += arch/arm/probes/ 279 core-y += arch/arm/net/ 280 core-y += arch/arm/crypto/ 281 core-y += arch/arm/firmware/ 282 core-y += $(machdirs) $(platdirs)

第269~274 行根據(jù)不同的配置向core-y 追加不同的值,比如使能VFP 的話就會在.config中有CONFIG_VFP=y 這一行,那么core-y 就會追加“arch/arm/vfp/”。
第277~282 行就是對core-y 直接追加的值。
在頂層Makefile 中有如下一行:

897 core-y := $(patsubst %/, %/built-in.o, $(core-y))

經(jīng)過上述代碼的轉(zhuǎn)換,最終core-y 的值為:

core-y = usr/built-in.o arch/arm/vfp/built-in.o \arch/arm/vdso/built-in.o arch/arm/kernel/built-in.o \arch/arm/mm/built-in.o arch/arm/common/built-in.o \arch/arm/probes/built-in.o arch/arm/net/built-in.o \arch/arm/crypto/built-in.o arch/arm/firmware/built-in.o \arch/arm/mach-imx/built-in.o kernel/built-in.o\mm/built-in.o fs/built-in.o \ipc/built-in.o security/built-in.o \crypto/built-in.o block/built-in.o

關(guān)于head-y 、init-y、core-y 、libs-y 、drivers-y 和net-y 這6 個變量就講解到這里。這些變量都是一些built-in.o 或.a 等文件,這個和uboot 一樣,都是將相應(yīng)目錄中的源碼文件進(jìn)行編譯,然后在各自目錄下生成built-in.o 文件,有些生成了.a 庫文件。最終將這些built-in.o 和.a 文件進(jìn)行鏈接即可形成ELF 格式的可執(zhí)行文件,也就是vmlinux!但是鏈接是需要鏈接腳本的,vmlinux 的依賴arch/arm/kernel/vmlinux.lds 就是整個Linux 的鏈接腳本。

示例代碼35.5.3.2 第933 行的命令“+(callifchanged,link?vmlinux)”表示將(call if_changed,link-vmlinux) ”表示將(callifc?hanged,link?vmlinux)(call if_changed,link-vmlinux)的結(jié)果作為最終生成vmlinux 的命令,前面的“+”表示該命令結(jié)果不可忽略。$(call if_changed,link-vmlinux)是調(diào)用函數(shù)if_changed,link-vmlinux 是函數(shù)if_changed 的參數(shù),函數(shù)if_changed 定義在文件scripts/Kbuild.include 中,如下所示:

247 if_changed = $(if $(strip $(any-prereq) $(arg-check)), \ 248 @set -e; \ 249 $(echo-cmd) $(cmd_$(1)); \ 250 printf '%s\n' 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd)

any-prereq 用于檢查依賴文件是否有變化,如果依賴文件有變化那么any-prereq 就不為空,否則就為空。arg-check 用于檢查參數(shù)是否有變化,如果沒有變化那么arg-check 就為空。
第248 行,“@set -e”告訴bash,如果任何語句的執(zhí)行結(jié)果不為true(也就是執(zhí)行出錯)的話就直接退出。
第249 行,$ (echo-cmd)用于打印命令執(zhí)行過程,比如在鏈接vmlinux 的時候就會輸出“LINK vmlinux”。$ (cmd_$ (1))中的$ (1)表示參數(shù),也就是link-vmlinux,因此$ (cmd_$(1))表示執(zhí)行cmd_link-vmlinux 的內(nèi)容。cmd_link-vmlinux 在頂層Makefile 中有如下所示定義:

914 # Final link of vmlinux 915 cmd_link-vmlinux = $(CONFIG_SHELL) $< $(LD) $(LDFLAGS) $(LDFLAGS_vmlinux) 916 quiet_cmd_link-vmlinux = LINK $@

第915 行就是cmd_link-vmlinux 的值,其中CONFIG_SHELL=/bin/bash,$<表示目標(biāo)vmlinux的第一個依賴文件,根據(jù)示例代碼35.5.3.2 可知,這個文件為scripts/link-vmlinux.sh。LD= arm-linux-gnueabihf-ld -EL,LDFLAGS 為空。LDFLAGS_vmlinux 的值由頂層Makefile 和arch/arm/Makefile 這兩個文件共同決定,最終LDFLAGS_vmlinux=-p --no-undefined -X --pic-veneer --build-id。因此cmd_link-vmlinux 最終的值為:

cmd_link-vmlinux = /bin/bash scripts/link-vmlinux.sh arm-linux-gnueabihf-ld -EL -p --no-undefined -X --pic-veneer --build-id

cmd_link-vmlinux 會調(diào)用scripts/link-vmlinux.sh 這個腳本來鏈接出vmlinux!在link-vmlinux.sh 中有如下所示代碼:

51 vmlinux_link() 52 { 53 local lds="${objtree}/${KBUILD_LDS}" 54 55 if [ "${SRCARCH}" != "um" ]; then 56 ${LD} ${LDFLAGS} ${LDFLAGS_vmlinux} -o ${2} \ 57 -T ${lds} ${KBUILD_VMLINUX_INIT} \ 58 --start-group ${KBUILD_VMLINUX_MAIN} --end-group ${1} 59 else 60 ${CC} ${CFLAGS_vmlinux} -o ${2} \ 61 -Wl,-T,${lds} ${KBUILD_VMLINUX_INIT} \ 62 -Wl,--start-group \ 63 ${KBUILD_VMLINUX_MAIN} \ 64 -Wl,--end-group \ 65 -lutil ${1} 66 rm -f linux 67 fi 68 } ...... 216 info LD vmlinux 217 vmlinux_link "${kallsymso}" vmlinux

vmliux_link 就是最終鏈接出vmlinux 的函數(shù),第55 行判斷SRCARCH 是否等于“um”,如果不相等的話就執(zhí)行56~58 行的代碼。因為SRCARCH=arm,因此條件成立,執(zhí)行56~58 行的代碼。這三行代碼就應(yīng)該很熟悉了!就是普通的鏈接操作,連接腳本為lds= ./arch/arm/kernel/vmlinux.lds ,需要鏈接的文件由變量KBUILD_VMLINUX_INIT 和KBUILD_VMLINUX_MAIN 來決定,這兩個變量在示例代碼35.5.3.2 中已經(jīng)講解過了。

第217 行調(diào)用vmlinux_link 函數(shù)來鏈接出vmlinux。

使用命令“make V=1”編譯Linux,會有如圖35.5.3.1 所示的編譯信息:


至此我們基本理清了make 的過程,重點就是將各個子目錄下的built-in.o、.a 等文件鏈接在一起,最終生成vmlinux 這個ELF 格式的可執(zhí)行文件。鏈接腳本為arch/arm/kernel/vmlinux.lds,鏈接過程是由shell 腳本scripts/link-vmlinux.s 來完成的。接下來的問題就是這些子目錄下的built-in.o、.a 等文件又是如何編譯出來的呢?

built-in.o 文件編譯生成過程

根據(jù)示例代碼35.5.3.2 第920 行可知,vmliux 依賴vmlinux-deps,而vmlinux-deps= $(KBUILD_LDS) $(KBUILD_VMLINUX_INIT) $(KBUILD_VMLINUX_MAIN),KBUILD_LDS是鏈接腳本,這里不考慮,剩下的KBUILD_VMLINUX_INIT 和KBUILD_VMLINUX_MAIN 就是各個子目錄下的built-in.o、.a 等文件。最終vmlinux-deps 的值如下:

除了arch/arm/kernel/vmlinux.lds 以外,其他都是要編譯鏈接生成的。在頂層Makefile 中有如下代碼:

937 $(sort $(vmlinux-deps)): $(vmlinux-dirs) ;

sort 是排序函數(shù),用于對vmlinux-deps 的字符串列表進(jìn)行排序,并且去掉重復(fù)的單詞。可以看出vmlinux-deps 依賴vmlinux-dirs,vmlinux-dirs 也定義在頂層Makefile 中,定義如下:

889 vmlinux-dirs := $(patsubst %/,%,$(filter %/, $(init-y) $(init-m) \ 890 $(core-y) $(core-m) $(drivers-y) $(drivers-m) \ 891 $(net-y) $(net-m) $(libs-y) $(libs-m)))

vmlinux-dirs 看名字就知道和目錄有關(guān),此變量保存著生成vmlinux 所需源碼文件的目錄,值如下:

在頂層Makefile 中有如下代碼:

946 $(vmlinux-dirs): prepare scripts 947 $(Q)$(MAKE) $(build)=$@

目標(biāo)vmlinux-dirs 依賴prepare 和scripts,這兩個依賴不去浪費時間了,重點看一下第947行的命令。build 前面已經(jīng)說了,值為“-f ./scripts/Makefile.build obj”,因此將947 行的命令展開就是:

@ make -f ./scripts/Makefile.build obj=$@

$@表示目標(biāo)文件,也就是vmlinux-dirs 的值,將vmlinux-dirs 中的這些目錄全部帶入到命令中,結(jié)果如下:

@ make -f ./scripts/Makefile.build obj=init @ make -f ./scripts/Makefile.build obj=usr @ make -f ./scripts/Makefile.build obj=arch/arm/vfp @ make -f ./scripts/Makefile.build obj=arch/arm/vdso @ make -f ./scripts/Makefile.build obj=arch/arm/kernel @ make -f ./scripts/Makefile.build obj=arch/arm/mm @ make -f ./scripts/Makefile.build obj=arch/arm/common @ make -f ./scripts/Makefile.build obj=arch/arm/probes @ make -f ./scripts/Makefile.build obj=arch/arm/net @ make -f ./scripts/Makefile.build obj=arch/arm/crypto @ make -f ./scripts/Makefile.build obj=arch/arm/firmware @ make -f ./scripts/Makefile.build obj=arch/arm/mach-imx @ make -f ./scripts/Makefile.build obj=kernel @ make -f ./scripts/Makefile.build obj=mm @ make -f ./scripts/Makefile.build obj=fs @ make -f ./scripts/Makefile.build obj=ipc @ make -f ./scripts/Makefile.build obj=security @ make -f ./scripts/Makefile.build obj=crypto @ make -f ./scripts/Makefile.build obj=block @ make -f ./scripts/Makefile.build obj=drivers @ make -f ./scripts/Makefile.build obj=sound @ make -f ./scripts/Makefile.build obj=firmware @ make -f ./scripts/Makefile.build obj=net @ make -f ./scripts/Makefile.build obj=arch/arm/lib @ make -f ./scripts/Makefile.build obj=lib

這些命令運行過程其實都是一樣的,我們就以“@ make -f ./scripts/Makefile.build obj=init”這個命令為例,講解一下詳細(xì)的運行過程。這里又要用到Makefile.build 這個腳本了,此腳本默認(rèn)目標(biāo)為__build,這個在35.5.2 小節(jié)已經(jīng)講過了,我們再來看一下,__build 目標(biāo)對應(yīng)的規(guī)則如下:

94 __build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y)) \ 95 $(if $(KBUILD_MODULES),$(obj-m) $(modorder-target)) \ 96 $(subdir-ym) $(always) 97 @:

當(dāng)只編譯Linux 內(nèi)核鏡像文件,也就是使用“make zImage ”編譯的時候,
KBUILD_BUILTIN=1,KBUILD_MODULES 為空。“make”命令是會編譯所有的東西,包括Linux內(nèi)核鏡像文件和一些模塊文件。如果只編譯Linux 內(nèi)核鏡像的話,__build 目標(biāo)簡化為:

__build: $(builtin-target) $(lib-target) $(extra-y)) $(subdir-ym) $(always) @:

重點來看一下builtin-target 這個依賴,builtin-target 同樣定義在文件scripts/Makefile.build中,定義如下:

86 ifneq ($(strip $(obj-y) $(obj-m) $(obj-) $(subdir-m) $(lib-target)),) 87 builtin-target := $(obj)/built-in.o 88 endif

第87 行就是builtin-target 變量的值,為“$(obj)/built-in.o”,這就是這些built-in.o 的來源了。
要生成built-in.o,要求obj-y、obj-m、obj-、subdir-m 和lib-target 這些變量不能全部為空。最后一個問題:built-in.o 是怎么生成的?在文件scripts/Makefile.build 中有如下代碼:

325 # 326 # Rule to compile a set of .o files into one .o file 327 # 328 ifdef builtin-target 329 quiet_cmd_link_o_target = LD $@ 330 # If the list of objects to link is empty, just create an empty built-in.o 331 cmd_link_o_target = $(if $(strip $(obj-y)),\ 332 $(LD) $(ld_flags) -r -o $@ $(filter $(obj-y), $^) \ 333 $(cmd_secanalysis),\ 334 rm -f $@; $(AR) rcs$(KBUILD_ARFLAGS) $@) 335 336 $(builtin-target): $(obj-y) FORCE 337 $(call if_changed,link_o_target) 338 339 targets += $(builtin-target) 340 endif # builtin-target

第336 行的目標(biāo)就是builtin-target,依賴為obj-y,命令為“KaTeX parse error: Double subscript at position 24: …_changed,link_o_?target)”,也就是調(diào)用函…(1)所對應(yīng)的命令($(1)就是函數(shù)的第1 個參數(shù)),在這里就是調(diào)用
cmd_link_o_target 所對應(yīng)的命令,也就是第331~334 行的命令。cmd_link_o_target 就是使用LD將某個目錄下的所有.o 文件鏈接在一起,最終形成built-in.o。

make zImage 過程

1、vmlinux、Image,zImage、uImage 的區(qū)別
前面幾小節(jié)重點是講vmlinux 是如何編譯出來的,vmlinux 是ELF 格式的文件,但是在實際中我們不會使用vmlinux,而是使用zImage 或uImage 這樣的Linux 內(nèi)核鏡像文件。那么vmlinux、zImage、uImage 他們之間有什么區(qū)別呢?
①、vmlinux 是編譯出來的最原始的內(nèi)核文件,是未壓縮的,比如正點原子提供的Linux 源碼編譯出來的vmlinux 差不多有16MB,如圖35.5.5.1 所示:

②、Image 是Linux 內(nèi)核鏡像文件,但是Image 僅包含可執(zhí)行的二進(jìn)制數(shù)據(jù)。Image 就是使用objcopy 取消掉vmlinux 中的一些其他信息,比如符號表什么的。但是Image 是沒有壓縮過的,Image 保存在arch/arm/boot 目錄下,其大小大概在12MB 左右如圖35.5.5.2 所示:

相比vmlinux 的16MB,Image 縮小到了12MB。
③、zImage 是經(jīng)過gzip 壓縮后的Image,經(jīng)過壓縮以后其大小大概在6MB 左右,如圖35.5.5.3 所示:

④、uImage 是老版本uboot 專用的鏡像文件,uImag 是在zImage 前面加了一個長度為64字節(jié)的“頭”,這個頭信息描述了該鏡像文件的類型、加載位置、生成時間、大小等信息。但是新的uboot 已經(jīng)支持了zImage 啟動!所以已經(jīng)很少用到uImage 了,除非你用的很古老的uboot。

使用“make”、“make all”、“make zImage”這些命令就可以編譯出zImage 鏡像,在arch/arm/Makefile 中有如下代碼:

310 BOOT_TARGETS = zImage Image xipImage bootpImage uImage ...... 315 $(BOOT_TARGETS): vmlinux 316 $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@

第310 行,變量BOOT_TARGETS 包含zImage,Image,xipImage 等鏡像文件。
第315 行,BOOT_TARGETS 依賴vmlinux,因此如果使用“make zImage”編譯的Linux 內(nèi)
核的話,首先肯定要先編譯出vmlinux。
第316 行,具體的命令,比如要編譯zImage,那么命令展開以后如下所示:

@ make -f ./scripts/Makefile.build obj=arch/arm/boot MACHINE=arch/arm/boot/zImage

看來又是使用scripts/Makefile.build 文件來完成vmlinux 到zImage 的轉(zhuǎn)換。
關(guān)于Linux 頂層Makefile 就講解到這里,基本和uboot 的頂層Makefile 一樣,重點在于vmlinux 的生成。最后將vmlinux 壓縮成我們最常用的zImage 或uImage 等文件。

總結(jié)

以上是生活随笔為你收集整理的Linux 内核顶层Makefile 详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

日韩电影中文字幕 | 视频在线观看91 | 婷婷丁香视频 | 亚洲成熟女人毛片在线 | 成人av免费电影 | 亚洲黄色免费在线看 | 日韩精品首页 | 欧美福利网站 | 超碰97人| 精品国产自在精品国产精野外直播 | 黄色一区三区 | 中文字幕91 | av 一区二区三区 | 国产xx视频 | 视频一区视频二区在线观看 | 天天天综合网 | 伊人婷婷激情 | 国产精品色在线 | 免费日韩 精品中文字幕视频在线 | 欧美日本不卡高清 | 91精品国产乱码久久 | 9797在线看片亚洲精品 | 国产精品久久久久久久久久ktv | 国产精品综合久久 | 在线电影91 | 精品国产欧美一区二区 | 日韩激情久久 | 国产免费叼嘿网站免费 | 天天色天天射天天综合网 | 国产999精品久久久久久绿帽 | 五月婷婷国产 | 91av在线免费看| 国产精品一区二区在线 | 精品国产午夜 | 天天干人人干 | 国产91学生粉嫩喷水 | 免费看色视频 | 日日碰夜夜爽 | 天天久久夜夜 | 99久久精品国产一区 | 中文字幕在线一区二区三区 | 三级a视频 | www.久久婷婷 | 国产一区电影在线观看 | 丁香花在线观看免费完整版视频 | 国产在线不卡 | 亚洲精品资源在线观看 | 国产在线精品播放 | 国产亚洲午夜高清国产拍精品 | 91av在线不卡 | 91传媒免费在线观看 | 五月天堂网| 顶级bbw搡bbbb搡bbbb | 青春草视频在线播放 | 国产视频在线观看免费 | 毛片区 | 日韩一级理论片 | 国产中文在线播放 | 国产精品午夜在线观看 | 久热色超碰 | 欧美另类成人 | 99精品黄色片免费大全 | 久久视频免费观看 | 亚洲专区欧美专区 | 一色av| 亚洲专区中文字幕 | www.久久久com | 天天干天天操 | 日韩在线观看视频免费 | 午夜精品久久久久久中宇69 | 久久综合一本 | 黄色在线看网站 | 日本中文字幕在线观看 | 在线亚洲天堂网 | 亚洲九九九在线观看 | 亚洲欧洲一区二区在线观看 | 欧美日韩精品在线观看视频 | 欧美另类调教 | 亚洲一区欧美激情 | 国产一级一片免费播放放a 一区二区三区国产欧美 | 99视频精品 | 国产福利免费在线观看 | 视频一区二区国产 | 国产老妇av| 91九色视频观看 | 欧美成人黄色 | 中文字幕在线有码 | 久久国产精品一区二区三区四区 | 亚洲劲爆av | 激情网婷婷 | 一区精品久久 | 国产人成在线观看 | 色狠狠一区二区 | 97电影手机版 | 五月婷婷开心 | 青草视频免费观看 | 国产精品一区二区 91 | 国产理论片在线观看 | 国产视频精品免费 | 欧美激情视频在线观看免费 | 日韩精品亚洲专区在线观看 | 五月综合色 | 尤物九九久久国产精品的分类 | 日韩免费高清在线 | 国产xxxxx在线观看 | 久久免费av电影 | 香蕉久久国产 | 久热免费在线 | 亚洲免费不卡 | 亚洲日本精品视频 | 久久久免费毛片 | 欧美国产视频在线 | 成人国产在线 | av官网| 欧美夫妻生活视频 | 国产一区二区久久精品 | 久久国产精品免费观看 | 91精品推荐 | 粉嫩av一区二区三区四区在线观看 | 欧美激情精品久久久久久 | 99视频久 | 成人午夜电影网站 | 欧美色伊人 | 国产日韩精品久久 | 欧美人zozo | 国产成人一区二区三区免费看 | 91传媒在线播放 | 亚洲va天堂va欧美ⅴa在线 | 午夜精品一区二区三区四区 | 在线天堂v| 国产精品亚洲视频 | 欧美日韩在线电影 | 丁香六月av | 免费精品国产va自在自线 | 天天操夜夜操国产精品 | 久草香蕉在线视频 | 91麻豆国产| 91视频大全 | 亚洲精品久久久久久久不卡四虎 | 91精品在线观看视频 | 欧女人精69xxxxxx | 亚洲精品欧美专区 | 日韩一区二区免费视频 | 国产日本亚洲 | 日本少妇久久久 | 91人人爽久久涩噜噜噜 | 日韩精品高清视频 | 国产一区二区播放 | 欧美一级淫片videoshd | 亚洲女欲精品久久久久久久18 | 亚洲成av人片在线观看 | 日本在线视频网址 | 亚洲一区欧美激情 | 亚洲精品456在线播放第一页 | 久草视频国产 | 欧美夫妻生活视频 | 精品自拍av| 综合网伊人 | 亚洲九九爱| 日韩视频一区二区在线观看 | 亚洲精品色 | 99精品视频网 | 成人h在线观看 | 欧美日韩在线观看一区 | 不卡电影免费在线播放一区 | 午夜精品电影一区二区在线 | 91亚洲精品乱码久久久久久蜜桃 | 国产视频九色蝌蚪 | 天天天天综合 | 欧洲在线免费视频 | 久久草视频 | 国产女v资源在线观看 | 狠狠躁日日躁狂躁夜夜躁av | 91禁在线看| 婷婷激情5月天 | 亚洲一区二区精品 | 久久精品99国产精品日本 | 中文字幕在线观看一区 | 五月婷婷久久综合 | 久久久久在线观看 | 精品视频免费播放 | 亚洲综合视频在线观看 | 91亚洲精品久久久蜜桃借种 | 国产精品高潮呻吟久久久久 | 日韩天天操 | 国产一级精品视频 | 日本三级大片 | 亚洲黄色一级电影 | 一区二区三区电影 | 91在线影视 | 日韩在线观看电影 | 天天干天天拍天天操天天拍 | 久久一级电影 | 国产色视频123区 | 91精品国产麻豆国产自产影视 | 国产在线不卡视频 | 热久在线| 欧美在线18 | 国产99免费 | 亚洲精品视频网站在线观看 | 国产亲近乱来精品 | av手机在线播放 | 人人讲 | 国产麻豆剧传媒免费观看 | 一区二区视 | 亚洲第一色 | 在线观看免费视频你懂的 | 久久国产视屏 | 亚洲国产午夜精品 | 欧美男男激情videos | 色a资源在线 | 久久久久久久久爱 | 最新一区二区三区 | 激情视频在线观看网址 | 日本91在线 | 超碰成人免费电影 | 国产精品第一页在线观看 | 日韩h在线观看 | 欧美精品久久久久久久免费 | 久久神马影院 | 日韩一二区在线观看 | 色资源网免费观看视频 | 国产精品欧美日韩在线观看 | 久久久蜜桃 | 99精品在线观看视频 | 午夜999 | 国产精品黄色影片导航在线观看 | 69亚洲视频 | 日本少妇高清做爰视频 | 日韩无在线 | www.人人干 | 一级c片| 国产特级毛片aaaaaa毛片 | 亚洲日本va午夜在线电影 | 日韩电影在线观看一区二区 | 激情文学综合丁香 | 五月天婷婷综合 | 日本精品在线看 | 国产视频高清 | 国产亚洲成人精品 | 国产精品一区二区中文字幕 | 欧美做受69 | 久久综合狠狠综合 | 97超碰超碰久久福利超碰 | 黄色中文字幕 | av资源免费在线观看 | 国产成人精品日本亚洲999 | 欧美在线aa | 精品久久电影 | 国产黄在线观看 | 99久久精品国产网站 | 日女人免费视频 | 婷婷九月激情 | 天天干天天拍 | 国产精品久久久久av | 久久久国产精品视频 | 久久精品三级 | 在线免费观看视频 | 国产喷水在线 | 四虎国产精品免费观看视频优播 | 亚洲专区视频在线观看 | 日韩高清免费在线观看 | 日韩激情免费视频 | 午夜电影 电影 | 91视频 - 88av| 午夜视频在线观看一区二区三区 | 免费观看第二部31集 | 国产一级免费观看视频 | 一级黄毛片 | 亚洲国产中文字幕在线观看 | 欧美 亚洲 另类 激情 另类 | 久久人人干 | 欧美日韩午夜在线 | 亚洲成a人片77777kkkk1在线观看 | 热久精品 | 91日韩精品视频 | 极品中文字幕 | 91成品视频 | 久久成人免费电影 | 国产精品永久免费在线 | 国产一区在线精品 | 国产中文字幕视频在线观看 | 免费亚洲成人 | 久久久综合精品 | 亚洲激情国产精品 | 国产精品麻| 综合亚洲视频 | 日本黄色免费看 | 九九热视频在线 | 久久调教视频 | 人人爽影院 | 一级a性色生活片久久毛片波多野 | 国语自产偷拍精品视频偷 | 免费视频一二三区 | 国产剧情一区二区 | 色先锋av资源中文字幕 | 808电影免费观看三年 | 久久综合电影 | 在线免费观看国产视频 | 午夜精品一区二区三区在线视频 | 天天av资源 | 久久久久久久久亚洲精品 | 免费av片在线 | 亚洲国产精品成人综合 | 成人啪啪18免费游戏链接 | 国产精品中文字幕在线观看 | 欧美日韩另类视频 | 久久久久久久久久久高潮一区二区 | 一区二区三区四区五区在线视频 | 日韩av男人的天堂 | 成年人黄色在线观看 | 亚洲欧美怡红院 | 亚州免费视频 | 日韩在线网 | 亚洲激情在线播放 | 国产在线视频资源 | 午夜视频免费播放 | 日韩欧美电影 | 国产黑丝袜在线 | 激情av综合 | 免费看av在线 | 国产精品h在线观看 | 国产精品一区二区久久精品爱微奶 | 天天鲁天天干天天射 | 亚洲精品在线二区 | 黄色电影在线免费观看 | 99精品乱码国产在线观看 | 日韩免费观看一区二区 | 亚洲视频高清 | 久久精品国产亚洲精品 | 免费成人在线观看视频 | 免费看三级黄色片 | 欧美日韩精品在线播放 | 国产精品成人av久久 | 日韩三级久久 | 色婷婷视频 | 91精品视频免费看 | 玖玖视频精品 | 性色视频在线 | 久久久久综合精品福利啪啪 | 成人91视频 | 夜色成人av | 亚洲精品午夜久久久久久久 | 色婷婷免费视频 | 韩日视频在线 | 香蕉影院在线观看 | 黄色综合| 色搞搞 | 91香蕉久久| 99色99| 久草在线91 | 一区二区欧美在线观看 | 天天爽夜夜爽精品视频婷婷 | 毛片网免费 | 九九热免费精品视频 | www色综合 | 高清在线一区二区 | 97香蕉超级碰碰久久免费软件 | 亚洲精品视频在线播放 | 色婷婷久久 | 免费男女羞羞的视频网站中文字幕 | 97小视频 | 色视频在线免费 | 在线播放 日韩专区 | 97国产在线视频 | 婷婷久久一区 | 国产999久久久 | 国产精品短视频 | 在线视频观看你懂的 | 超碰97人人爱| 国内精品小视频 | 黄色免费观看视频 | 黄色免费在线看 | 国产精品少妇 | 国产精品99久久久久久久久 | 国产一级二级在线播放 | 一级精品视频在线观看宜春院 | av一区二区三区在线播放 | 日日夜日日干 | 成人黄色在线观看视频 | 一区二区视频在线观看免费 | 婷婷精品在线视频 | 免费色视频网址 | 在线观看中文字幕dvd播放 | 免费久久久久久 | 久草青青在线观看 | 国产精品岛国久久久久久久久红粉 | 免费高清看电视网站 | 亚洲免费精彩视频 | 亚洲视频电影在线 | 韩国av一区二区三区 | 亚洲国产日韩av | 国产在线成人 | 国产护士av | 色在线免费 | 中文字幕日韩国产 | 欧美日韩久久 | 成人中心免费视频 | 亚洲欧美精品一区 | 久久久久网站 | 人人舔人人插 | 中日韩三级视频 | 久久欧美综合 | 国产精品成久久久久三级 | 久久国产精品99久久久久久老狼 | 亚洲午夜精品久久久 | 99亚洲精品 | 婷婷色中文 | 97超碰人人干 | 久久精品视频日本 | 国产中文字幕网 | 国产专区视频在线 | 最新在线你懂的 | 91成人网在线 | 国产福利91精品一区二区三区 | 亚洲国产精品影院 | 日韩欧美高清在线观看 | 处女av在线 | 最新久久免费视频 | 色大片免费看 | 天堂久色 | 亚洲国产中文字幕在线观看 | 久久久久免费精品视频 | 天天干天天操天天入 | 日韩二级毛片 | 三级毛片视频 | 亚洲精品久久久久久久不卡四虎 | 99视频在线精品国自产拍免费观看 | 久久66热这里只有精品 | 日韩成人邪恶影片 | 久草在线免费播放 | 99在线观看视频网站 | 国产亚洲精品久久久久久大师 | 久久老司机精品视频 | 免费观看特级毛片 | 久久国产精品一区二区三区四区 | 久久不色| 黄色在线免费观看网址 | 亚洲精品乱码久久久久久蜜桃欧美 | 日本一区二区三区免费观看 | 国产精品第三页 | 国产一线二线三线在线观看 | 99精品一级欧美片免费播放 | 亚洲区精品 | 人成电影网 | 伊人久久国产 | 五月婷婷av在线 | 国产综合小视频 | 精品伦理一区二区三区 | 久久婷婷久久 | 国产剧情一区在线 | 色中射| 91看片看淫黄大片 | 激情偷乱人伦小说视频在线观看 | 久久成人精品视频 | 天天干天天天天 | 91视频午夜 | 久久久亚洲麻豆日韩精品一区三区 | 成人在线播放视频 | 久草在线中文888 | 日韩av成人 | 国产精品日韩欧美 | 午夜三级理论 | 久久免费电影网 | 深爱激情五月婷婷 | 亚洲va在线va天堂 | 一区二区三区四区五区六区 | 91片在线观看 | 国产精品免费一区二区三区在线观看 | 日韩在线观看一区二区 | 一区二区三区精品在线视频 | 久久综合五月天 | 美女黄视频免费看 | 在线免费观看一区二区三区 | www九九热| 国产亚洲精品无 | 91精品国产自产91精品 | 国产综合精品久久 | 成人一区电影 | 成人中文字幕+乱码+中文字幕 | 少妇精69xxtheporn | 正在播放亚洲精品 | 国产青春久久久国产毛片 | 91精品视频在线观看免费 | 日本中文字幕电影在线免费观看 | 日本黄色一级电影 | 在线观看视频三级 | 一本一本久久a久久 | 97视频在线免费观看 | 欧美激情精品久久久久 | 欧美成人xxxxxxxx| 亚洲免费在线播放视频 | 国产精品美女www爽爽爽视频 | 久久精品国产成人 | 国产资源在线观看 | www.黄色片网站 | 精品久久久久久久久久久久久久久久久久 | 98久久| 97超碰国产在线 | 欧美一级小视频 | 日韩一区二区三区在线观看 | 国产美女网站在线观看 | 2021国产在线 | 伊甸园av在线 | 婷婷亚洲综合五月天小说 | 亚洲第一成网站 | 在线导航av | 中文字幕免费一区二区 | 欧美一区二区三区免费看 | av福利网址导航 | 国产精品va最新国产精品视频 | 精品国产一区二区三区久久久 | 免费视频成人 | aaa毛片视频| 久久综合色天天久久综合图片 | 日韩一区二区三区不卡 | 成人免费视频在线观看 | 狠狠色狠狠色综合系列 | 在线观看香蕉视频 | 色婷婷免费视频 | 免费影视大全推荐 | 热久久免费国产视频 | 婷婷国产精品 | 91精品伦理 | 国产美女视频网站 | 久久福利影视 | 中文字幕在线观看亚洲 | 一区二区三区韩国免费中文网站 | 一区二区视频播放 | av一级一片 | 中文字幕在线视频一区二区三区 | 国产v欧美 | 日本九九视频 | 97国产超碰在线 | 久久无码精品一区二区三区 | 天天躁日日 | 国产精品一区二区免费视频 | 国产成人精品午夜在线播放 | 国产精品一区二区吃奶在线观看 | 久草在线一免费新视频 | 天天射天 | 亚洲一级电影在线观看 | 欧美一级高清片 | 女人18精品一区二区三区 | 成年人免费电影在线观看 | 婷婷色五 | 免费在线观看成人av | 97碰在线 | 亚洲综合五月天 | 丁香综合网 | 网站免费黄色 | 亚洲欧洲美洲av | 99久久精品免费看国产 | 国产精品第2页 | 91亚洲精品久久久中文字幕 | 国产精品一区二区av影院萌芽 | 高清av网 | 超碰免费久久 | 美女国产精品 | 98超碰人人| 国产精品一区二区三区观看 | 久久久久久久国产精品视频 | 在线 影视 一区 | 中文字幕在线观看免费观看 | 成人一区不卡 | 在线观看黄色av | 精精国产xxxx视频在线播放 | 欧美日韩国产精品一区二区 | 欧美另类高潮 | 久久成人精品电影 | 欧美激情精品久久久久久变态 | 国产精品免费视频观看 | 一级电影免费在线观看 | 欧美亚洲免费在线一区 | 久久久久一区二区三区 | 欧美精品色 | 婷婷中文字幕综合 | 色久网| 日韩中文在线播放 | 欧美成人理伦片 | 欧美人交a欧美精品 | 99在线热播精品免费 | 日韩av中文字幕在线 | 欧美精品国产精品 | 成年人看片网站 | 黄色aa久久 | 国产精品女| 亚洲日本精品视频 | 欧美久草网| 亚洲黄色免费在线 | 九九九热精品免费视频观看 | 成人四虎| av免费看看 | 国产高清免费在线播放 | 中文在线中文资源 | 国产精品免费看 | 69国产精品成人在线播放 | 国产精品毛片久久 | 99久免费精品视频在线观看 | www视频在线播放 | 99久久99久久精品国产片果冰 | 亚洲欧美国产精品va在线观看 | 一区二区三区影院 | 免费观看成人网 | 中文字幕在线免费观看 | 又黄又刺激的网站 | 久久大片| 91av在线国产 | 制服丝袜亚洲 | 欧美成亚洲 | 欧美精品久久久久久久免费 | 亚洲国产999 | 玖玖综合网 | 成在人线av | 操天天操 | 国产精品视频观看 | 国产精品一区二区久久精品爱涩 | 人人爱人人添 | 久久国产乱 | 亚洲人成人在线 | 狠狠干天天色 | 韩国精品在线观看 | 在线观影网站 | 天天干,天天射,天天操,天天摸 | 首页av在线 | 国产一级久久久 | 国产成人精品一区二区三区在线 | 国产xxxxx在线观看 | 国产1区2区 | 色偷偷网站视频 | 天天干天天操天天爱 | 91精品999| 婷婷 综合 色 | 在线激情av电影 | 精品色综合| 亚色视频在线观看 | 国产一区二区视频在线 | 免费精品国产va自在自线 | 久久久黄色免费网站 | 碰超人人 | 伊人超碰在线 | 久久99精品久久久久蜜臀 | 亚洲日本欧美在线 | 免费观看版 | 一级淫片a| 国产区精品区 | 99精品在线免费观看 | 亚洲区视频在线观看 | 免费国产一区二区 | 色婷婷一区| 国产97视频在线 | 国产黄色片一级三级 | 国产精品久久久久久久久久东京 | 久久香蕉国产精品麻豆粉嫩av | 天堂素人在线 | 国产美女在线精品免费观看 | 天天人人综合 | 91午夜精品| 久久综合久久综合久久综合 | 精品在线视频观看 | 色综合网 | 国产亚洲激情视频在线 | 欧美日韩免费看 | 亚洲日本三级 | 超碰国产在线观看 | 欧美激情精品久久久久久免费印度 | 中文字幕视频在线播放 | 操操操夜夜操 | 婷婷激情久久 | 精品福利网站 | 91精品国产成 | 亚洲欧美精品在线 | 国内精品久久久久久久久久久 | 精品国产大片 | 在线成人免费 | 日韩大片在线观看 | 天天干,天天插 | 亚洲精品国产自产拍在线观看 | 欧美a级在线免费观看 | 国产美女视频黄a视频免费 久久综合九色欧美综合狠狠 | 国产精品一级在线 | 成人黄色影片在线 | 91成人午夜 | 91高清免费在线观看 | 久久久久久久久久久高潮一区二区 | 欧美日本啪啪无遮挡网站 | 国产高清亚洲 | 国产精品婷婷午夜在线观看 | 青青网视频| 91激情在线视频 | 国产成人精品在线播放 | 欧美在线a视频 | 国产精品18久久久久久不卡孕妇 | 国产精品久久久久久久久久直播 | 久久www免费人成看片高清 | 欧美另类重口 | 日韩欧美高清在线观看 | 中文字幕在线观看第三页 | 色综合天天狠天天透天天伊人 | 九九亚洲精品 | 国产经典av | 欧美 日韩 成人 | 成人国产精品一区二区 | 天天草天天草 | 日韩精品中文字幕久久臀 | 99视频在线观看视频 | 中文字幕资源网 | 国产最新在线视频 | 久久久久综合视频 | 国产精品久久久久久久婷婷 | 久久精品国产免费看久久精品 | av亚洲产国偷v产偷v自拍小说 | 欧美精品免费视频 | 三级视频片| 亚洲高清视频在线观看免费 | 国产成人精品一区二 | 日韩欧美电影 | 蜜臀久久99静品久久久久久 | 精品久久网 | 成人国产精品 | 久久久久久久久黄色 | 亚洲永久av | 国产精品久久久久永久免费看 | 国产香蕉视频在线观看 | 亚洲 欧美变态 另类 综合 | 天天色综合1 | 久久久久一区二区三区 | 国产精品久久久久久模特 | 欧美精品一区二区三区四区在线 | 午夜久久影视 | 黄色免费观看 | 午夜精品久久久久久99热明星 | 亚洲女人天堂成人av在线 | 在线视频专区 | 日韩精品一区在线播放 | 五月婷婷丁香激情 | 最新av电影网站 | 久久情爱 | 久久久久免费精品视频 | 天天射天天操天天干 | 国产特级毛片aaaaaa高清 | 成年人三级网站 | 久久夜色精品国产欧美一区麻豆 | 久久久精品免费观看 | 激情综合色播五月 | 日本大片免费观看在线 | 国产午夜精品理论片在线 | 亚洲aⅴ免费在线观看 | 久久国产精品一国产精品 | 999国产精品视频 | 黄色小网站在线观看 | 国内精品亚洲 | 亚洲成av人影片在线观看 | 黄色a一级视频 | 免费观看黄| 国产亚洲免费的视频看 | 中日韩欧美精彩视频 | 免费在线观看中文字幕 | 综合色影院| 亚洲国产合集 | www.久久99 | 国产高清99| 天堂在线成人 | 伊人国产在线观看 | 欧美精品少妇xxxxx喷水 | 久久一级片| 日韩羞羞 | 免费黄色在线网站 | 麻豆高清免费国产一区 | 国产剧情av在线播放 | 国产999免费视频 | 欧美成人久久 | 国产午夜精品一区二区三区欧美 | 在线观看免费视频你懂的 | 国产午夜激情视频 | 国产免费作爱视频 | 精品麻豆 | 国产精品久久久影视 | 91久久国产自产拍夜夜嗨 | 亚洲精品h| 在线免费观看欧美日韩 | www.伊人网 | 久久久久免费看 | www.黄色片.com | 99热精品国产一区二区在线观看 | 日本丶国产丶欧美色综合 | 精品国产伦一区二区三区观看说明 | 伊人婷婷激情 | 国产探花视频在线播放 | 日日操网 | 色噜噜日韩精品欧美一区二区 | 狠狠狠狠狠狠狠干 | 欧美日韩久久一区 | 中文字幕久久精品一区 | 91福利视频一区 | www日韩精品 | 毛片无卡免费无播放器 | 亚洲欧洲视频 | 狠狠色丁香婷婷综合欧美 | 国产精品久久久久毛片大屁完整版 | 夜夜躁狠狠燥 | 免费国产亚洲视频 | 日韩中文字幕视频在线观看 | 中文字幕免费高清 | 久久国产视频网 | 亚洲成av | 亚洲精品综合在线观看 | 日韩毛片在线免费观看 | 综合网五月天 | 最近中文字幕国语免费高清6 | 国产精品久久久久久久午夜 | 狠狠色狠狠色综合系列 | 美女视频a美女大全免费下载蜜臀 | 亚洲九九影院 | 四虎国产精品成人免费4hu | 草久在线视频 | 国产小视频在线免费观看 | 黄色的网站免费看 | 视频国产区| 免费观看黄| 91精品国产91p65 | 久久在草 | 在线观看视频中文字幕 | 在线观看黄色 | 国产淫片免费看 | 精品久久久久久久久久久久久久久久久久 | 亚洲视频 在线观看 | 亚洲 欧洲 国产 日本 综合 | 97视频在线免费观看 | 欧美日韩国产一区二区在线观看 | 九九热在线免费观看 | 免费一级片在线观看 | 国产精品美女999 | 在线观看久久久久久 | 国产精品一区电影 | 亚洲欧洲日韩 | 精品不卡视频 | 日本巨乳在线 | 97av影院 | 成人av免费 | 日日干av | 中文字幕在线播放视频 | 欧美色图另类 | 在线免费色视频 | 1000部18岁以下禁看视频 | 国产一区二区三区视频在线 | 成人免费看电影 | 国产夫妻av在线 | 日韩精品 在线视频 | 91三级视频| 亚洲精品99久久久久久 | 国产日产精品一区二区三区四区的观看方式 | 免费观看一级成人毛片 | 五月婷婷久 | 日韩高清精品免费观看 | 五月天激情综合 | 国产精品99久久久久久人免费 | 夜夜操天天 | 日韩在线资源 | 91香蕉亚洲精品 | 视频 天天草 | 九九热精品视频在线播放 | 日韩一区二区久久 | 欧美日韩1区 | 久草网视频在线观看 | 97人人超碰在线 | 国产黄色精品在线观看 | 国内少妇自拍视频一区 | 玖玖在线视频观看 | www.国产在线观看 | 国产一线天在线观看 | 中文字幕精品一区二区精品 | 免费网站看av片 | 五月天免费网站 | 精品一区二区在线免费观看 | 综合伊人av| 免费在线色视频 | 国产精品v欧美精品 | 日韩深夜在线观看 | 国产小视频在线免费观看视频 | 欧美一级在线 | 一区二区成人国产精品 | 国产午夜精品理论片在线 | 国产视频精品免费播放 | 国内视频在线观看 | 久草免费手机视频 | 精品国产福利在线 | 人人涩 | 99在线精品观看 | 欧美成人日韩 | 日韩在线视频网 | 丁香六月久久综合狠狠色 | 免费h精品视频在线播放 | 视频二区在线视频 | 成人h动漫在线看 | 夜色成人网 | 九七在线视频 | 在线亚洲天堂网 | 久久综合国产伦精品免费 | 国产午夜在线观看视频 | 波多野结衣日韩 | 色综合久久中文字幕综合网 | 日日夜夜中文字幕 | 黄色a一级片 | 国产日韩精品欧美 | 国产资源在线观看 | 国内精品久久久久 | 国产精品日韩欧美 | 亚洲专区在线 | 激情深爱.com | 成人性生交大片免费看中文网站 | av在线播放不卡 | 97超碰免费在线观看 | 国产精品99久久久久的智能播放 | 色婷婷中文| 欧美激情另类文学 | 五月婷婷中文 | 午夜精品一区二区三区可下载 | 日韩 国产 | 欧美黑人xxxx猛性大交 | 99视频在线观看免费 | 国产精品嫩草55av | 国产字幕在线观看 | v片在线播放 | 国内精品视频免费 | 性色xxxxhd| 2023国产精品自产拍在线观看 | 国产黄网站在线观看 | 成 人 黄 色视频免费播放 | 91香蕉国产| 亚洲精品成人在线 | av中文字幕第一页 | 亚洲精品a区 | 亚洲精品免费在线播放 | 国产手机在线视频 | www.久久91 | 欧美色噜噜噜 | 五月天六月婷婷 | 91爱在线 | 激情大尺度视频 | 午夜视频在线观看一区二区三区 | 亚洲精品乱码久久久一二三 | 97在线观看免费视频 | 香蕉在线视频播放网站 | 欧美久久久久 | 久久一区精品 | 久久色网站| 国产3p视频 | 欧美久久久 | aaa日本高清在线播放免费观看 | 免费观看一级特黄欧美大片 | 日韩高清免费观看 | 天堂av在线7 | 欧美日韩国产一区二区在线观看 | 日本精品中文字幕在线观看 | 国产精品久久久久国产精品日日 | 99精品在线视频播放 | 中文字幕精品一区 | 日韩手机在线观看 | 探花视频在线观看+在线播放 | 日本免费久久高清视频 | 国产一区二区日本 | 高潮毛片无遮挡高清免费 | 国内精自线一二区永久 | 亚洲天堂在线观看完整版 | 国产人成看黄久久久久久久久 | 区一区二在线 | 能在线观看的日韩av | 国产精品一区二区久久久 | 精品国产精品国产偷麻豆 | 色综合久久88色综合天天免费 | 日韩免费看视频 | 国产高h视频 | 欧美三人交 | 男女靠逼app| 久草在线免费在线观看 | 国产永久免费高清在线观看视频 | 天天看天天干 | 激情婷婷六月 | 亚洲精品久久久久999中文字幕 | 国产五月色婷婷六月丁香视频 | 亚洲人成精品久久久久 | 色偷偷88888欧美精品久久 | 久久草 | 人人爽人人舔 | 日韩女同一区二区三区在线观看 | 亚洲国产成人av网 | 亚洲激色 | 五月天丁香视频 | 91片黄在线观看 | 欧美日韩中文视频 | 国产精品久久久久久一区二区三区 | 99色免费视频| 久久成人黄色 | 日韩欧美综合视频 | 午夜精品久久久99热福利 | 久久香蕉一区 | 精品视频一区在线观看 |