Linux内核初次编译和源码结构

1.linux内核获取
linux由 linux基金会管理与发布,linux官网为 https://www.kernel.org ,所以若想获取最新的 linux版本就可以在这个网站上下载,网站界面如下图所示:
一般半导体厂商会从 linux内核官网下载某个版本,将其移植到自己的 cpu上,测试成功后就会将其开放给该半导体厂商的 cpu开发者。 开发者下载其提供的 linux内核,然后将其移植到自己的产品上。
本文我们就使用 nxp提供的 linux源码,文件名为:
linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2
2.linux内核初次编译
编译内核之前需要先在ubuntu上安装lzop库,另外,图形化配置工具还需要ncurses库支持,安装命令为:
sudo apt-get install lzopsudo apt-get install build-essential sudo apt-get install libncurses5-dev在ubuntu中新建一个文件夹,然后将linux内核压缩包拷贝到文件夹中并解压,解压命令为:
tar -vxf linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2解压后进入该文件夹,新建一个build.sh脚本文件来编译,脚本中的内容如下:
#!/bin/sh make arch=arm cross_compile=arm-linux-gnueabihf- distclean make arch=arm cross_compile=arm-linux-gnueabihf- imx_v7_mfg_defconfig make arch=arm cross_compile=arm-linux-gnueabihf- menuconfig make arch=arm cross_compile=arm-linux-gnueabihf- all -j16给予该脚本可执行权限,然后运行,编译的时候会弹出linux图形配置界面, 这里不需要做任何的配置, 直接按两下esc键退出图形界面
之后会自动开始编译linux内核,等待编译完成,完成以后如下图所示
编译完成以后就会在arch/arm/boot这个目录下生成一个zimage文件,该文件就是要用的linux镜像文件。 另外也会在arch/arm/boot/dts下生成很多.dtb文件,这些.dtb就是设备树文件
vmlinux、image、zimage、uimage 的区别:
vmlinux是elf格式的文件,是编译出来的最原始的内核文件,编译出来 差不多有16mb,是未压缩的。 在实际中我们不会使用vmlinux,而是使用zimage或uimage这样的 linux 内核镜像文件image是linux内核镜像文件,但是image仅包含可执行的二进制数据。 image就是使用objcopy取消掉vmlinux中的一些其他信息,比如符号表什么的。 但是 image 是没有压缩过的,image保存在arch/arm/boot目录下,其大小大概在12mbzimage是经过gzip压缩后的image,经过压缩以后其大小大概在6mb左右uimage是老版本uboot专用的镜像文件,uimag是在zimage前面加了一个长度为 64字节的“头” ,这个头信息描述了该镜像文件的类型、加载位置、生成时间、大小等信息。 但是新的uboot已经支持了 zimage 启动! 所以已经很少用到uimage了3.linux内核源码结构
linux内核编译过程会生成一些文件,下面来看一下编译前后的内核源码结构,可以看出多出了一些编译文件
编译后的内核源码比未编译的源码多了许多文件,这些文件或文件夹的含义见下表:
上表中很多文件夹和文件可以不需要去关心,要关注的文件夹或文件如下示
arch目录 :和架构有关的目录,比如arm、arm64、avr32、x86等等架构。 每种架构都对应一个目录,在这些目录中又有很多子目录,比如boot、common、configs等等
block目录 :block是linux下块设备目录,像sd卡、emmc、nand、硬盘等存储设备就属于块设备,block目录中存放着管理块设备的相关文件
crypto目录 :存放着加密文件,比如常见的crc、crc32、md4、md5、hash等加密算法
documentation目录 :存放着linux相关的文档,如果要想了解linux某个功能模块或驱动架构的功能,就可以在documentation目录中查找有没有对应的文档
drivers目录 :驱动目录文件,此目录根据驱动类型的不同,分门别类进行整理,比如drivers/i2c就是i2c相关驱动目录,drivers/gpio就是gpio相关的驱动目录,需要重点关注
firmware目录 :此目录用于存放固件
fs目录 :存放文件系统,比如fs/ext2、fs/ext4、fs/f2fs等,分别是ext2、ext4 和 f2fs等文件系统
include目录 :头文件目录
init目录 :存放 linux内核启动的时候初始化代码
ipc目录 :ipc为进程间通信,ipc目录是进程间通信的具体实现代码
kernel目录 :linux 内核代码
lib目录 :lib是库的意思,lib目录都是一些公用的库函
mm目录 :存放内存管理相关代码
net目录 :存放网络相关代码
samples目录 :存放一些示例代码文件
scripts目录 :脚本目录,linux 编译的时候会用到很多脚本文件,这些脚本文件就保存在此目录中
security目录 :存放安全相关的文件
sound目录 :存放音频相关驱动文件,音频驱动文件并没有存放到 drivers目录中,而是单独的目录
tools目录 :存放一些编译的时候使用到的工具
usr目录 :存放与 initramfs 有关的代码
virt目录 :存放虚拟机相关文件
.config文件 :跟 uboot一样,.config保存着 linux最终的配置信息,编译 时候会读取此文件中的配置信息。 最终根据配置信息来选择编译 linux 哪些模块,哪些功能
kbuild文件 :有些 makefile会读取此文件
kconfig文件 :图形化配置界面的配置文件
makefile文件 :linux 顶层 makefile 文件,建议好好阅读一下此文件
readme文件 :此文件详细讲解了如何编译 linux 源码,以及 linux 源码的目录信息

北京君正大力投入AI技术研究,提升芯片AI处理能力
Proteus20个应用技巧
闻泰科技:已全面布局汽车电子业务
3498元vivo X23发布,使用高通骁龙670AIE处理器
超5类网线和6类水晶头能混搭吗?
Linux内核初次编译和源码结构
直扩OQPSK系统载波跟踪的 设计及FPGA实现
中芯国际代工的 14nm 芯片依然借用美国设备和美国技术?
如何使用可编程斜坡发生器外设创建参考信号和时序源
元器件封装(Footprint)的构建
安徽省机器人产业发展联盟在合肥成立
AI医疗公司为何要闯关拿证?这个真有用吗?
2020年的企业网络安全注意事项都有哪些
基于Labview多通道数据采集系统
贴片电容容值怎么看,贴片电容怎么测量电容值
AI芯片的竞争才刚刚开始 2020年将是AI芯片落地正面较量的关键之年
12月中国手机市场最新报告出炉 5G手机出货量达541.4万
骨传导耳机哪个好、最好的骨传导耳机牌子
拔掉插座后USB灯还亮着是什么原因呢?
3D打印金属零件的所有技术