目录
make dtbs编译设备树 :(将设备树源文件dts编译为二进制文件.dtb)编辑
一、Linux内核概述
1.1内核与操作系统
内核是一个操作系统的核心,提供了操作系统最基本的功能,是操作系统工作的基础,决定着整个系统的性能和稳定性
操作系统是在内核的基础上添加了各种工具集、桌面管理器、库、shell、应用程序
1.内核提供最核心的功能,内核是操作系统工作的基础,决定整个系统的性能和稳定性。
2.ubuntu是操作系统,内核是Linux。操作系统是在内核基础上添加了shell、库、应用程序等。
3. shell不属于内核。shell会保护内核,通过命令操作shell从而操作内核,用户和内核的交流,不能直接操作内核,需要通过shell。linux通过sehll管理文件系统
4.linux管理文件系库函数是系统调用的接口,不属于Linux内核。
5.桌面管理器支持可视的界面,是操作系统加的。
1.2 Linux层次结构 (内核的功能)
五大功能:
1、进程管理:多线程并发
2、内存管理
3、文件系统:对上层提供接口,规定下层不同硬件
4、寄存器驱动:配置寄存器
5、网络协议栈:TCP等
操作系统是内核加一些简单的库和其他配置,不会有庞大的操作系统。
1.3 Linux 内核结构
代码结构清晰、模块化设计
支持丰富的硬件平台
较高的稳定性
轻量化及较强的裁剪性
开放源代码
更新活跃、用户较多、资料丰富
支持丰富的网络协议
1.Linux不是专门为嵌入式设计的,但是是最适合嵌入式的。
2.微内核:内核+多模块,模块可以随意添加,但是耦合性低。一个模块出现问题,其他模块不受影响,但是模块之间的联系小,沟通不便。
宏内核:模块之间耦合性高,效率高,模块间沟通方便,但一个模块出现问题,其他模块也会受到影响。
3.精简指令集处理器,支持丰富的硬件平台。
4.稳定性高,开机时间长,不会有什么改变。
5.轻量级,成本低,硬件配置低也可以运行,具有较强的裁剪性,没有用的功能可以裁剪。
6.除了嵌入式,因具有丰富的网络协议,95%服务器用Linux也很多,。
7.开源。更新活跃资料多。
二、Linux内核源码结构
2.1Linux内核源码获取
Linux内核源码下载:https://www.kernel.org/
Linux内核版本命名:主版本号.次版本号.修订版本
Linux内核版本选择:支持对应的硬件平台相对成熟的版本(资料多)稳定版本(次版本号为偶数的一般是稳定版)
2.2 平台相关代码:arch
arch:与CPU架构相关的源代码,具有不同公司不同系列芯片,本节用到的是samsung下的处理器(CPU级别)mach-exynos。
2.3 内核源代码结构说明
block:操作磁盘设备的代码
copying:版权信息
CREITS:内核贡献者名单
crypto:加密
readme:基础说明
Documentation:详细说明
drivers:设备驱动
firmware:固件
fs:文件系统,用于管理访问磁盘
inculde:头文件
init:Linux内核初始化或者启动执行的代码(main.c中的 start _kernel 内核启动)
ipc:Linux进程间通信机制相关代码
kconfig:图形化界面
kernel:内核的核心,例如核心调度算法
lib:库
Makefile:编译
mm:内存管理源代码
net:网络协议,例如 802,ipv6
samples:案例
scripts:脚本/工具
security:安全性相关代码
sound:音频驱动
tools:使用Linux借助的工具
usr:压缩和解压代码
virt:虚拟化相关代码
三、Linux内核源码配置
对软硬件匹配,对相应处理器的代码进行选择和配置
3.1 linux 内核源码配置
1>.指定处理器架构及编译工具
在Linux内核源码顶层目录下的Makefile中指定(ARCH、CROSS_COMPILE)
2>.导入当前处理器的默认配置make <soc_name>_defconfig
注1:soc_name为当前使用的处理器的名字
注2:内核源码的arch/arm/configs下对各个厂商的soc都有一个默认配置文件
执行该命令后就会将对应的配置文件中的信息导入到源码顶层目录下的.config
文件中CONFIG_xxx=y表示内核选中了该功能,内核编译时就会将该功能对应的代码编译,内核的体积也会增大。#CONFIG_xxx is not set表示内核没有选
3.2 .config
内核编译时需要看.config 文件,将赋值y的功能的源代码编译到内核中
y赋值编译的功能越多,体积越大,内核功能越强大
四、Linux内核源码编译
4.1 修改配置
默认配置只能保证内核拥有最基本的功能,我们需要根据自己的实际需求对内核做进一步的配置
方法1:直接修改.config文件(不推荐):内核很多功能具有依赖关系,可能会配置混乱,随意修改会造成很严重的后果。例如:NFS->TCP/IP->DM9000
方法2:make menuconfig
4.2 make menuconfig
修改配置
[ ] 有两种状态
输入Y,显示“*”,内核中该功能被选中,相关代码会被编译进内核
输入N,显示“ ”,内核中该功能不被选中,相关代码不会被编译进内核
注:使用make menuconfig配置的本质还是修改.config文件
配置Linux内核功能:make menuconfig 生成图形化界面,可自动检查依赖关系
在make config 中将DM9000 直接更改为Y, .config 文件中有DM9000 被修改
4.3 make menuconfig常用配置选项
1、交叉编译工具
2.
3.指定串口
4. 网络协议(比较重要)
5.驱动设置
6.文件系统
< > 有三种状态
输入Y,显示“*”,内核中该功能被选中,相关代码会被编译进内核,编译到uImage中。
输入N,显示“ ”,内核中该功能不被选中,相关代码不会被编译进内核
输入M,显示“M”,内核中该功能被选为模块(被编译为独立的内核模块)
按空格可以在这些状态互换。<> 三种状态
五、Linux编译内核模块
内核编译(以下命令均在内核源码的顶层目录下执行)
make uImage编译内核(编译选为“*”的选项到内核)
make modules编译内核模块(编译选为“M”的选项为独立模块)
make clean删除编译过程中产生的中间文件
5.1 设备树
1>.Linuxl采取的机制为驱动程序和硬件设施分离。驱动有逻辑代码(点灯)和硬件信息(点哪个灯,配置相应寄存器)。驱动逻辑代码放到drivers,硬件信息放到了设备树。方便:硬件修改只需要修改设备树即可。
2>.简便理解:内核由两部分组成,逻辑代码放在uImage中,硬件信息放到了设备树中。Linux在运行时,需要将uImage和设备树都加载到内存中。
设备树有源代码(不是C语言),编译成二进制代码,可以被加载到内存。
3>.设备树位置:
4>.编译设备树
make dtbs编译设备树 :(将设备树源文件dts编译为二进制文件.dtb)
六、Linux编译设备树
6.1 make uImage编译内核(编译选为“*”的选项到内核)
通过OBJCOPY 将vmlinux转化为zImage,
通过mkImage(编译uboot产生)将zImage转化为uImage,编译成功
6.2 make modules编译内核模块(编译选为“M”的选项为独立模块)
图形化界面打开DM9000,选成M
make modules 编译模块
编译后产生的文件。 .ko 可单独装和卸