Linux 内核获取、初次编译、源码目录分析

目录

  • Linux 内核获取
  • Linux 内核初次编译
  • Linux 内核源码目录分析
    • 1、arch 目录
    • 2、block 目录
    • 3、crypto 目录
    • 4、Documentation 目录
    • 5、drivers 目录
    • 6、firmware 目录
    • 7、fs 目录
    • 8、include 目录
    • 9、init 目录
    • 10、ipc 目录
    • 11、kernel 目录
    • 12、lib 目录
    • 13、mm 目录

Linux 内核获取

在这里插入图片描述

关于Linux 的起源以及发展历史,这里就不啰嗦了,网上相关的介绍太多了!即使写到这也只是水一下教程页数而已,没有任何实际的意义。有限的时间还是放到有意义的事情上吧,Linux 由Linux 基金会管理与发布,Linux 官网为https://www.kernel.org,所以你想获取最新的Linux 版本就可以在这个网站上下载,网站界面如图35.1.1 所示:
在这里插入图片描述
从图35.1.1 可以看出最新的稳定版Linux 已经到了5.1.4,大家没必要追新,因为4.x 版本的Linux 和5.x 版本没有本质上的区别,5.x 更多的是加入了一些新的平台、新的外设驱动而已。

NXP 会从https://www.kernel.org 下载某个版本的Linux 内核,然后将其移植到自己的CPU上,测试成功以后就会将其开放给NXP 的CPU 开发者。开发者下载NXP 提供的Linux 内核,然后将其移植到自己的产品上。本章的移植我们就使用NXP 提供的Linux 源码,NXP 提供Linux源码已经放到了开发板光盘中,路径为:开发板光盘->1、例程源码->4、NXP 官方原版Uboot和Linux-> linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2

Linux 内核初次编译

编译内核之前需要先在ubuntu 上安装lzop 库,否则内核编译会失败!命令如下:

sudo apt-get install lzop

先看一下如何编译Linux 源码,这里编译以I.MX6U-ALPHA 开发板移植好的Linux 源码,已经放到了开发板光盘中,路径为:开发板光盘->1、例程源码-> 3、正点原子Uboot 和Linux出厂源码-> linux-imx-4.1.15-2.1.0-g8a006db.tar.bz2,注意,正点原子出厂系统在不断的更新,因此内和压缩包的名字可能不同,一切以实际为准!

在Ubuntu 中新建名为“alientek_linux ”的文件夹,然后将linux-imx-4.1.15-2.1.0-g8a006db.tar.bz2 这个压缩包拷贝到前面新建的alientek_linux 文件夹中并解压,命令如下:

tar -vxjf linux-imx-4.1.15-2.1.0-g8a006db.tar.bz2

解压完成以后的Linux 源码根目录如图35.2.1 所示:

在这里插入图片描述

以EMMC 核心板为例,讲解一下如何编译出对应的Linux 镜像文件。新建名为“mx6ull_alientek_emmc.sh”的shell 脚本,然后在这个shell 脚本里面输入如下所示内容:

示例代码35.2.1 mx6ull_alientek_emmc.sh 文件内容
#!/bin/sh
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_v7_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j16

第3 行,执行“make distclean”,清理工程,所以mx6ull_alientek_emmc.sh 每次都会清理一下工程。如果通过图形界面配置了Linux,但是还没保存新的配置文件,那么就要慎重使用mx6ull_alientek_emmc.sh 编译脚本了,因为它会把你的配置信息都删除掉!
第4 行,执行“make xxx_defconfig”,配置工程。
第5 行,执行“make menuconfig”,打开图形配置界面,对Linux 进行配置,如果不想每次编译都打开图形配置界面的话可以将这一行删除掉。
第6 行,执行“make”,编译Linux 源码。
可以看出,Linux 的编译过程基本和uboot 一样,都要先执行“make xxx_defconfig”来配置一下,然后在执行“make”进行编译。如果需要使用图形界面配置的话就执行“make menuconfig”。

使用chmod 给予mx6ull_alientek_emmc.sh 可执行权限,然后运行此shell 脚本,命令如下:

./mx6ull_alientek_emmc.sh

编译的时候会弹出Linux 图形配置界面,如图35.2.3 所示:

在这里插入图片描述
Linux 的图行界面配置和uboot 是一样的,这里我们不需要做任何的配置,直接按两下ESC键退出,退出图形界面以后会自动开始编译Linux。等待编译完成,完成以后如图35.2.4 所示:

在这里插入图片描述

编译完成以后就会在arch/arm/boot 这个目录下生成一个叫做zImage 的文件,zImage 就是我们要用的Linux 镜像文件。另外也会在arch/arm/boot/dts 下生成很多.dtb 文件,这些.dtb 就是设备树文件。

Linux 内核源码目录分析

将正点原子提供的Linux 源码进行解压,解压完成以后的目录如图35.3.1 所示:

在这里插入图片描述

图35.3.1 就是正点原子提供的未编译的Linux 源码目录文件,我们在分析Linux 之前一定要先在Ubuntu 中编译一下Linux,因为编译过程会生成一些文件,而生成的这些恰恰是分析Linux 不可或缺的文件。编译完成以后使用tar 压缩命令对其进行压缩并使用Filezilla 软件将压缩后的uboot 源码拷贝到Windows 下。

编译后的Linux 目录如图35.3.2 所示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
表35.3.1 中的很多文件夹和文件我们都不需要去关心,我们要关注的文件夹或文件如下:

1、arch 目录

这个目录是和架构有关的目录,比如arm、arm64、avr32、x86 等等架构。每种架构都对应一个目录,在这些目录中又有很多子目录,比如boot、common、configs 等等,以arch/arm 为例,其子目录如图35.3.2 所示:
在这里插入图片描述
图35.3.2 是arch/arm 的一部分子目录,这些子目录用于控制系统引导、系统调用、动态调频、主频设置等。arch/arm/configs 目录是不同平台的默认配置文件:xxx_defconfig,如图35.3.3所示:
在这里插入图片描述
在arch/arm/configs 中就包含有I.MX6U-ALPHA 开发板的默认配置文件:imx_v7_defconfig,执行“make imx_v7_defconfig”即可完成配置。arch/arm/boot/dts 目录里面是对应开发平台的设备树文件,正点原子I.MX6U-ALPHA 开发板对应的设备树文件如图35.3.4 所示:

在这里插入图片描述
arch/arm/boot 目录下会保存编译出来的Image 和zImage 镜像文件,而zImage 就是我们要用的linux 镜像文件。

arch/arm/mach-xxx 目录分别为相应平台的驱动和初始化文件,比如mach-imx 目录里面就是I.MX 系列CPU 的驱动和初始化文件。

2、block 目录

block 是Linux 下块设备目录,像SD 卡、EMMC、NAND、硬盘等存储设备就属于块设备,block 目录中存放着管理块设备的相关文件。

3、crypto 目录

crypto 目录里面存放着加密文件,比如常见的crc、crc32、md4、md5、hash 等加密算法。

4、Documentation 目录

此目录里面存放着Linux 相关的文档,如果要想了解Linux 某个功能模块或驱动架构的功能,就可以在Documentation 目录中查找有没有对应的文档。

5、drivers 目录

驱动目录文件,此目录根据驱动类型的不同,分门别类进行整理,比如drivers/i2c 就是I2C相关驱动目录,drivers/gpio 就是GPIO 相关的驱动目录,这是我们学习的重点。

6、firmware 目录

此目录用于存放固件。

7、fs 目录

此目录存放文件系统,比如fs/ext2、fs/ext4、fs/f2fs 等,分别是ext2、ext4 和f2fs 等文件系统。

8、include 目录

头文件目录。

9、init 目录

此目录存放Linux 内核启动的时候初始化代码。

10、ipc 目录

IPC 为进程间通信,ipc 目录是进程间通信的具体实现代码。

11、kernel 目录

Linux 内核代码。

12、lib 目录

lib 是库的意思,lib 目录都是一些公用的库函。

13、mm 目录

此目录存放内存管理相关代码。

14、net 目录
此目录存放网络相关代码。

15、samples 目录
此目录存放一些示例代码文件。

16、scripts 目录
脚本目录,Linux 编译的时候会用到很多脚本文件,这些脚本文件就保存在此目录中。

17、security 目录
此目录存放安全相关的文件。

18、sound 目录
此目录存放音频相关驱动文件,音频驱动文件并没有存放到drivers 目录中,而是单独的目
录。

19、tools 目录
此目录存放一些编译的时候使用到的工具。

20、usr 目录
此目录存放与initramfs 有关的代码。

21、virt 目录
此目录存放虚拟机相关文件。

22、.config 文件
跟uboot 一样,.config 保存着Linux 最终的配置信息,编译Linux 的时候会读取此文件中的配置信息。最终根据配置信息来选择编译Linux 哪些模块,哪些功能。

23、Kbuild 文件
有些Makefile 会读取此文件。

24、Kconfig 文件
图形化配置界面的配置文件。

25、Makefile 文件
Linux 顶层Makefile 文件,建议好好阅读一下此文件。

26、README 文件
此文件详细讲解了如何编译Linux 源码,以及Linux 源码的目录信息,建议仔细阅读一下此文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/265187.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP里10个鲜为人知但却非常有用的函数

PHP里有非常丰富的内置函数,很多我们都用过,但仍有很多的函数我们大部分人都不熟悉,可它们却十分的有用。这篇文章里,我列举了一些鲜为人知但会让你眼睛一亮的PHP函数。 levenshtein() 你有没有经历过需要知道两个单词有多大的不同…

学会阅读硬件的原理图、数据手册大全

参考: 郭天祥:https://www.bilibili.com/video/BV1DW411a7mz?p8 韦东山:https://www.bilibili.com/video/BV1ga4y1Y7PL?p4 https://www.bilibili.com/video/BV17g411F7oR?spm_id_from333.999.0.0 洋桃电子:https://www.bilibil…

解决替换weblogic的commons-fileupload.jar后引发的问题

为什么80%的码农都做不了架构师?>>> 上一篇博文中提到通过替换weblogic自带的commons-fileupload.jar来解决FileUpload类的NoSuchMethodError问题。在完成替换后,该问题得到顺利解决,但是也会引发其他的一些问题,下面…

Python for Data Analysis 学习心得(二) - pandas介绍

一、pandas介绍 本篇程序上篇内容,在numpy下面继续介绍pandas,本书的作者是pandas的作者之一。pandas是非常好用的数据预处理工具,pandas下面有两个数据结构,分别为Series和DataFrame,DataFrame之前我在一些实战案例中…

Euler:欧拉函数&素数筛

一、欧拉函数 欧拉函数是小于x的整数中与x互质的数的个数,一般用φ(x)表示。 通式: 其中p1, p2……pn为x的所有质因数,x是不为0的整数。比如x12,拆成质因数为122*2*3,12以内有1/2的数是2的倍数,那么有1-1/2…

大小端字节序

想起以前在汇编语言和数字逻辑的时候也有接触到一些这个概念,已经有点模糊了,搞不清楚哪个是低位在前哪个是高位在前。后来在Wiki和Google的帮助下也算摸清楚了一些Endianness的概念。 一、字节序的起源 在计算机中,字节序(Endian…

docker 部署nginx 使用keepalived 部署高可用

一.体系架构 在Keepalived Nginx高可用负载均衡架构中,keepalived负责实现High-availability (HA) 功能控制前端机VIP(虚拟网络地址),当有设备发生故障时,热备服务器可以瞬间将VIP自动切换过来&#xff0c…

虚拟字符设备驱动开发步骤

目录前言字符设备驱动简介内核驱动操作函数集合(file_operations结构体)字符设备驱动开发步骤.ko驱动模块的加载和卸载(module_init驱动入口、insmod驱动加载)字符设备注册与注销到内核register_chrdev(设备号、设备名) -- 很少用了实现设备的具体操作函数添加LICENSE 和作者信…

设计模式20——Mediator设计模式

2019独角兽企业重金招聘Python工程师标准>>> Mediator中介者设计模式是通过一个中介对象封装一系列关于对象交互行为. Mediator中介者设计模式中的角色如下: (1).中介者(Mediator):抽象定义了“同事”(co…

Linux LED驱动开发实验(直接操作寄存器 -- 实际开发很少这样做)

目录Linux 下LED 灯驱动原理地址映射(ioremap映射、iounmap释放)I/O 内存访问函数硬件原理图分析实验程序编写LED 灯驱动程序编写APP测试程序编写运行测试编译驱动程序和测试APP拷贝led.ko 和ledApp到指定目录加载led.ko 驱动模块到内核创建应用层“/dev/led”设备节点运行测试…

Strange Words 4

2019独角兽企业重金招聘Python工程师标准>>> abnormality 英[ˌbnɔːmləti] 美[ˌbnɔːrmləti] n.变态;反常;异常;畸形 tenor 英 [tenə(r)]  美 [tenər] n.大意;要旨;常规;男高音&…

新字符设备驱动实验(自动分配设备号、自动创建应用层设备节点、新字符设备注册到内核的结构体)

目录自动分配和释放设备号示例代码新的字符设备注册到内核方法字符设备结构体(前面的设备号也放进来)cdev_init结构体初始化函数cdev_add 添加到linux内核cdev_del内核注销函数自动创建应用层设备节点mdev 机制创建和删除类创建删除设备(生成/dev/xxx设备)参考示例(先删除设备再…

$Django importlib与dir知识,手写配置文件, 配置查找顺序 drf分页器drf版本控制

1 importlib与dir知识 # importlib简介动态导入字符串模块 # 常规导入 from ss.aa import b from ss import a print(b,type(b)) #<module ss.aa.b from F:\\python37\\pythonfiles\\ss\\aa\\b.py> #<class module># importlib动态导入py文件模块 import importli…

springMVC_07乱码及restful风格

乱码的解决 通过过滤器解决乱码问题:CharacterEncodingFilter 配置web.xml文件 <filter><filter-name>encoding</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><para…

[转】HTTP请求流程(二)----Telnet模拟HTTP请求

转自&#xff1a; http://www.cnblogs.com/stg609/archive/2008/07/06/1237000.html 上一部分"流程简介"&#xff0c; 我们大致了解了下HTTP请求的流程&#xff0c;这一篇我向大家介绍下如何利用Telnet来模拟Http请求---访问百度。 我们直接开始吧&#xff01; …

设备树下的LED驱动实验

目录设备树LED驱动原理硬件原理图分析实验程序编写修改设备树文件(根节点下添加好区分)LED灯驱动程序编写编写测试APP运行测试编译驱动程序和测试APP运行测试上一章我们详细的讲解了设备树语法以及在驱动开发中常用的OF 函数&#xff0c;本章我们就开始第一个基于设备树的Linux…

《现代操作系统》精读与思考笔记 第七章 多媒体

第七章部分内容与前几章内容关联很大&#xff0c;比如进程调度、磁盘调度、文件系统&#xff0c;而且多为实现细节&#xff0c;这里不详述。 1.帧数与闪烁&#xff08;P476&#xff09; 画面动作的平滑性不是完全由每秒的帧数决定的&#xff0c;而是由每秒不同画面的数目决定的…

pinctrl和gpio子系统实验(芯片原厂做的,类似STM32的HAL库,我们只需调用API来直接操作GPIO)

目录pinctrl子系统pinctrl子系统简介(半导体厂商写的)I.MX6ULL的pinctrl子系统驱动分析0、通过compatbile属性查找对应驱动文件1、PIN配置信息详解(获取寄存器地址)2、PIN 驱动程序流程讲解(流程图&#xff0c;了解)设备树中添加pinctrl节点模板(半导体厂商瑞芯微、海思厂商写的…

成为你自己

2019独角兽企业重金招聘Python工程师标准>>> 一个看过许多国家、民族以及世界许多地方的旅行家&#xff0c;若有人问他&#xff0c;他在各处发现人们具有什么相同的特征&#xff0c;他或许会回答∶他们有懒惰的倾向。有些人会觉得&#xff0c;如 果他说他们全是怯懦…

网络知识梳理--OSI七层网络与TCP/IP五层网络架构及二层/三层网络

作为一个合格的运维人员&#xff0c;一定要熟悉掌握OSI七层网络和TCP/IP五层网络结构知识。 废话不多说&#xff01;下面就逐一展开对这两个网络架构知识的说明&#xff1a;一、OSI七层网络协议OSI是Open System Interconnect的缩写&#xff0c;意为开放式系统互联。 OSI参考模…