0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

CHANBAEK 来源:嵌入式攻城狮 作者:安迪西 2023-04-19 11:20 次阅读

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 lzop
sudo 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目录下,其大小大概在12MB
  • zImage是经过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 源码的目录信息

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • NXP
    NXP
    +关注

    关注

    60

    文章

    1278

    浏览量

    184046
  • 内核
    +关注

    关注

    3

    文章

    1372

    浏览量

    40278
  • Linux
    +关注

    关注

    87

    文章

    11292

    浏览量

    209328
  • 源码
    +关注

    关注

    8

    文章

    639

    浏览量

    29185
  • 编译
    +关注

    关注

    0

    文章

    657

    浏览量

    32852
收藏 人收藏

    评论

    相关推荐

    一文详解Linux内核源码组织结构

    概要:本文内容包含Linux源码结构分析、Linux Makefile分析、Kconfig文件分析、Linux
    的头像 发表于 05-10 19:28 5758次阅读

    linux内核源码编译

    Linux是一种开源的操作系统内核。它是一个用C语言写成,符合POSIX标准的类Unix操作系统。Linux最早是由芬兰大学生Linus Torvalds于1991年开发的一款全新的操作系统。那时
    发表于 06-27 15:37 793次阅读
    <b class='flag-5'>linux</b><b class='flag-5'>内核</b><b class='flag-5'>源码</b><b class='flag-5'>编译</b>

    Linux内核编译主要过程

    Linux内核编译主要过程: 配置、编译、安装 。
    发表于 08-08 16:02 726次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>内核</b>的<b class='flag-5'>编译</b>主要过程

    浅谈Linux内核源码的Makefile、Kconfig和.config文件

    Linux内核源码文件繁多,搞不清Makefile、Kconfig、.config间的关系,不了解内核编译体系,
    发表于 10-17 16:19 4145次阅读
    浅谈<b class='flag-5'>Linux</b><b class='flag-5'>内核</b><b class='flag-5'>源码</b>的Makefile、Kconfig和.config文件

    Linux内核源码目录结构

    Linux体系结构Linux内核结构Linux内核
    发表于 12-30 07:22

    linux 5.4.31为例来介绍一下linux内核目录结构

    Linux内核目录结构Linux内核源代码非常庞大,随着版本的发展不断增加。它使用目录树结构,并
    发表于 02-16 07:30

    Linux内核编译详谈

    Linux内核编译详谈
    发表于 10-30 09:51 7次下载
    <b class='flag-5'>Linux</b><b class='flag-5'>内核</b><b class='flag-5'>编译</b>详谈

    基于Arm的Linux内核编译指导

    基于Arm的Linux内核编译指导
    发表于 10-30 10:13 15次下载
    基于Arm的<b class='flag-5'>Linux</b><b class='flag-5'>内核</b><b class='flag-5'>编译</b>指导

    如何才能编译Linux内核

    内核的bug ,并增加了许多新的特性。如果用户想要使用这些新特性, 或想根据自己的系统度身定制一个更高效, 更稳定的内核, 就需要重新编译内核。本文将以RedHat
    发表于 11-04 18:04 8次下载

    Linux内核编译与运行

    本文档的主要内容详细介绍的是Linux内核编译与运行免费下载。
    发表于 03-25 13:48 11次下载

    嵌入式Linux内核编译

    编译工具链,在此就不再赘述。编写Linux内核需要内核源码内核
    发表于 11-01 17:07 16次下载
    嵌入式<b class='flag-5'>Linux</b>的<b class='flag-5'>内核</b><b class='flag-5'>编译</b>

    STM32MP157 Linux系统移植开发篇8:Linux内核配置方法及编译

    Linux内核配置及编译解压内核建立源码目录该目录下以patch结尾的文件为ST官方提供的补丁文件,li
    发表于 12-04 21:06 9次下载
    STM32MP157 <b class='flag-5'>Linux</b>系统移植开发篇8:<b class='flag-5'>Linux</b><b class='flag-5'>内核</b>配置方法及<b class='flag-5'>编译</b>

    STM32MP157 Linux系统移植开发篇7:Linux内核目录结构详解

    Linux内核目录结构Linux内核源代码非常庞大,随着版本的发展不断增加。它使用目录树结构,并
    发表于 12-17 18:29 10次下载
    STM32MP157 <b class='flag-5'>Linux</b>系统移植开发篇7:<b class='flag-5'>Linux</b><b class='flag-5'>内核</b>目录<b class='flag-5'>结构</b>详解

    Linux内核编译和运行

    想让Linux内核代码跑起来,得先搭建编译和运行代码的环境。
    发表于 06-23 11:56 1477次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>内核</b>的<b class='flag-5'>编译</b>和运行

    Linux内核编译脚本

    获得编译命令及选项 编译linux时,默认不会显示编译的命令,如果你要获得编译命令及其选项,可以在make命令后面加上宏定义: make V
    的头像 发表于 09-27 11:52 638次阅读