| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> Linux内核开发——编译Ubuntu 20.04内核代码 -> 正文阅读 |
|
[系统运维]Linux内核开发——编译Ubuntu 20.04内核代码 |
1. 完整编译1.1. 查看内核版本可以使用下列
1.2. 下载内核代码可以直接下载一个比当前内核版本新的代码,也可以去https://mirrors.edge.kernel.org/pub/linux/kernel下载自己内核使用的版本。此文下载的是更新的版本 5.17.15,去官网https://www.kernel.org/,下载linux-5.17.12.tar.xz。 1.3. 解压
1.4. 配置环境1.4.1. 更换源不同版本的Ubuntu,需要对应不同版本的源。可以通过。https://mirror.tuna.tsinghua.edu.cn/help/ubuntu/上可以选择不同版本的Ubuntu对应的源。
将上述内核拷贝进下面打开的文件。
拷贝完了之后,更新源
1.4.2. 安装依赖
1.5. 编译1.5.1. 清理首次编译可以不用清理,编译之后如果想完整重新编译,可以使用清理命令。
1.5.2. 配置内核内核的编译配置放在.config文件中,内核arch目录中有提供不同架构的推荐.config供参考。也可以从当前内核的源usr/src/xxx目录中拷贝.config文件到当前目录。如果使用内核自带的参考.config。
会启动一个Qt的配置窗口,默认保存即可。 1.5.3. 编译
1.5.4. 安装安装其实就是将生成的ko库文件拷贝到指定目录lib\modules。
1.5.5. 安装启动文件分别生成initrd文件,将镜像文件和map文件拷贝到boot目录。
1.5.6. 更新grub更新grub文件,命令会自动检测boot目录中的initrd文件,将最新的initrd文件设置为默认启动版本。
1.6. 重启验证重启电脑,在终端查看版本号
1.7. 异常处理
2. 编译指定模块整个内核是由一个初始化模块程序initrd.img,内核可执行程序vmlinuz和这么多动态库ko文件组成。Linux在启动时可以动态选择需要的库来进行加载,这样可以提升内核的启动效率。另外,将模块编译成动态库(ko文件),在进行自定义模块功能时,也可以只用编译单个模块的代码,也更便利。模块是否编译,是编译进内核镜像还是单独生成内核模块文件ko文件,这些都是在.config文件中配置的。 2.1. 配置文件介绍2.1.1. .config文件哪些模块编译进主内核模块,哪些模块单独作为动态库存在。这些都是通过一个配置文件.config来描述的。.config文件中有记录一些配置名,一些配置的大小,剩余的主要是描述是描述是否编译进内核文件,是否编译为单独的模块。如:
2.1.2. Kconfig文件哪些字段可以配置,可以匹配什么样的值,默认配置的值是什么等,这些准备信息都是记录kconfig文件中。
config是关键字,指定后面的内容为.config文件中的可配置字段名,.config文件中实际使用时会加上CFONFIG_。 2.1.3. menuconfig参考Kconfig文件来配置.config文件,可以完成Kernel的编译配置,但是此方法不够直观,效率不高。make menuconfig可以根据arch/目录下不同架构下的Kconfig和.config文件生成一个菜单窗口,更直观的配置有关信息。 Kconfig中的bool类型在menucofig中对应[],有[]表示选中,[]表示不选中。 2.1.4. xconfigmenuconfig是字符终端,依然不够直观,xconfig是基于xWindow的UI窗口终端,更清晰直观。 其功能和menuconfig一样的。 2.1.5. oldconfig当.config有修改时,调用make oldconfig来验证相关修改是否匹配正确,会自动修改。 2.1.6. defcofig内核源代码目录中的arch/下有不同架构cpu下的defconfig文件仅参考配置。 2.2. 配置指定模块有些模块已经配置为编译为ko文件,有些模块没有配置。查看kconfig文件,找出该模块是否可以编译为模块,是否有依赖模块,有则选中,然后在.config中将指定模块配置为CONFIG_XX=m。 2.3. 完整编译首次使用时,需要完整编译。 2.4. 单独编译内核模块的makefile中有提供相关方法:
KDIR为内核顶层目录。
2.5. 拷贝拷贝编译的模块到指定目录
2.6. 更新驱动信息
2.7. 加载驱动modprobe jbd2,动态加载驱动,如果jbd2有依赖驱动,会先加载依赖驱动再加载此驱动。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/30 1:56:16- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |