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 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目录 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 的时候会读取此文件中的配置信息。最终根据配置信息来选择编译 Linux 哪些模块,哪些功能。
  • Kbuild 文件:有些 Makefile 会读取此文件。
  • Kconfig 文件:图形化配置界面的配置文件。
  • Makefile 文件:Linux 顶层 Makefile 文件,建议好好阅读一下此文件。
  • README 文件:此文件详细讲解了如何编译 Linux 源码,以及 Linux 源码的目录信息
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安迪西嵌入式

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值