本人是刚毕业的大学生,对嵌入式底层了解尚浅,有任何疑问或错误欢迎在评论区指出
内核介绍
什么是操作系统内核
“内核”指的是一个提供硬件抽象层
、磁盘及文件系统控制
、多任务等功能
的系统软件
。内核是操作系统最基本
的部分。
内核是一个操作系统的核心。它负责管理系统的进程、内存、设备驱动程序、文件和网络系统等等,决定着系统的性能和稳定性。是连接应用程序和硬件的桥梁。
它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,并且内核决定一个程序在什么时候对某部分硬件操作多长时间。直接对硬件操作是非常复杂的,所以内核通常提供一种硬件抽象的方法来完成这些操作。硬件抽象隐藏了复杂性,为应用软件和硬件提供了一套简洁,统一的接口,使程序设计更为简单
。
操作系统组成
- 内核是计算机配置的底层软件,是操作系统最基本、最核心的部分
内核分类
- 宏内核:
- 组成:操作系统的
主要功能模块
都作为系统内核,运行在核心态 - 优点:高性能
- 缺点:内核代码庞大,结构混乱,难以维护
- 组成:操作系统的
- 微内核:
- 组成:只把
最基本
的功能保留在内核 - 优点:内核功能少,结构清晰,方便维护
- 缺点:需要频繁地在核心态和用户态之间切换,性能低
- 组成:只把
- 混合内核:集中宏内核和微内核的特点
- 外内核:将硬件暴露给应用程序,应用程序可以直接访问硬件,外内核对系统提供保护
内核功能
- 最基本的功能
- 进程管理:Linux 内核负责创建、调度和终止进程,并管理进程间的通信和同步。
- 内存管理:内核管理系统的内存,包括内存的分配、回收和保护。
- 设备管理:内核管理系统的硬件设备,并提供设备的抽象接口,使应用程序可以访问设备。
- 文件管理:Linux 内核提供对文件和目录的管理,包括文件的读写、创建和删除等操作。
- 中断处理:Linux 内核负责处理硬件中断,并相应地调度和处理中断事件。
- 主要功能
- 调度器:Linux 内核的调度器决定进程何时运行以及运行多长时间,以实现对系统资源的高效利用。
- 虚拟内存管理:Linux 内核将物理内存抽象成虚拟内存,负责将进程的虚拟地址翻译成物理地址,实现进程的内存隔离和保护。
- 网络管理:Linux 内核提供网络协议栈,管理网络连接和通信,包括 IP、TCP、UDP 等协议。
- 安全管理:Linux 内核提供安全功能,包括对进程、文件和网络的访问权限进行控制和管理。
- 文件系统支持:Linux 内核支持多种文件系统,例如 ext4、FAT32、NTFS 等,以满足不同的需求。
- 虚拟化支持:Linux 内核提供虚拟化支持,使得在一个物理机上可以同时运行多个虚拟机。
- 动态加载模块:Linux 内核支持动态加载模块,使得可以在运行时加载和卸载设备驱动程序和其他功能模块。
内核启动流程
-
- u-boot给内核传递的参数保存在
struct tag
结构体中,一系列的参数就对应着内存中连续分布的一系列tag
- u-boot给内核传递的参数保存在
- 有设备树启动内核
- 硬件信息以及
bootargs
都保存在设备树中,因此不再需要ATAGS,或者说参数信息都包括在设备树里了,并且内核会根据设备树的compatible
属性来选择machine_desc,所以u-boot在跳转执行内核时只需要通过寄存器传递DTB文件在内存中的起始地址即可
- 硬件信息以及
设备树介绍
什么是设备树
- 设备树:设备 & 树,描述开发板硬件设备和配置信息的数据结构,文件叫DTS
- 硬件系统可以直接通过设备树传递给linux,不需要在内核中进行大量冗余编码
将这些描述板级硬件信息的内容都从Linux内核中分离出来,用一个专属的文件格式来描述,这个专属的文件就叫做设备树
这个用这个通用的文件就是.dtsi文件,类似于C语言中的头文件。一般用.dts描述板机信息(也就是开发板上有多少个IIC设备、SPI设备等),dtsi描述SOC级信息(也就是SOC有几个CPU、主频是多少、多少个外设控制寄存器信息等)
设备树组成
- 文件组成
- DTS / DTSI
- .dts一种
ASCII
文本对Device Tree的描述 - 一个SOC可能有多个开发板,设备树将这些共同的部分提炼保存在**.dtsi**文件中,供不同dts共同使用
- .dts一种
- DTC
- 编译工具,可以将**.dts**编译成.dtb文件
- DTB
- DTC编译.dts生成的二进制文件,bootloder在引导内核时,会预先读取*.dtb到内存,进而有内核解析
- DTS / DTSI
- 结构组成
- 设备节点:描述了一个硬件设备,包括设备的类型、地址、中断等信息
- 属性:用于描述设备的特定特征和配置选项,列如时钟频率、内存大小等
- 子节点:子节点用于描述设备之间的层次关系,以及设备之间的依赖关系
设备树功能
在不同的硬件平台上移植Linux系统,只要相应的设备树文件被提供,系统就能正确地识别并配置硬件设备。
设备树的主要功能是将硬件设备的信息和配置从硬件平台中分离出来,使得操作系统和驱动程序可以根据设备树来动态地识别和配置硬件设备,而无需在内核中硬编码这些信息。
设备类型
-
字符设备
字符设备能够像
字节流
一样访问的设备,由字符设备驱动从程序来实现这种特性,dev下,只能顺序访问
-
块设备
按照
块
为范围来访问数据,一块为512kb,dev下,可以顺序访问,也可以无序访问
与字符设备区别:内核管理数据的方式,内核和驱动程序的接口不同
-
网络设备
按照网络数据包来收发,通过单独的网络接口,能够和其他数据进行数据交互,通过接口代表一个硬件设备,但也肯能是个纯软件设备
基本语法
/{
cpus{
cpu@0{
name = val; //"string" \ <u32 u32> \ [12 34 56]
};
cpu@1{
}
};
memory@0{
};
uart@fe001000{
};
ethernet@fe002000{
};
ethernet@fe003000{
};
};
-
节点每个设备树文件都有一个根节点,每个设备都是一个节点
描述一个硬件设备或设备组织
-
嵌套,节点间可以嵌套,形成父子关系,可以方便的描述设备间的关系
节点可以引用其他节点,用于描述设备之间的连接关系,通过设备树节点路径或标签进行标识
-
键值对,每个设备的属性都用一组value来描述
设备树定义了一些具有规范一样的属性
-
address-cells、size-cells
- address-cells:address:要用多少个32位数来表示(32位:1;64位:2)
- size-cells:size要用多少个32位数来表示
-
compatible
-
兼容
compatible="A"、"B"、"C" //先找a驱动,找不到a在找b,找不到b再找c
-
-
model
- 确定硬件是什么
-
status
- “okay”:设备正常运行
- “disabled”:设备不可以操作,但是后,1可以恢复工作
-
reg
-
表示寄存器地址
-
#address-cells = <1>; #size-cells = <1>; memory{ req = <0x80000000 0x20000000>; };
-
-
-
-
结束,每个属性的描述用
;
结束 -
注释,用于提高说明和解释关系
内核移植
源码树
- linux内核源码,从一级目录开始,文件夹与文件夹关系像一棵树一样
目录 | 简介 |
---|---|
arch | 体系结构相关的代码,每一个子目录代表一种架构 |
block | 块设备的通用函数 |
crypot | 常用加密和散列算法、压缩和CRC校核算法 |
fs | Linux支持的文件系统,每一个子目录代表一种文件系统 |
include | 内核头文件:基本头文件(include/linux )、驱动或功能部件头文件(例:include/mtd )、体系相关头文件(linux/asm-arm ) |
driver | 所有的驱动程序,每一个子目录代表一类驱动程序 |
init | 内核的初始化程序,其中main.c中的start_kernel函数是内核引导后执行的第一个函数 |
ipc | 进程间通信代码 |
kernel | 内核管理的核心代码,与体系相关的代码在/arch/$(ARCH)/kernel |
lib | 内核用到的库函数,与处理器相关的库函数位于/arch/$(ARCH)/lib |
mm | 内存管理代码,与处理器体系相关的位于/arch/$(ARCH)/mm |
net | 与网络相关的代码,每一个子目录对应于网络的一个方面 |
security | 安全、密钥相关的代码 |
sound | 音频相关的驱动程序 |
usr | 用来制作一个压缩的cpio归档文件:initrd的镜像,它可以作为内核启动后挂载的第一个文件系统 |
script | 用于配置、编译内核的脚本文件 |
Document | 内核文档 |
linux配置方式
使用命令(任选其一):
- make menuconfig
- make oldconfig
内核功能选择
选择标准:
- 依据硬件特性选择:处理器架构、内存大小、存储设备类型,及其他硬件特性
- 根据系统功能需求,确保所需的功能可用与应用程序的要求相符
- 系统资源需求,删除不必要的功能和策略,减少内核大小并提供系统的性能
- 安全性和性能要求,启用适当的安全模块
内核策略调整
[【纯干货】linux调度策略(最透彻的一篇!) - 知乎.pdf](PDF\内核与设备树\【纯干货】linux调度策略(最透彻的一篇!) - 知乎.pdf)
什么是内核策略:
在linux内核中用于管理和控制各种系统资源和功能的规则和参数设置
为什么进行内核策略调整:
- 内核策略调整是对参数和规程进行修改,适应特定的应用场合和需求
- 主要目的是为了优化系统的性能、安全性和可靠性,满足特定应用的要求,调整内核策略可以改变内核的行为,包括资源分配、调度算法、网络配置和文件系统设置等
内核策略调整的依据:
- 应能优化:调整内核参数,提供系统响应速度、处理能力和并发性能
- 资源管理:根据系统的硬件资源和应用程序的需求,调整内核对CPU、内存、磁盘和网络等资源的分配和策略管理
- 安全策略:调整内核的参数和配置,提高系统安全性
怎样进行内核策略调整:
- 修改内核配置:修改内核配置文件、开启或关闭特定功能模块、设备驱动程序和选项
- 使用内核参数:在引导时,通过内核命令行参数来传递特定的内核参数。这些参数可以调整内存分配、调度策略网络配置等,通过修改引导加载程序的配置文件来设置内核命令行参数
- 动态调整内核参数:通过修改’/proc’或’/sys’文件系统来实时调整内核参数
内核裁剪
什么是内核裁剪:
目的:根据系统需求,定制一个精简、高效的内核
从linux组件中删除不需要在组件、功能和驱动程序,以减小内核的体积提高性能和减少资源消耗
内核裁剪依据是什么:
- 应用需求:根据实际应用的需求,确定所需的功能和驱动程序
- 硬件平台:根据目标硬件平台的特性和约束,裁剪不需要的驱动程序和功能
- 性能优化:通过裁剪内核,减少无用的代码和模块
内核裁剪步骤:
- 阅读相关手册,参考内核配置选项和模块的依赖关系
- 获取内核源码
- 备份源码
- 配置内核
- 打开内核配置界面,通过菜单选择、命令行选项、配置文件,选择需要的组件和驱动程序,删除不需要的部分
- 编译内核
内核添加补丁
-
添加
Preempt - RT
补丁1. 解压内核文件 gunzip | unzip | tar -xf linux-xxxxxxx 2. 解压补丁包 gunzip | unzip | tar -xf patch-xxxxxxx 3. 进入内核文件夹,将补丁包移动金内核文件夹中 cd linux-xxxx/ && mv ../patch-xxxxx ./ 4. 打入补丁包 patch -p1 < patch-xxxxxx 5. 使用make menuconfig选择实时补丁 Preemption Model ————> Fully Preemptible Kernel (RT)
内核编译
1. 将arch/arm64/config/imx_v8_defconfig拷贝到当前目前目录 .config
cp arch/arm64/config/imx_v8_defconfig .config
2. 配置环境
export ARCH=
export CROSS_COMPILE=
export PATH=$PATH:
3. 编译配置文件
make imx_v8_defconfig
4. 编译内核
make
内核移植
使用TFTP加载Linux镜像
-
配置环境变量
-
setenv bootcmd ‘ tftpboot <地址> <镜像>; tftpboot <地址> <镜像>;bootm <地址> - <地址>
注意:bootm:32位; booti:64位
-
-
重启板子
写入flash中
-
通过tftp将镜像写入RAM中
tftpboot <RAM地址> <镜像文件>
-
将RAM中的镜像写入内存
- 块数 == 镜像文件大小(16进制) / 0x200
mmc write <RAM中镜像文件的起始地址> <写入mmc的起始地址> <块数>
-
设置环境变量
setenv bootcmd 'mmc read <RAM地址> <emmc起始地址> <块数>; mmc read <RAM地址> <emmc起始地址> <块数>; booti <RAM地址> - <RAM地址>'