Linux Kernel简介
0. Linux历史
Linux 内核(英語:Linux kernel)是一种开源的类Unix操作系统宏内核。整个Linux操作系统家族基于该内核部署在传统计算机平台(如个人计算机和服务器,以Linux发行版的形式[7])和各种嵌入式平台,如路由器、无线接入点、专用小交换机、机顶盒、FTA接收器、智能电视、数字视频录像机、网络附加存储(NAS)等。工作于平板電腦、智能手机及智能手表的Android操作系统同样通过Linux内核提供的服务完成自身功能。尽管于桌面电脑的占用率较低,基于Linux的操作系统统治了几乎从移动设备到主机的其他全部领域。截至2017年11月,世界前500台最强的超级计算机全部使用Linux。
Linux内核最早是于1991年由芬兰黑客林納斯·托瓦茲为自己的个人电脑开发的,他当时在Usenet新闻组comp.os.minix
登载帖子[9],这份著名的帖子标志着Linux内核计划的正式开始。如今,该计划已经拓展到支持大量的计算机体系架构,远超其他操作系统和内核。它迅速吸引了一批开发者和用户,利用它作为其他自由软件项目的核心,如著名的 GNU 操作系统。[10]而今天,Linux 内核已接受了超过1200家公 司的近12000名程序员的贡献,其中包括一些知名的软硬件发行商。[11][12]
从技术上说,Linux 只是一个符合POSIX 标准的内核。它提供了一套应用程序接口(API),通过接口用户程序能与内核及硬件交互。仅仅一个内核并不是一套完整的操作系统。有一套基于 Linux 内核的完整操作系统叫作Linux 操作系统,或是GNU/Linux(在该系统中包含了很多GNU 计划的系统组件)。
Linux 内核是在GNU通用公共许可证第2版之下发布的[4](加上一些非自由固件、blob与各种非自由许可证[13]),是一个开源项目协作的突出例子。它的版本支持根据版本最长可达6年,貢獻者遍佈世界各地,日常开发相关的讨论在Linux 内核邮件列表上。
- 上图左面为 Linux logo 右边 Linux祖师爷 Linus本人
Linux版本资料
- LinuxKernel官网:https://www.kernel.org/ 我们一般称Linux官网里面的 Kernel为 主线社区版本。
- 在官网里面 我们需要了解
mainline stable longterm linux-next
有什么区别? - Mainline:
- 特点: 主线分支是 Linux 内核的主要开发分支,包含最新的开发和功能更新。
- 目的: 主要用于推动新功能、改进和实验性的变化。这是开发者提交新代码和功能的主要目标。
- Stable:
- 特点: 稳定分支是为了提供一个相对较稳定的内核版本,以便企业、发行版制造商和普通用户可以依赖这个版本。
- 目的: 稳定分支通常用于修复主线分支中发现的 bug,并且只接受 bug 修复而不引入新功能。这有助于确保长期 支持。
- Longterm:
- 特点: 长期支持 (LTS) 分支是一个更加长期维护的版本,为用户提供相对较长的支持周期。
- 目的: LTS 分支通常用于企业和发行版制造商,以提供更长的稳定性和支持,避免频繁的升级。
- Linux-next:
- 特点: linux-next 分支包含下一个开发周期中的补丁和功能,但这些变化还未进入主线。
- 目的: linux-next 提供了一个预览下一个内核版本的机会,以帮助开发者和测试人员在它们进入主线之前发现和解决潜在问题。
总的来说,这些分支在内核开发过程中起到不同的作用,主线用于主要开发,稳定分支用于提供相对较稳定的版本,长期支持分支用于提供更长时间的支持,而 linux-next 则提供一个预览未来开发方向的分支。开发者和用户可以根据其需求选择相应的内核分支。
版本发布周期
- Linux版本发布周期: https://www.kernel.org/category/releases.html
开发方式
- Linux Kernel的开发模式
- 关注 Merge window (窗口合并期- 两周)
- Bug-fixing period (Bug修复期-6-10周)
- rc版本[^1] (发布候选版)
文档资料
- LinuxKernel文档中心:https://www.kernel.org/doc/html/latest/
- wiki中心:https://www.wiki.kernel.org/
- 深入介绍每个内核版本的新功能:https://kernelnewbies.org/LinuxChanges
- 每个合并窗口接受的特征讨论说明:https://lwn.net/Kernel/
- LinuxKernel PATCH中心 :https://patchwork.kernel.org/
- 使用 git 工具阅读理解Linux 代码
- git log --grep=‘imx6ull’ 根据提交信息关键字搜索。
-
根据commit查看详细的提交说明:查看Merge合并提交信息。
-
git show –m commit 显示某次Merge合并的详细修改信息。
- 通过使用git命令 查看imx6ull ubi文件系统挂载错误问题,git log –grep ‘imx6ull’ --oneline 如何解决,找到对应的 commit id 最前面 黄色 id 值。
- 确定好提交的commit id值以后 使用 git log –p -1 e4817a1b6b77 来查看详细的操作内容
1. Linux内核开发流程
构建Linux内核流程
主要分为两部分
- 环境配置: 选择合适的编译主机环境 系统非常重要
- 安装对Linux内核源码构建所需的环境依赖
- 设置你需要构建的目标单板的架构 工具链
- 内核构建
- make构建可以给bootloader使用的 内核镜像
- make构建 dtb设备树文件(可选
x86架构不需要
) - make 构建内核模块驱动
- 安装到合适的位置,替换原有的版本
-
Host下配置开发环境
-
安装必要依赖包
- 解压配置合适的工具链
-
-
获取配套的交叉编译工具链
-
SOC原厂提供: NXP ST Rockchip Amlogic Allwinnertech 等。
- 社区下载: Linrao Debian ARM Bootlin
-
-
下载kernel源码
-
获取Linux Kernel主线LTS源码
-
Git方式获取: git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
-
获取芯片原厂Kernel源码
-
-
-
指定编译板子配置文件
make BOARDNAME_defconfig
-
编译
-
编译内核镜像
make –jN
-
编译设备树
make dtbs
-
编译安装模块驱动
make modules
-
-
-
安装驱动模块至目标kernel位置
获取适合的Linux内核
Kernel源码区别
-
Linus Torvalds 发布的 Linux 内核的官方(主线)版本可在 https://kernel.org 获得。
- 这些版本遵循内核的开发模式流程。但是,它们可能尚未包含特定领域的最新特性。某些开发中的功能可能尚未准备好用于主线版本。
-
许多芯片供应商提供自己的内核源
- 他们优先关注硬件支持。与主线 Linux 有一个非常重要的增量支持。
- 仅在主线还没有支持时有用。 许多SOC供应商同时投入于主线内核开发。
-
许多内核子社区维护自己的内核版本,通常具有更新 但不够稳定。
-
架构社区(ARM、MIPS、PowerPC 等)、设备驱动社区(I2C、SPI、USB、PCI、网络等),其他社区(如real-time等)
-
无官方发布,仅用于分享工作和为主线版本做出贡献。
-