Arm结构下 kernel是如何编译出zImage的。

发布者:游走人间最新更新时间:2016-06-22 来源: eefocus关键字:Arm结构  kernel  zImage 手机看文章 扫描二维码
随时随地手机看文章
make -f scripts/Makefile.build obj=arch/arm/boot MACHINE=arch/arm/mach-s3c6400/ arch/arm/boot/zImage

先是将vmlinux的某些段去掉了,生成了Image,比如.comment。

arm-linux-objcopy -O binary -R .note -R .note.gnu.build-id -R .comment -S  vmlinux arch/arm/boot/Image
  Kernel: arch/arm/boot/Image is ready

 

然后用gzip压缩Image,成为piggy.gz。

gzip -f -9 < arch/arm/boot/compressed/../Image > arch/arm/boot/compressed/piggy.gz
  GZIP    arch/arm/boot/compressed/piggy.gz

 

这个生成piggy.o这么长?先是从piggy.S编译出来一个piggy.o。

arm-linux-gcc -Wp,-MD,arch/arm/boot/compressed/.piggy.o.d  -nostdinc -isystem

/home/wyang2/test/usr/local/arm/4.4.1/bin/../lib/gcc/arm-none-linux-gnueabi/4.4.1/include -D__KERNEL__ -Iinclude  -I/home/wyang2/test/linux-2.6.28.6/arch/arm/include -include include/linux/autoconf.h -mlittle-endian

-Iarch/arm/mach-s3c6400/include -Iarch/arm/mach-s3c6410/include -Iarch/arm/plat-s3c64xx/include

-Iarch/arm/plat-s3c/include -D__ASSEMBLY__ -mabi=aapcs-linux -mno-thumb-interwork -D__LINUX_ARM_ARCH__=6 -march=armv6k -mtune=arm1136j-s -msoft-float -gdwarf-2  -Wa,-march=all   -c -o arch/arm/boot/compressed/piggy.o arch/arm/boot/compressed/piggy.S

 AS      arch/arm/boot/compressed/piggy.o

话说我一直没找到piggy.o和piggy.gz的关系,原来在piggy.S文件里面。它把整个piggy.gz包含进去了,嚣张啊。


.section .piggydata,#alloc

.globl input_data

input_data:

.incbin "arch/arm/boot/compressed/piggy.gz"

.globl input_data_end

input_data_end:
下面是编译head.o, 没有看出有什么特别的地方
arm-linux-gcc -Wp,-MD,arch/arm/boot/compressed/.head.o.d -nostdinc -isystem 

/home/wyang2/test/usr/local/arm/4.4.1/bin/../lib/gcc/arm-none-linux-gnueabi/4.4.1/include -D__KERNEL__ 
-Iinclude -I/home/wyang2/test/linux-2.6.28.6/arch/arm/include -include include/linux/autoconf.h 
-mlittle-endian -Iarch/arm/mach-s3c6400/include -Iarch/arm/mach-s3c6410/include -Iarch/arm/plat-s3c64xx/include 
-Iarch/arm/plat-s3c/include -D__ASSEMBLY__ -mabi=aapcs-linux -mno-thumb-interwork 
-D__LINUX_ARM_ARCH__=6 -march=armv6k -mtune=arm1136j-s -msoft-float -gdwarf-2 -Wa,-march=all 
-c -o arch/arm/boot/compressed/head.o arch/arm/boot/compressed/head.S
AS arch/arm/boot/compressed/head.o

下面是编译misc.o 这个老长了
arm-linux-gcc -Wp,-MD,arch/arm/boot/compressed/.misc.o.d -nostdinc -isystem 

/home/wyang2/test/usr/local/arm/4.4.1/bin/../lib/gcc/arm-none-linux-gnueabi/4.4.1/include 

-D__KERNEL__ -Iinclude -I/home/wyang2/test/linux-2.6.28.6/arch/arm/include 

-include include/linux/autoconf.h -mlittle-endian -Iarch/arm/mach-s3c6400/include 

-Iarch/arm/mach-s3c6410/include -Iarch/arm/plat-s3c64xx/include -Iarch/arm/plat-s3c/include

-Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common 

-Werror-implicit-function-declaration -Os -marm -fno-omit-frame-pointer -mapcs -mno-sched-prolog 
-mabi=aapcs-linux -mno-thumb-interwork -D__LINUX_ARM_ARCH__=6 -march=armv6k -mtune=arm1136j-s 
-msoft-float -Uarm -Wframe-larger-than=1024 -fno-stack-protector -fno-omit-frame-pointer 

-fno-optimize-sibling-calls -g -Wdeclaration-after-statement -Wno-pointer-sign -fpic -fno-builtin -Dstatic= 

-D"KBUILD_STR(s)=#s" -D"KBUILD_BASENAME=KBUILD_STR(misc)" -D"KBUILD_MODNAME=KBUILD_STR(misc)" 

-c -o arch/arm/boot/compressed/misc.o arch/arm/boot/compressed/misc.c
;

CC arch/arm/boot/compressed/misc.o

根据head.o piggy.o misc.o 编译成 compressed/vmlinux

 arm-linux-ld -EL    --defsym zreladdr=0x50008000 --defsym params_phys=0x50000100 -p --no-undefined -X /usr/local/arm/4.4.1/bin/../lib/gcc/arm-none-linux-gnueabi/4.4.1/libgcc.a -T arch/arm/boot/compressed/vmlinux.lds arch/arm/boot/compressed/head.o arch/arm/boot/compressed/piggy.o arch/arm/boot/compressed/misc.o -o arch/arm/boot/compressed/vmlinux 
  LD      arch/arm/boot/compressed/vmlinux


#@make -f scripts/Makefile.build obj=arch/arm/boot/compressed arch/arm/boot/compressed/vmlinux

用vmlinux去掉一些符号,生成了 zImage。

arm-linux-objcopy -O binary -R .note -R .note.gnu.build-id -R .comment -S  arch/arm/boot/compressed/vmlinux arch/arm/boot/zImage

关键字:Arm结构  kernel  zImage 引用地址:Arm结构下 kernel是如何编译出zImage的。

上一篇:ARM架构下添加系统调用与32位x86区别
下一篇:ARM架构下LDR、STR、MOV和伪指令LDR指令理解

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

ARM汇编语言的程序结构
一个ARM汇编语言源程序的基本结构: AREA Init, CODE, READONLY ENTRY     Start   LDR R0, =0x3FF5000   LDR R1, 0xFF   STR R1,   LDR R0, =0x3FF5008   LDR R1, 0x01   STR R1,   ... ... ... ... ... ...   END   在 ARM( Thumb)汇编语言程序中,以程序段为单位组织代码。   段是相对独立的指令或数据序列,具有特定的名称。段可以分为代码段和数据段,代码段的内容为执行代码,数据段存放代码运行时需要用到的数据。一个汇编程序至少应该有一个代码段,当程序较长时,
[单片机]
[linux kernel] 内核下RX8025对接系统时钟
系统版本:Ubuntu18.04-64 编译器版本:gcc version 7.4.0 (Ubuntu/Linaro 7.4.0-1ubuntu1~18.04.1) uboot版本:2018.07 -linux4sam_6.0 板子型号:at91sama5d3x-xplained MCU型号:sama5d36 RTC型号:RX8025T RX8025T时钟芯片解读 RX8025T和RX8025SA有点区别,主要是时间寄存器的移位上面有差异; 属于爱普生公司的设计,EPSON,这个信息对于内核查找对应的驱动很有帮助。 一、启动板子查看内核启动信息 系统时钟的rtc,从打印信息可以看出,是使用
[单片机]
[linux <font color='red'>kernel</font>] 内核下RX8025对接系统时钟
arm Linux系统启动之start_kernel函数
head-common.S ---具体做了哪些动作 ---跳转到init/main.c ---b start_kernel //关于start_kernel的强文深入理解linux内核,第八章 main.c asmlinkage void __init start_kernel(void) { char * command_line; extern struct kernel_param __start___param , __stop___param ; //来设置smp process id,当然目前看到的代码里面这里是空的 smp_setup_processor_id(); /* * Need to r
[单片机]
GNU ARM汇编--(十六)bootloader与kernel之间
在 《GNU ARM汇编--(十五)linux下的printascii》 中已经初步分析了自己写的bootloader在引导kernel时候出现的commandline在bootloader和kernel之间传递的问题,今天终于解决了,并对参数传递有一些研究: 传递的参数为: view plain copy params- u1.s.page_size = LINUX_PAGE_SIZE; params- u1.s.nr_pages = (DRAM_SIZE LINUX_PAGE_SHIFT); params- commandline 设定为 noinitrd root
[单片机]
ARM linux解析之zImage镜像文件的生成
最开始做个约定:存放linux代码的根目录我们叫做:linux_src,代码用linux-3.0.46进行分析。对于arm系统,$(SRCARCH) = ARM。 可能你会想,究竟linux如何编译生成它的压缩内核镜像zImage的呢?哈哈,下面就来做个解析。 当我们在linux_src目录下输入命令: make zImage 就会进入linux_src/makfile,然后找 zImage目标,这个目标在: linux_src/makfile包含的:include $(srctree)/arch/$(SRCARCH)/Makefile 里面, 位于:linux_src/arch/arm/makfile里: zIma
[单片机]
<font color='red'>ARM</font> linux解析之<font color='red'>zImage</font>镜像文件的生成
AT91RM9200Linux移植笔记(三)-移植Linux kernel 2.6.17
手上板子原来自带的是2.4.19的内核, 打算移植新的2.6的内核,从网上下了2.6.17的kernel,下载地址为:http://www.kernel.org/pub/linux/kernel/v2.6/ 修改PATH环境变量或者Makefile文件的CROSS_COMPILE宏,将前面制作好的交叉编译工具链路径添加进来,同时需要下载针对AT91rm9200的patch包, 2.6.17-at91.patch.gz, 下载地址是http://maxim.org.za/AT91RM9200/2.6/ $ tar zxvf linux-2.6.17.tar.gz $ cp 2.6.17-at91.patch.gz linux-2.6
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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