bsp开发之kernellinux启动流程以及编译流程分析(代码片段)

与光同程 与光同程     2022-11-30     251

关键词:

文章目录

linux 顶层Makefile分析

MAKEFLAGS += -rR

# 静默输出 make V=1 静默输出
ifeq ("$(origin V)", "command line")
  KBUILD_VERBOSE = $(V)
endif
ifndef KBUILD_VERBOSE
  KBUILD_VERBOSE = 0
endif

ifeq ($(KBUILD_VERBOSE),1)
  quiet =
  Q =
else
  quiet=quiet_
  Q = @
endif

# 设置编译结果输出目录 make O=path
ifeq ("$(origin O)", "command line")
  KBUILD_OUTPUT := $(O)
endif

# 默认编译目标
PHONY := _all
_all:

# 代码检查 make C=1 使能带代码检查
# make C=2 检查所有的源码文件
ifeq ("$(origin C)", "command line")
  KBUILD_CHECKSRC = $(C)
endif
ifndef KBUILD_CHECKSRC
  KBUILD_CHECKSRC = 0
endif

ifdef SUBDIRS
  KBUILD_EXTMOD ?= $(SUBDIRS)
endif

ifeq ("$(origin M)", "command line")
  KBUILD_EXTMOD := $(M)
endif

PHONY += all
ifeq ($(KBUILD_EXTMOD),)
_all: all
else
_all: modules
endif

ifeq ($(KBUILD_SRC),)
        # building in the source tree
        srctree := .
else
        ifeq ($(KBUILD_SRC)/,$(dir $(CURDIR)))
                # building in a subdirectory of the source tree
                srctree := ..
        else
                srctree := $(KBUILD_SRC)
        endif
endif
objtree		:= .
src		:= $(srctree)
obj		:= $(objtree)

VPATH		:= $(srctree)$(if $(KBUILD_EXTMOD),:$(KBUILD_EXTMOD))

export srctree objtree VPATH

# 设置架构以及交叉编译器
ARCH		= arm
CROSS_COMPILE	=arm-linux-gnueabi-


KCONFIG_CONFIG	?= .config
export KCONFIG_CONFIG

# SHELL used by kbuild
# CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \\
# 	  else if [ -x /bin/bash ]; then echo /bin/bash; \\
# 	  else echo sh; fi ; fi)
AS		= $(CROSS_COMPILE)as
LD		= $(CROSS_COMPILE)ld
CC		= $(CROSS_COMPILE)gcc
CPP		= $(CC) -E
AR		= $(CROSS_COMPILE)ar
NM		= $(CROSS_COMPILE)nm
STRIP		= $(CROSS_COMPILE)strip
OBJCOPY		= $(CROSS_COMPILE)objcopy
OBJDUMP		= $(CROSS_COMPILE)objdump
AWK		= awk
GENKSYMS	= scripts/genksyms/genksyms
INSTALLKERNEL  := installkernel
DEPMOD		= /sbin/depmod
PERL		= perl
PYTHON		= python
CHECK		= sparse

CHECKFLAGS     := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ \\
		  -Wbitwise -Wno-return-void $(CF)
CFLAGS_MODULE   =
AFLAGS_MODULE   =
LDFLAGS_MODULE  =
CFLAGS_KERNEL	=
AFLAGS_KERNEL	=
CFLAGS_GCOV	= -fprofile-arcs -ftest-coverage


# 添加头文件目录
USERINCLUDE    := \\
		-I$(srctree)/arch/$(hdr-arch)/include/uapi \\
		-Iarch/$(hdr-arch)/include/generated/uapi \\
		-I$(srctree)/include/uapi \\
		-Iinclude/generated/uapi \\
                -include $(srctree)/include/linux/kconfig.h
LINUXINCLUDE    := \\
		-I$(srctree)/arch/$(hdr-arch)/include \\
		-Iarch/$(hdr-arch)/include/generated/uapi \\
		-Iarch/$(hdr-arch)/include/generated \\
		$(if $(KBUILD_SRC), -I$(srctree)/include) \\
		-Iinclude \\
		$(USERINCLUDE)

# make xxx_deconfig 配置过程
config-targets := 0
mixed-targets  := 0
dot-config     := 1
ifneq ($(filter $(no-dot-config-targets), $(MAKECMDGOALS)),)
	ifeq ($(filter-out $(no-dot-config-targets), $(MAKECMDGOALS)),)
		dot-config := 0
	endif
endif
ifeq ($(KBUILD_EXTMOD),)
        ifneq ($(filter config %config,$(MAKECMDGOALS)),)
                config-targets := 1
                ifneq ($(words $(MAKECMDGOALS)),1)
                        mixed-targets := 1
                endif
        endif
endif

ifeq ($(mixed-targets),1)
PHONY += $(MAKECMDGOALS) __build_one_by_one
$(filter-out __build_one_by_one, $(MAKECMDGOALS)): __build_one_by_one
	@:
__build_one_by_one:
	$(Q)set -e; \\
	for i in $(MAKECMDGOALS); do \\
		$(MAKE) -f $(srctree)/Makefile $$i; \\
	done
else
ifeq ($(config-targets),1)

include $(srctree)/arch/$(SRCARCH)/Makefile
export KBUILD_DEFCONFIG KBUILD_KCONFIG

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

%config: scripts_basic outputmakefile FORCE
	$(Q)$(MAKE) $(build)=scripts/kconfig $@
else
ifeq ($(KBUILD_EXTMOD),)
PHONY += scripts
scripts: scripts_basic include/config/auto.conf include/config/tristate.conf \\
	 asm-generic
	$(Q)$(MAKE) $(build)=$(@)
init-y		:= init/
drivers-y	:= drivers/ sound/ firmware/
net-y		:= net/
libs-y		:= lib/
core-y		:= usr/
endif # KBUILD_EXTMOD

ifeq ($(dot-config),1)
ifeq ($(KBUILD_EXTMOD),)
-include include/config/auto.conf.cmd

$(KCONFIG_CONFIG) include/config/auto.conf.cmd: ;
include/config/%.conf: $(KCONFIG_CONFIG) include/config/auto.conf.cmd
	$(Q)$(MAKE) -f $(srctree)/Makefile silentoldconfig
else
PHONY += include/config/auto.conf
include/config/auto.conf:
	$(Q)test -e include/generated/autoconf.h -a -e $@ || (		\\
	echo >&2;							\\
	echo >&2 "  ERROR: Kernel configuration is invalid.";		\\
	echo >&2 "         include/generated/autoconf.h or $@ are missing.";\\
	echo >&2 "         Run 'make oldconfig && make prepare' on kernel src to fix it.";	\\
	echo >&2 ;							\\
	/bin/false)
endif # KBUILD_EXTMOD

else
include/config/auto.conf: ;
endif # $(dot-config)
all: vmlinux

make 过程分析

_all-->all-->vmlinux-->scripts/link-vmlinux.sh 
                       head-y  arch/arm/kernel/head.o
                       init -y init/built-in.o
                       libs-y  libs-y = arch/arm/lib/lib.a lib/lib.a arch/arm/lib/built-in.o lib/built-in.o
                       drivers-y = drivers/built-in.o sound/built-in.o firmware/built-in.o
                       net-y   snet/built-in.o
                       core-y   usr kernel fs ipc security crypto block
                            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

arch/arm/kernel/vmlinux.lds 就是整个 Linux 的链接脚本。

最终 vmlinux 依赖于以下文件:

vmlinux-deps = arch/arm/kernel/vmlinux.lds arch/arm/kernel/head.o \\
init/built-in.o 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 arch/arm/lib/lib.a\\
lib/lib.a arch/arm/lib/built-in.o\\
lib/built-in.o drivers/built-in.o \\
sound/built-in.o firmware/built-in.o \\
net/built-in.o

子文件夹编译

vmlinux-dirs = init usr arch/arm/vfp \\
arch/arm/vdso arch/arm/kernel arch/arm/mm \\
arch/arm/common arch/arm/probes arch/arm/net \\
arch/arm/crypto arch/arm/firmware arch/arm/mach-imx\\
kernel mm fs \\
ipc security crypto \\
block drivers sound \\
firmware net arch/arm/lib \\
lib
$(vmlinux-dirs): prepare scripts
    $(Q)$(MAKE) $(build)=$@

展开就是 @ make -f ./scripts/Makefile.build obj=$@
以 init 为例子目录编译脚本为:
@ make -f ./scripts/Makefile.build obj=init

Makefile.build 编译出子文件 build-in.o 过程分析

_build–>: $(builtin-target)
$(lib-target)
$(extra-y)
$(subdir-ym)
$(always)

$(builtin-target): $(obj-y) FORCE
$(call if_changed,link_o_target) -->= $(obj)/built-in.o

vmlinux、Image,zImage、uImage 的区别

vmlinux 是编译出来的最原始的内核文件,是未压缩的
Image 是 Linux 内核镜像文件,但是 Image 仅包含可执行的二进制数据。Image 就是使

用 objcopy 取消掉 vmlinux 中的一些其他信息
zImage 是经过 gzip 压缩后的 Image
uImage 是老版本 uboot 专用的镜像文件,uImag 是在 zImage 前面加了一个长度为 64
字节的“头”,这个头信息描述了该镜像文件的类型、加载位置、生成时间、大小等信息

内核启动流程分析

bsp开发之kernellinux启动流程以及编译流程分析(代码片段)

文章目录linux顶层Makefile分析make过程分析子文件夹编译Makefile.build编译出子文件build-in.o过程分析vmlinux、Image,zImage、uImage的区别内核启动流程分析linux顶层Makefile分析MAKEFLAGS+=-rR#静默输出makeV=1静默输出ifeq("$(originV)&... 查看详情

bsp开发之ubootuboot常用命令以及代码分析(代码片段)

文章目录uboot使用uboot命令通用UBOOT命令信息查看命令环境变量操作命令内存操作命令网络操作命令磁盘操作命令boot操作命令其他操作命令Uboot编译流程学习顶层Makefile分析uboot启动流程lowlevel_init_main(uboot/arch/arm/lib/crt0.S)relocate_vecto... 查看详情

bsp开发之ubootuboot常用命令以及代码分析(代码片段)

文章目录uboot使用uboot命令通用UBOOT命令信息查看命令环境变量操作命令内存操作命令网络操作命令磁盘操作命令boot操作命令其他操作命令RTL8197定制UBOOT命令UBOOT代码分析(通用UBOOT2016.01代码学习)顶层Makefile分析UBOOT启动过程代码分... 查看详情

hi3516开发笔记:hi3516虚拟机基础环境搭建之交叉编译环境境搭建以及开机启动脚本分析(代码片段)

...dn.net/article/details/121458516红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…海思开发专栏上一篇:《Hi3516开发笔记(... 查看详情

hi3516开发笔记:hi3516虚拟机基础环境搭建之交叉编译环境境搭建以及开机启动脚本分析(代码片段)

...6,WX:yangsir198808红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…海思开发专栏上一篇:《Hi3516开发笔记(... 查看详情

bsp开发之驱动开发

...操作系统仅仅有通过驱动程序才干訪问硬件。针对windowsce开发设备驱动。就是通过platformbuilder创建一个新的平台,然后依据硬件平台的须要插入或者移除驱动,须要改动的文件有platform.bib,platform.reg。按载入方式和接口分类,基... 查看详情

流程引擎之camunda开发记录(三)

参考技术A如果通过processDefinitionId来启动一个流程,那么代表启动流程定义的某一个版本,如果通过processDefinitionKey来启动流程,那么将会始终启动流程定义的最新版本注意:PageHelper不起作用processInstanceId和executionIdExecution和Proces... 查看详情

app开发流程之增加预编译头文件

在继续增加预编译头文件前,先稍等。Xcode为我们创建了一个模板项目,很棒!但有一点不太令人满意,问题就在下图中:这是一个新项目的初始文件目录,几乎所有文件都在同一级目录下,随着项目文件数量急速增加,这将是... 查看详情

centos系统启动流程之grub

系统启动之GRUBGRUB(BootLoader)从系统启动流程可以得知,在BIOS读取相关信息之后,接下来是去第一个可以启动的设备当中的MBR中读取BootLoader信息,BootLoader提供具有菜单功能、直接加载内核信息,以及相关的控制权转交功能。所... 查看详情

内核配置裁剪及启动流程(代码片段)

...、内核分析之配置三、内核分析之Makefile四、内核分析之启动过程一、内核分析之编译初体验1.解压缩2.配置内核的配置有三种方法(1)直接执行makemenuconfig,从头到尾每一条都自己配置,有成千上万的配置项,... 查看详情

hi3516开发笔记:hi3516虚拟机编译ubootkernelroofts和userdata以及分区表(代码片段)

...dn.net/article/details/121572767红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…海思开发专栏上一篇:《Hi3516开发笔记(... 查看详情

stm32-gpio输入输出之按键检测点亮led(代码片段)

....h、bsp_key.c、main.c  1、bsp_led.h1#ifndef__BSP_LED_H//条件编译,如果没有定义这个宏,向下执行;如果已经定义则不向下执行,结束条件编译。2#define__BSP_LED_H//没有定义,则定义该宏。当下次该头文件被编译时 查看详情

app开发流程之数据持久化和编译静态链接库

先记录数据持久化。iOS客户端提供的常用数据持久化方案:NSUserDefaults代表的用户设置,NSKeydArchiver代表的归档,plist文件存储,SQLite数据库(包括上层使用的CoreData,FMDB)。每种方案都有各自的应用场景和范围,不能一概而论。... 查看详情

activiti自己定义流程之spring整合activiti-modeler实例:启动流程

1.启动流程并分配任务是单个流程的正式開始,因此要使用到runtimeService接口。以及相关的启动流程的方法。我习惯于用流程定义的key启动,由于有多个版本号的流程定义时,用key启动默认会使用最新版本号。同一时候,由于启... 查看详情

hi3516开发笔记:hi3516虚拟机编译ubootkernelroofts和userdata以及分区表(代码片段)

...6,WX:yangsir198808红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…海思开发专栏上一篇:《Hi3516开发笔记(... 查看详情

hivesql源码之语法词法编译文件解析一文详解(代码片段)

目录前言一、HiveSQL编译流程二、Antrl三、ANTLRWorks参阅前言工欲善其事必先利其器,首先要了解HiveSQL的编译语法的流程,还是需要懂得HiveSQL的执行流程以及编译规则。曾经在Hive数仓搭建的时候写过部分HiveSQL编译原理࿱... 查看详情

prince2科普prince2七大流程之启动流程

今天学习七大流程之《项目启动流程》目的:是为项目建立坚实的基础,使组织在承诺大笔投入之前,能够了解为了交付项目产品需要完成的工作。一共有八个活动:1、准备风险管理战略:描述了应用风险管理的目标、使用的... 查看详情

流程引擎之camunda开发记录(七)从中间节点开启实例

参考技术A通过节点ID启动与通过连线ID启动有什么区别?实际项目中连线可以配置执行监听器,走连线可以触发监听器1、从节点之前开启2、从连线处开启3、从节点之后开启4、跳过监控 查看详情