关于linux kernel编译的几项关键点:
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是一样的。
下图说明了这些产物之间的关系:
-------> vmlinux ------------------> ----------> -------------> ------------------->
64B header
zImage(bzImage)------------> uImage
关于linux kernel编译的几项关键点:相关推荐
- Linux kernel编译时编译选项多选一如何固化在config文件
每次在进行裁剪的Linux kernel编译时,都会碰到有提示,让你在某些编译选项多选一,如: Initialize kernel stack variables at function entry ...
- Linux kernel编译、安装及指定默认内核版本启动
内容转自: https://blog.csdn.net/weixin_41666796/article/details/96434229 https://blog.mtkfan.com/post-43 ...
- linux内核makefile详解,linux kernel编译Makefile和Kconfig,make menuconfig详解
Sam需要看看2.6 kernel中USB Mouse的代码.顺便谈谈Kernel中Makefile和Kconfig文件的关系以及配合使用. 背景知识: 背景知识一:Kconfig介绍: 在#make ...
- Linux kernel 编译问题记录【转】
本文转载自:http://sunyongfeng.com/201701/programmer/linux/kernel_compile_fail.html 编译内核出现以下错误 Can't use ' ...
- linux kernel编译 undefined reference to `__ae
问题代码 ktime_t calltime, delta, rettime;unsigned long long duration;calltime = ktime_get();/*获取当前时间*/ ...
- Android内核开发 Goldfish Linux Kernel编译及安卓虚拟机测试
本文出处: http://blog.csdn.net/leytton/article/details/52736549 1.配置交叉编译环境 作者用的是android-ndk的/交叉编译工具 方法一: ...
- Linux kernel 编译 exfat.ko ntfs.ko 来支持exFat 和 NTFS 分区
项目需求想让设备支持 exFat 和 NTFS 的文件格式. 默认的内核是不支持的,因为内核要限定1.5M之内, 所以很多东西都裁剪掉了. 而且不是所有项目都有这个需求,所以就需要编译为 ko ,按需 ...
- g++ linux 编译开栈_使用 linux kernel +busybox 定制linux系统
写在开头: 本来是想使用linux kernel +busybox 制作一个教程的,后来快要结束的时候,死活找不到硬盘,我了解很多文章都有类似的,但是没有谈到硬盘找不到问题,最后历经艰辛,终于把问题解 ...
- 【学习札记NO.00004】Linux Kernel Pwn学习笔记 I:一切开始之前
[学习札记NO.00004]Linux Kernel Pwn学习笔记 I:一切开始之前 [GITHUB BLOG ADDR](https://arttnba3.cn/2021/02/21/NOTE-0 ...
最新文章
- 6 关于数据仓库维度数据处理的方法探究系列——缓慢变化维处理——记录最新记录及上一次历史...
- 不带头结点链表,尾部插入法创建
- 2002年呼伦贝尔之行照片
- MATLAB 批量改文件名称
- Azure手把手系列 4:深入了解Azure 一块钱当三块用
- 烦人的幻灯片(信息学奥赛一本通-T1395)
- AS3程序性能优化建议
- iperf详细使用方法
- OCJP之Console
- 小米电视刷android系统升级,MIUI 7 升级到 Android M!最近就折腾小米了!
- TAP-Win32 Adapter OAS“的网络适配器删除后总是出现(kms激活器及win10激活)
- spring诸如方式_一个简单的步进器,具有诸如下一步,返回和结束之类的简单动作,可以执行简单的表格
- PHP微信扫码关注公众号并授权登录源码
- Android兼容8.0后APP图标变为原生小机器人图标
- python模拟登陆遇到重定向_Python requests jira登录302重定向
- 论文解读4 STRM《Spatio-temporal Relation Modeling for Few-shot Action Recognition》少镜头动作识别 CVPR2022
- CSS学习,Pixy图像翻转和CSS精灵
- 2022级sdut知到/智慧树---c语言第三章测试题解
- Skywalking内置Tags
- 暑期实习|转行|宝洁供应链训练营面经