Arm Linux Kernel 构建 情景分析

发布者:huijiazi5210最新更新时间:2016-06-16 来源: eefocus关键字:Arm  Linux  Kernel  情景分析 手机看文章 扫描二维码
随时随地手机看文章

概述

构建一个内核,一般是先配置,后编译。这里以构建 Nexus5 内核为例,代号为 hammerhead。

配置

通常做法是以厂商预置的配置为基础,根据自己需要进行配置。命令:
make ARCH=arm hammerhead_defconfig

 

 
执行完毕后,"arch/arm/configs/hammerhead_defconfig" 文件会被到 ".config" ,作为默认配置。
然后运行以下命令根据自己需要进行配置:
make ARCH=arm menuconfig

 

编译

通常,需要生成 zImage 和 内核模块。如果不指定目标,这两个都会默认生成。命令:
  1. # CROSS_COMPILE 的值根据自己情况设定
    make ARCH=arm CROSS_COMPILE=arm-linux-androideabi-

     

这条命令做了什么呢,把 make 输出到控制台的信息贴出来(省略中间相似的信息):
make ARCH=arm CROSS_COMPILE=arm-linux-androideabi- CONFIG_DEBUG_SECTION_MISMATCH=y
scripts/kconfig/conf --silentoldconfig Kconfig
WRAP arch/arm/include/generated/asm/auxvec.h
WRAP arch/arm/include/generated/asm/bitsperlong.h
WRAP arch/arm/include/generated/asm/cputime.h
...
WRAP arch/arm/include/generated/asm/siginfo.h
WRAP arch/arm/include/generated/asm/sizes.h
CHK include/linux/version.h
UPD include/linux/version.h
CHK include/generated/utsrelease.h
UPD include/generated/utsrelease.h
Generating include/generated/mach-types.h
CC kernel/bounds.s
GEN include/generated/bounds.h
CC arch/arm/kernel/asm-offsets.s
GEN include/generated/asm-offsets.h
CALL scripts/checksyscalls.sh
HOSTCC scripts/dtc/checks.o
HOSTCC scripts/dtc/data.o
...
HOSTCC scripts/conmakehash
HOSTCC scripts/recordmcount
CC init/main.o
CHK include/generated/compile.h
UPD include/generated/compile.h
CC init/version.o
CC init/do_mounts.o
CC init/do_mounts_rd.o
CC init/do_mounts_initrd.o
LD init/mounts.o
CC init/initramfs.o
CC init/calibrate.o
LD init/built-in.o
...
AR lib/lib.a
LD vmlinux.o
MODPOST vmlinux.o
GEN .version
CHK include/generated/compile.h
UPD include/generated/compile.h
CC init/version.o
LD init/built-in.o
LD .tmp_vmlinux1
KSYM .tmp_kallsyms1.S
AS .tmp_kallsyms1.o
LD .tmp_vmlinux2
KSYM .tmp_kallsyms2.S
AS .tmp_kallsyms2.o
LD vmlinux
SYSMAP System.map
SYSMAP .tmp_System.map
OBJCOPY arch/arm/boot/Image
Kernel: arch/arm/boot/Image is ready
AS arch/arm/boot/compressed/head.o
GZIP arch/arm/boot/compressed/piggy.gzip
AS arch/arm/boot/compressed/piggy.gzip.o
CC arch/arm/boot/compressed/misc.o
CC arch/arm/boot/compressed/decompress.o
CC arch/arm/boot/compressed/string.o
AS arch/arm/boot/compressed/lib1funcs.o
AS arch/arm/boot/compressed/ashldi3.o
LD arch/arm/boot/compressed/vmlinux
OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready
DTC arch/arm/boot/msm8974-hammerhead-rev-11.dtb
DTC arch/arm/boot/msm8974-hammerhead-rev-11j.dtb
DTC arch/arm/boot/msm8974-hammerhead-rev-10.dtb
DTC arch/arm/boot/msm8974-hammerhead-rev-c.dtb
DTC arch/arm/boot/msm8974-hammerhead-rev-b.dtb
DTC arch/arm/boot/msm8974-hammerhead-rev-bn.dtb
DTC arch/arm/boot/msm8974-hammerhead-rev-a.dtb
DTC arch/arm/boot/msm8974-hammerhead-rev-f.dtb
CAT arch/arm/boot/zImage-dtb
Kernel: arch/arm/boot/zImage-dtb is ready
make[1]:没有什么可以做的为`arch/arm/boot/dtbs'。

 

 
简单分析一下,大致做了这么几件事情:
  1. 根据配置信息,生成了一些头文件
  2. 编译了一些小工具
  3. 根据配置信息,有选择性地编译一些源码,将输出的 obj 链接成对应的 built-in.o
  4. 生成符号表文件
  5. 将所有的 built-in.o 和符号表链接成内核 vmlinux
  6. 使用 BOJCOPY 从 vmlinux 生成 Image
  7. 生成压缩过的内核 arch/arm/boot/compressed/vmlinux
  8. 使用 OBJCOPY 从 压缩过的内核 vmlinux 生成 zImage
  9. 生成 dtb(device tree blob)
  10.  将 zImage 和 dtb 连接成一个文件:zImage-dtb
而我们最终需要的文件就是 zImage-dtb(注意:这里没有生成内核模块,因为所有的内核功能都被配置为 built-in ,编译进 zImage-dtb 了)。

要点分析

       内核配置和编译,依靠的是 make 和 kbuild 系统。无论是 make 还是 kbuild,都只是工具,我们并不一定要完全弄清其内部工作原理,只需要熟悉和工作相关的部分即可。
       这里涉及到的有如下几点:
  • vmlinux 的构建过程
  • arch/arm/boot/compressed/vmlinux 的构建过程
  • 源码是如何选择性地参与内核的构建的
       之所以要分析 vmlinux 和 arch/arm/boot/compressed/vmlinux ,是因为这个两个文件是最原始的两个可执行文件:Image 由 vmlinux 生成;zImage 由 arch/arm/boot/compressed/vmlinux 生成。分析这连个文件的生成,还有助于分析 linux 内核的启动过程。

基础

       vmlinux 是 makefile 中的一个目标。makefile 中的规则定义了目标和源码的关系,命令则定义了如何由源码生成目标,变量起辅助作用。规则、命令和变量是 makefile 的三大要素。理清 makefile 规则中定义的依赖关系是分析构建过程的关键。涉及到的几个重要文件:
Makefile
arch/arm/Makefile
arch/arm/boot/Makefile
arch/arm/mach-msm/Makefile.boot
arch/arm/compressed/Makefile


 

       vmlinux 是一个可执行程序,其链接过程必然涉及的链接脚本,链接脚本是做什么的?看看 ld 手册中的描述:
Arm Linux Kernel 构建 情景分析
通过 lds 文件,我们至少可以知道一个可执行程序的入口在哪里。
这里又要涉及到几个重要文件:
 
# 对应 vmlinux
arch/arm/kernel/vmlinux.lds


# 对应 /arch/arm/boot/compressed/vmlinux
arch/arm/boot/compressed/vmlinux.lds

 

       vmlinux 是一个可执行程序,由源码编译、链接而来。那么是哪些源码参与了构建过程,又是如何控制这些源码参与的?后面会分析。
        为了分析 makefile,这里借用了 UML 的概念。
        用 包 表示 makefile 文件;用 类 表示 目标和文件;用类间依赖表示目标的依赖;用组合表示变量的定义。
       下面是一个总图,表明了各个目标之间的依赖关系:
(红色边框是可执行程序,蓝色边框是对应的链接脚本)
Arm Linux Kernel 构建 情景分析
vmlinux 的构建过程

和 lds 文件的关系

​依赖链:
_all->all->vmlinux->$(vmlinux-lds)=arch/arm/kernel/vmlinux.lds

从 _all 到 all:

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

KBUILD_EXTMOD 只有在内核树外编译内核模块的时候才会定义 M 变量,从而给其赋值,否则为空,这里为空。

从 all 到 vmlinux:
all: vmlinux

 

 
从 vmlinux 到 $(vmlinux-lds):
vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) vmlinux.o $(kallsyms.o) FORCE

 

 
$(vmlinux-lds) 定义:
 
vmlinux-lds := arch/$(SRCARCH)/kernel/vmlinux.lds

 

和源码的关系

​依赖链:
 
_all->all->vmlinux->$(vmlinux-init)+$(vmlinux-main)

 

看看这个:
 
# vmlinux
# ^
# 
# +-< $(vmlinux-init)
#  +--< init/version.o + more
# 
# +--< $(vmlinux-main)
#  +--< driver/built-in.o mm/built-in.o + more
# 
# +-< kallsyms.o (see description in CONFIG_KALLSYMS section)

 

关键部分上面已经列出,这里再次列出来:
 
vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) vmlinux.o $(kallsyms.o) FORCE

 

那么 $(vmlinux-init) 连个变量是什么呢?通过分析,第一次展开后为:“$(head-y) $(init-y)”。没有找到 $(head-y),而 $(init-y) 最终展开为:init/built-in.o。
       到这里有点眉目了(回头看看 make 过程输出的信息,里面有大量的 built-in.o)。可以说是众多的 built-in.o构成了vmlinux。所以 vmlinux 和源码的关系转变成了 built-in.o 和源码的关系。
       还是看 make 的输出信息:
 
CC init/version.o
CC init/do_mounts.o
CC init/do_mounts_rd.o
CC init/do_mounts_initrd.o
LD init/mounts.o
CC init/initramfs.o
CC init/calibrate.o
LD init/built-in.o

 

可以推测:init/built-in.o 是由 init 目录下的 源码编译、链接而成。在 init 目录下发现 Makefile:
 
obj-y := main.o version.o mounts.o
ifneq ($(CONFIG_BLK_DEV_INITRD),y)
obj-y += noinitramfs.o
else
obj-$(CONFIG_BLK_DEV_INITRD)+= initramfs.o
endif
obj-$(CONFIG_GENERIC_CALIBRATE_DELAY)+= calibrate.o

mounts-y := do_mounts.o
mounts-$(CONFIG_BLK_DEV_RAM)+= do_mounts_rd.o
mounts-$(CONFIG_BLK_DEV_INITRD)+= do_mounts_initrd.o
mounts-$(CONFIG_BLK_DEV_MD)+= do_mounts_md.o

 

有内核开发经验的开发者应该知道,赋值到 obj-y 的目标会被编译进 vmlinux,至于是如何控制的,推测 kbuild 系统是有参与的,这属于 make 和 kubild 的内部原理,这里不分析了,知道有这么回事,会用就行了。$(CONFIG_BLK_DEV_INITRD) 等变量在 .config(没错,就是保存内核配置的文件) 文件中定义:
 
CONFIG_RELAY=y
CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_SOURCE=""

 

这里 vmlinux 和源码的关系就搞清了,是由 built-in.o 来当中间人的:
 
vmlinux<->built-in.o<->*.c

 

和符号表的关系

略。

arch/arm/boot/comressed/vmlinux 的构建过程

有了分析 vmlinux 的基础,分析压缩过的 vmlinux 就容易了。看 规则:
 
$(obj)/vmlinux: $(obj)/vmlinux.lds $(obj)/$(HEAD) $(obj)/piggy.$(suffix_y).o \
$(addprefix $(obj)/, $(OBJS)) $(lib1funcs) $(ashldi3) FORCE
@$(check_for_multiple_zreladdr)
$(call if_changed,ld)
@$(check_for_bad_syms)

 

参与压缩过的 vmlinux 的构建过程的主要有三类文件:
  • 链接脚本:arch/arm/boot/compressed/vmlinux.lds
  • 解压代码:arch/arm/boot/compressed/ 下的源码
  • 压缩的数据:压缩的 Image(由未经压缩的 vmlinux 生成)
因为解压缩功能和内核开发关系不大,就不具体分析了。
 
关键字:Arm  Linux  Kernel  情景分析 引用地址:Arm Linux Kernel 构建 情景分析

上一篇:Android arm linux kernel启动流程二
下一篇:ARM 的Thumb状态测试

推荐阅读最新更新时间:2024-03-16 14:57

基于Android的ARM汇编语言系列之六:NEON指令集与VFP指令集
章节列表 之一:ARM汇编语言开篇 之二:C/C++程序生成ARM汇编程序的过程分析 之三:ARM汇编语言程序结构 之四:ARM处理器的寻址方式 之五:ARM指令集与Thumb指令集 之六:NEON指令集与VFP指令集 NEON指令集与VFP指令集是ARM指令集的扩展,多用于多媒体编程和浮点运算。 一 Android平台使用NEON指令集与VFP指令集 Android NDK从r3版本开始也添加了对NEON指令集与VFP指令集的支持。使用方法如下所示: 1 运行时检测处理器是否支持NEON指令集与VFP指令集 Android NDK提供了一个cpufeatures的库来让开发者在运行时检测处理器是否支持NE
[单片机]
英特尔平板用Broadwell-Y处理器能憾动ARM
      近来,英特尔下一代处理器Broadwell的各种消息层出不穷。据悉,Broadwell预计将于明年下半年发布。与Haswell一样,Broadwell分为三大系列,其中,Broadwell-D用于台式电脑,Broadwell-U对应超极本。而让我们最感兴趣的是,则是面向平板电脑的Broadwell-Y处理器。   众所周知,在处理器芯片的研发过程中,英特尔一直遵循着所谓的“Tick-Tock”战略发展模式。 “Tick-Tock”源于时钟秒针行走时所发出的声响。英特尔表示,每一次“Tick”代表着代表着在上一代晶片制程的基础上,更新微处理器架构,提升效能;而每一次“Tock”,则意味着处理器晶片制程的更新,意在处理器效能
[嵌入式]
arm linux交叉编译工具的安装
(1)工具的下载 http://www.codesourcery.com/sgpp/lite/arm/portal/release1293 or IA32 GNU/Linux TAR。 目前工具的名称为arm-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 (2)把下载的压缩包拷贝到ubuntu里。比如我copy的地址为/share/toolchain,此文件夹也作为安装目录。 然后在终端进行如下输入 $ cd /share/toolchain $ tar xvjf arm-2010q1-202-arm-none-linux-gnueabi-i686-pc
[单片机]
Azure ARM (13) 从现有VHD文件,创建新的ARM VM
  本文参考了Git Hub的ARM Template:    https://github.com/Azure/azure-quickstart-templates/blob/master/201-vm-specialized-vhd-existing-vnet/azuredeploy.json   但是Git Hub上的Template不包含Availability Set   笔者修改了这个Template,可以设置高可用集Availability Set:    https://github.com/leizhang1984/AzureChinaPowerShell/tree/master/ARM/VMSpecial
[单片机]
Azure <font color='red'>ARM</font> (13) 从现有VHD文件,创建新的<font color='red'>ARM</font> VM
基于ARM的11种嵌入式操作系统大盘点
1、Android    Android 是一个包括操作系统,中间件以及一些重要应用程序的专门针对移动设备的层次结构的软件集。Android 作为一个完全开源的操作系统,是由操作系统Linux、中间件以及核心应用程序组成的软件栈。通过 android SDK 提供的 API 以及相应的开发工具, 程序员可以很方便的开发android平台上的应用程序。其整个系统由应用程序,应用程序框架,应用程序库,Android运行库,Linux内核(Linux Kernel)五个部分组成。Android操作系统内置了一部分应用程序, 包括电子邮件客户端、SMS程序、日历、地图、浏览器、通讯录以及其他的程序,值得一提的是这些所有的程序都是用java
[单片机]
研究人员曝光 Linux 发行版 Gentoo 存在重大漏洞,黑客可进行 SQL 注入攻击
7 月 3 日消息,网络安全公司 SonarSource 在日前研究中发现,Gentoo Linux 发行版中存在漏洞 CVE-2023-28424,黑客可以利用该漏洞进行 SQL 注入攻击。 研究人员从 GentooLinux 的 Soko 搜索组件中找到了这个漏洞。该漏洞的 CVSS 风险评分为 9.1,属于特别重大漏洞,GentooLinux 开发团队已经于漏洞曝出 24 小时内进行了修复。 ▲ 图源 SonarSource ▲ 图源 SonarSource 据悉,Soko 组件是一个公共 API,在搜索系统中的软件包时,可以提供更高的效率,并可以进行软件源的错误跟踪和溯源。 ▲ 图源 SonarSource
[嵌入式]
研究人员曝光 <font color='red'>Linux</font> 发行版 Gentoo 存在重大漏洞,黑客可进行 SQL 注入攻击
借助ARM,Xilinx扩展高端嵌入式应用
“高端嵌入式应用目前面临着很多挑战,其中最重要的就是就是性能提升与功耗、成本降低之间的矛盾。”Xilinx全球营销高级副总裁Vin Ratford表示。不过,尽管存在着看似无法逾越的障碍,各大处理器厂商还是会不遗余力的选择进入,毕竟这个市场实在是太诱人了,调查显示,2014年该类产品市场份额将达到 127亿美元。 如果针对某类高端应用来说,市场容量并不是很大,而更强调的是灵活性,可移植性,因此FPGA可以充分发挥其用武之地。 以处理器为核心的FPGA 实际上,早在去年10月份, Xilinx与Altera分别和ARM及MIPS宣布了合作意向 ,而这也标志着会有更多高性能IP被移植入FPGA之中,北京时间4月
[嵌入式]
借助<font color='red'>ARM</font>,Xilinx扩展高端嵌入式应用
Arm 更新 Neoverse 产品路线图,实现基于 Arm 平台的人工智能基础设施
新闻 重点 : Arm 宣布推出两款基于全新第三代 Neoverse IP 构建的新的 Arm Neoverse 计算子系统 Arm Neoverse CSS V3 是高性能 V 系列产品组合中的首款 Neoverse CSS 产品;与 CSS N2 相比,其单芯片性能可提高 50% Arm Neoverse CSS N3 拓展了 Arm 领先的 N 系列 CSS 产品路线图;与 CSS N2 相比,其每瓦性能可提升 20% 在短短四个月内, Arm 全面设计 生态项目已吸引超过 20 家成员加入,并在三家领先的代工厂进行系统级芯片和芯粒设计 Arm 控股有限公司(纳斯达克股票代码:ARM,以下简称“Arm”)今
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved