type
status
slug
summary
tags
category
icon
password
new update day
Property
Oct 22, 2023 01:31 PM
created days
Last edited time
Oct 22, 2023 01:31 PM
从很早之前就接触过 Linux ,一直都被 Linux 的稳定性和条理性深深地吸引者,最近也是萌生出了要不试一试 Linux 内核源码学习、尝试进行一下 Linux 内核开发。
与其它程序开发一样,开始的第一步就是对应的开发环境的配置,对应于 Linux 内核这个庞然大物,敢于直接对他出手的人也不多,原来想在 B 站上招一些相关的视频教学课程,可以没想到诺大一个 B 站,这方面相关的资料居然少得可怜。后面我自己经过搜索也是总结了一些资料,在这里也是分享一下。
0 资料分享
www.kernel.org
The Linux Kernel documentation — The Linux Kernel documentation
https://www.kernel.org/doc/html/v6.1/
kernelnewbies.org
社区联系方式
有用的信息
1 系统环境配置
okay!在经过对上面的一些资料的学习以及查看之后,我也是找到了一定的学习思路:即对于 Linux 这么一个庞大的系统来说,如果你想一口吃个大胖子基本上是不可能的,只能说就是先找一个子系统,然后通过对子系统的学习来进行入门。
1.1 参考资料
不过上面的都是后话了,我们当前最紧急的任务还是配置 Linux 内核开发环境。我的开发环境配置是参考下面的这些资料进行配置的。在这过程中也是遇到了挺多问题的。
1.2 基础 Linux 编译环境(Arch)
- Arch Linux(使用这个发行版的原因是因为我尝试在 Ubuntu 22.04(官方推荐的是
18.04
) 上进行内核编译,但是一直没有办法编译通过,不知道是不是因为发行版太信的缘故。
- bootloader:
grub
注意!下面的所有配置都是基于 Arch Linux 的!Ubuntu 上没有测试过,不过应该也有一定的参考价值。
1.3 系统硬盘分区配置(重要!)
因为指导文档上没有给出对应的要求与指示,所以一开始也是遇到了一些令人哭笑不得的事情。在这里给大家记录一下,给大家避个坑。
挂载点 | 大小 |
/boot | 2G+ |
swap (分区、或者交换文件) | 一定要有,大小可以控制在4G+ |
/ | 60G+(尽可能大吧,毕竟占用也是自动分配的) |
1.3 安装所需的包
2 开发环境配置
2.1 设置您的 Linux 内核代码存储库
- 创建代码存储文件夹
- 克隆内核源码
(此处耗时非常长,请做好心理准备,同时也可能需要自备过墙梯)
- 进入源码目录、为内核编译做好准备
2.2 设置你的内核配置
许多内核驱动程序可以打开或关闭,或构建为模块。内核源目录中的
.config
文件决定构建哪些驱动程序。下载源代码树时,它不附带 .config
文件。关于生成 .config
文件,您有多种选择。最简单的是复制您当前的配置。2.2.1 复制当前配置
如果你想看看一个错误是否被修复,你可能想在你运行的内核上复制配置。
- For ArchLinux/Manjaro,
For Ubuntu
在 Ubuntu 上该配置文件存储在
/boot/
中的某处。可能有多个以 config
开头的文件,因此您需要与正在运行的内核相关联的文件。您可以通过运行 uname -a
并找到以您的内核版本号结尾的配置文件来找到它。将该文件作为 .config
复制到源目录中。或者对于 Ubuntu
,只需运行此命令:不要忘记在新的
.config
中重命名您的内核版本 “CONFIG_LOCALVERSION”
。如果你跳过这个,就会有错误地覆盖你现有内核之一的风险。2.2.2 修改你的配置
因为可能最新的内核源码与你现在系统运行的内核版本不同,比如更新了什么功能,添加了什么配置。如果不需要对配置进行任何更改,下面的命令将以静默方式将任何新配置值更新为默认值:
- 如果需要进行更改,可以运行:(这需要安装 ncurses 库。)
- 如果你想编译得更快,你可以从配置中删除你系统中目前不使用的所有模块:
警告:这可能不会在构建内核时将某些必需的模块编译到您的系统中。
3 编译内核
运行
make
或者 make -jX
。开始内核编译操作。 其中 X 是 2 或 4 之类的数字。如果您有双核,2 或 3 可能不错。四核,4 或 6。除非你想让你的机器非常慢,否则不要运行非常大的数字!
注意:当您使用从与您构建的内核不同的内核复制的
.config
文件运行 make
时,系统可能会提示您选择启用哪些新内核功能。如有疑问,请选择默认选项。你可以通过点击回车来做到这一点。简单地选择所有默认值的一种更快的方法是运行 make menuconfig
。这将为未设置的功能设置默认值。退出时不要忘记保存。4 安装内核(Arch Linux)
对于
ArchLinux/Manjaro
,你需要做一些这里提到的事情。确保在完成所有步骤后你拥有下面提到的所有文件。- 内核:vmlinuz-你的内核名称
- initramfs:initramfs-你的内核名称.img
- 系统映射:System.map-你的内核名称
- 系统映射内核符号链接
4.1 安装模块
- 一旦内核被编译,它的模块就必须随之而来。首先构建模块:
然后安装模块。作为 root 或具有 root 权限,运行以下命令来执行此操作:
这会将已编译的模块复制到
/lib/modules/A.B.C/
。这使单独使用的内核的模块保持分离。4.2 拷贝内核到 /boot
目录
注意:确保 bzImage 内核文件已从适合您的系统架构的目录中复制。见下文。
此文件必须复制到
/boot
目录并在此过程中重命名。名称将以 vmlinuz-
为前缀,您可以随意命名内核。在下面的示例中,已安装和编译的 A.B.C
内核已被复制并重命名为 vmlinuz-linuxAB
:4.3 制作 initial RAM disk
4.3.1 自动预设方式
可以复制和修改现有的 mkinitcpio 预设,以便可以按照与官方内核相同的方式生成自定义内核
initramfs
映像。这在打算重新编译内核(例如更新的地方)时很有用。在下面的示例中,将为上面安装的内核 A.B.C 复制和修改现有 Arch 内核的预设文件。- 首先,复制现有的预设文件,重命名它以匹配在复制 bzImage 时指定为
/boot/vmlinuz-
后缀的自定义内核的名称:
- 其次,编辑文件并针对自定义内核进行修改。 (再次)注意
ALL_kver=
参数也匹配复制 bzImage 时指定的自定义内核的名称:
- 最后,按照与官方内核相同的方式为自定义内核生成 initramfs 映像:
4.3.2 手动方式
除了使用预设文件,还可以使用 mkinitcpio 手动生成 initramfs 文件。命令的语法是:
-k (--kernel kernel_version)
:指定生成 initramfs 映像时要使用的模块。kernel_version
名称将与它的模块目录名称相同,位于/usr/lib/modules/
(或者,可以使用内核映像的路径)。
-g (--generate file_name)
:指定要在/boot
目录中生成的 initramfs 文件的名称。同样,建议使用上述命名约定。
例如,上面安装的 A.B.C 自定义内核的命令是:
4.4 Copy System.map
引导 Linux 不需要
System.map
文件。它是特定内核构建中的一种“电话目录”功能列表。 System.map 包含内核符号列表(即函数名、变量名等)及其对应的地址。此“符号名称到地址映射”用于:- 一些进程,如 klogd、ksymoops 等。
- 在内核崩溃期间必须将信息转储到屏幕上时由 OOPS 处理程序(即信息,例如它在哪个函数中崩溃了)。
提示:EFI 系统分区使用 FAT32 格式化,不支持符号链接。
如果您的
/boot
位于支持符号链接(即非 FAT32)的文件系统上,请将 System.map
复制到 /boot,将您的内核名称附加到目标文件。然后从 /boot/System.map
创建一个指向 /boot/System.map-linuxAB
的符号链接:完成上述所有步骤后,您的
/boot
目录中应该有以下 3 个文件和 1 个软符号链接
以及任何其他先前存在的文件:- Kernel:
vmlinuz-linux
AB
- Initramfs:
initramfs-linux
AB
.img
- System Map:
System.map-linux
AB
- System Map kernel symlink:
System.map
(which symlinks toSystem.map-linux
AB
)
提示:内核源代码包括一个脚本来自动执行 LILO 的过程:如果您使用其他引导加载程序,可以安全地忽略它。
4.5 更新 grub 配置文件
5 安装内核(Ubuntu)
6 Optional tools
6.1 gitk
gitk 是一个图形化的 git 仓库浏览器。您可以使用它来查看存储库的状态以及您在上游之上所做的提交。在 ArchLinux 上,它与 git 包一起安装,因此您可以随时使用。 Ubuntu 用户可能需要安装它:
6.2 Make ctags
ctags 解析源代码并生成一种索引,将重要实体(例如函数、类、变量)的名称映射到定义该实体的位置。该索引被 vi 和 emacsen
等编辑器使用,以允许移动到用户指定实体的定义。 Exuberant Ctags 支持所有可能的 C 语言结构和多种其他语言。
您已经在第一步中将它与其他软件包一起安装了。
在
git/kernels/staging/
目录中,运行这将为源代码制作
ctags
。当您从基本目录 (git/kernels/staging/
) 开始在 vim 中编辑代码时,您可以使用 CTRL+]
来查找函数的定义。有关详细信息,请参阅 vim 提示 wiki 中的 ctags 条目。6 参考资料
- 作者:tangcuyu
- 链接:https://expoli.tech/articles/2023/02/19/configue-linux-development-environment
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章