1. make参数: CROSS_COMPILE
即交叉编译器的前缀(prefix),也就是选择将代码编译成目标cpu的指令的工具,如指定makeCROSS_COMPILE=arm-none-linux-gnueabi-就是使用arm-none-linux-gnueabi-gcc,arm-none-linux-gnueabi-ld等工具将代码编译成arm的可执行指令。如果不指定CROSS_COMPILE参数,make时将认为prefix为空,即使用gcc来编译。

2.make参数: ARCH
即architecture,就是选择编译哪一种cpuarchitecture,也就是编译arch/目录下的哪一个子目录。如指定makeARCH=arm就是编译arch/arm下的代码。如果不指定,make将使用本机(用什么机器编译就是什么)的cpu作为缺省ARCH.注意:arch/arm下不但有arm体系架构特有的代码,还有arm特有的kconfig,也就是配置选项,所以在makemenuconfig,make xxxx_defconfig的时候也必须指定ARCH=arm。

3. Configure& make kernel 的基本步骤
以编译arm versatile为利:

step 1:
make mrproper
清除所有上次编译产生的文件和.config文件。

step 2:
make ARCH=arm versatile_defconfig
使用arch/arm/configs/versatile_defconfig文件的配置,versatile_defconfig的内容将被copy到.config中。.config文件是将用户选好的编译选项保存下来,make时读取.config中的选项来编译kernel。注意:必须指定ARCH=arm,否则make会到arch/i386/configs下去找versatile_defconfig。正如前面2.ARCH中所述不指定ARCH的话,将使用本机(i386)的ARCH作为缺省ARCH。

step 3:
make ARCH=arm menuconfig
启动图形界面来作手工配置刚此生成的.config文件。此处也必须指定ARCH=arm,否则不会load刚才生成的ARCH=arm的.config.
修改配置后保存退出。

step 4:
make -j4 ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
编译生成kernel image,arm的kernel image存放在arch/arm/boot/zImage.'-j4'的作用是启动4线程编译。

4.Kernel编译生成产物:

vmlinux:
位于kernel源代码的根目录下。vmlinux是virtual memory linuxkernel.它是一个elf文件(executable & linkingformat),未压缩,其中包含所有的symbol,comments。可用arm-none-linux-gnueabi-readelf来读取其中的信息。

zImage(bzImage):
位于arch/arm/boot/下,是将vmlinux去除了symbol, comment后,添加了一段初始化代码,然后用gzip压缩,最后加上一小段mini gunzip代码(用于load后解压缩)而成的。bzImage是bigzImage。zImage适用于小内核,如果kernel较大,应该用bzImage.

uImage:
位于arch/arm/boot/下,被uboot引导的kernel image。缺省状态下不会被编译出来,需要makeuImage才会被编译。uImage实在zImage上加上一个64bytes的“header”,用来告诉uboot这个Image的大小等。
所以用hexdump可以看出,uImage从第64byte开始和zImage是完全一样的。

System.map:
这是整个kernelImage中symbol与address的对应表。用vi打开即可看到。实际上在make的最后会用arm-none-linux-gnueabi-nm来读取vmlinuxelf文件,从而生成System.map。只要运行arm-none-linux-gnueabi-nm -n vmlinux> tmp.map就会发现tmp.map和System.map是一样的。

下图说明了这些产物之间的关系:

make            - symbol, comment  + init code gzip compress   + mini gunzipheader
-------> vmlinux ------------------> ----------> -------------> ------------------->

64B header
zImage(bzImage)------------>  uImage

关于linux kernel编译的几项关键点:相关推荐

  1. Linux kernel编译时编译选项多选一如何固化在config文件

    每次在进行裁剪的Linux kernel编译时,都会碰到有提示,让你在某些编译选项多选一,如: Initialize kernel stack variables at function entry ...

  2. Linux kernel编译、安装及指定默认内核版本启动

    内容转自: https://blog.csdn.net/weixin_41666796/article/details/96434229 https://blog.mtkfan.com/post-43 ...

  3. linux内核makefile详解,linux kernel编译Makefile和Kconfig,make menuconfig详解

    Sam需要看看2.6 kernel中USB Mouse的代码.顺便谈谈Kernel中Makefile和Kconfig文件的关系以及配合使用. 背景知识: 背景知识一:Kconfig介绍: 在#make ...

  4. Linux kernel 编译问题记录【转】

    本文转载自:http://sunyongfeng.com/201701/programmer/linux/kernel_compile_fail.html 编译内核出现以下错误 Can't use ' ...

  5. linux kernel编译 undefined reference to `__ae

    问题代码 ktime_t calltime, delta, rettime;unsigned long long duration;calltime = ktime_get();/*获取当前时间*/ ...

  6. Android内核开发 Goldfish Linux Kernel编译及安卓虚拟机测试

    本文出处: http://blog.csdn.net/leytton/article/details/52736549 1.配置交叉编译环境 作者用的是android-ndk的/交叉编译工具 方法一: ...

  7. Linux kernel 编译 exfat.ko ntfs.ko 来支持exFat 和 NTFS 分区

    项目需求想让设备支持 exFat 和 NTFS 的文件格式. 默认的内核是不支持的,因为内核要限定1.5M之内, 所以很多东西都裁剪掉了. 而且不是所有项目都有这个需求,所以就需要编译为 ko ,按需 ...

  8. g++ linux 编译开栈_使用 linux kernel +busybox 定制linux系统

    写在开头: 本来是想使用linux kernel +busybox 制作一个教程的,后来快要结束的时候,死活找不到硬盘,我了解很多文章都有类似的,但是没有谈到硬盘找不到问题,最后历经艰辛,终于把问题解 ...

  9. 【学习札记NO.00004】Linux Kernel Pwn学习笔记 I:一切开始之前

    [学习札记NO.00004]Linux Kernel Pwn学习笔记 I:一切开始之前 [GITHUB BLOG ADDR](https://arttnba3.cn/2021/02/21/NOTE-0 ...

最新文章

  1. linux php 如何停止,如何关闭linux
  2. c++调用求平方根函数_如何使用java语言求一个正整数的平方根?(不使用库函数)...
  3. resultmap拿不到数据_英雄联盟S10:半决赛数据告诉你huanfeng有多强
  4. easyui和My97DatePicker结合使用报“权限错误”的问题
  5. Windwos命令工作笔记002---windows下tree命令列出文件目录打印到文件中_过滤文件不知道怎么做啊
  6. mysql 表间关联查询
  7. 请问大家,有没有法学相关的毕业论文选题 ?
  8. 腾讯是如何一刀刀,在15年间干死那些竞争对手的?! (zz)
  9. 2018 Google IO
  10. 十大宽带共享组建网络方式推荐
  11. PCB EMC设计中的一些基本原则
  12. 用友通新建账套显示不能登入到服务器,用友通打不开,出现登录失败
  13. 多叉树的构建和树的高度的计算
  14. Angular入门到精通系列教程(5)- 第三方UI库(Angular Material)
  15. Arduino基础篇(七)-- 如何使用DS18B20数字温度传感器(基于OneWire和DallasTemperature库)
  16. Ceph _backfill and recovery 之间的不同以及 peering理解
  17. ZLG7290应用注意事项及检测步骤
  18. 大牛证券这周操作及方向看这里
  19. 【解决报错问题:selenium.common.exceptions.WebDriverException: Message: An unknown server-side error occurr】
  20. 人头检测算法,人流量统计,人头计数,人员聚集分析,人脸测温

热门文章

  1. Ubuntu18.04 Flutter开发环境搭建
  2. 经典算法题:字典树、并查集、单调栈、二分、带标记函数dp、树、全排列、字符串问题等常用算法
  3. Java 中 this 和 super 的用法总结
  4. 什么是框架?spring mvc框架
  5. 没有android:padding属性,android自定义无上下padding的textview
  6. c# 标准正太分布函数_数据标准化处理中的min-max和zscore
  7. 数据结构与算法实战-C++实现
  8. [NLP] 相对位置编码(二) Relative Positional Encodings - Transformer-XL
  9. bzoj 4016: [FJOI2014]最短路径树问题
  10. steelray project viewer