历时两个月的比赛终于按下了暂停键,这段时间收获颇多,记录一下,避免后人像我一样走了许多弯路
我会尽可能的详细记载我遇到的各种问题以及开发流程(如果有时间的话)
我不会去写太多基础的文档那样过于耗时,我会直接把我当时参考的文章附上,主要是提供思路以及记录一些缺乏记载的东西
那么就先从Kernel开始
Kernel的源码在Windows上是无法使用的,可以使用WSL、虚拟机、Linux分区阅读器等总之办法有很多,但是我觉得最方便且高效的办法还是装一个双系统,在这里推荐Debian
关于Kernel的文档
Linux_Kernel_Wiki(强推,这个真的很全面,感觉光看这一个都够用了)
在开始之前你需要大量的基础知识,比如内核、操作系统等,这里推荐些前置科目,如果想从零打基础的话可以从零学习一下《计算机组成原理》、《操作系统》(最近在看《操作系统导论》这种厚重的书籍读起来好爽)、C语言、Linux、Kernel,虽然Kernel是Linux的一部分,但是这里把Linux和Kernel区分开是因为我觉得学习Linux和学习Kernel的学习路线完全不同,注意不要搞错了重点
这段没有什么好的文档推荐(绝对不是我懒)
重要的不是一个我给你推荐一个好的文章、好的教程,跟着一步步学就可以达成目的,拥有主动学习的能力才是最为重要的,所以需要自己去查找并加以理解
那么就假设读者已经具备了上述基础
理论学的再多不如上手实操,接下来就要试着去编译一下内核并且安装了(虽然说入门一般都是输出一个HelloWorld,但是步子迈小一点也没有什么坏处)
先是拉取内核源码,这里使用清华的镜像站
git clone https://mirrors.tuna.tsinghua.edu.cn/git/linux.git
拉取完成之后进入到源码目录,选择编译配置 如图
make menuconfig
忘记介绍了,make是一个自动化构建软件,文章如下:
只有理解了编译过程才能理解Make的用处,建议先自己手动编译一下试试,学计算机的学到什么了一定要先动手试试
那么到这里你已经明白了编译的过程,也明白了上面那句命令的用处,这里有一个小坑,menuconfig是打开一个图形化的界面方便你进行图形化的配置,但是如果你运行命令的终端有点小的话,会报错的,所以这里推荐全屏终端运行,第一次执行这个命令肯定会报错,因为编译内核源码的过程会缺少很多依赖,按照提示下载就好,我这里就不总结列举出来了
其实现在没有什么好选的配置,毕竟这是一个原版的内核源码,开始编译
make -j 32
-j 选项是启用多线程编译,32是线程数,这里建议线程数选择CPU核心数量的1-2倍
如果没有任何意外的话,你的终端会开始像一个“黑客”一样闪过去各种信息,这是漫长的一步,具体要编译多久取决于电脑的性能(但是漫长的只有这一步),可以当作参考时间,我的电脑是拯救者r9p 编译时间大概在30-40分钟左右,可以休息一会了
编译完成后如图
等编译完成之后就可以安装内核了
sudo make install # 安装内核
sudo make modules_install # 安装内核模块
这里有一些琐碎的注意事项
- 编译-安装内核真的就只需要这么简单的几步就可以了
网络上关于内核安装的说法有很多种,我以前花费了大量的时间去尝试他们的那些方法,因为我觉得就这两行命令就能装完的话,未免也太简单了,但事实就是这么简单,内核的安装只需要两行或者说一行命令就可以
- 更新grub
有很多文章在安装内核的部分会有更新grub这一步操作,但是就像我说的,只需要make install就可以,这个命令会自动更新grub的
- 查看-切换内核版本
你可以通过uname -a
来查看当前内核版本,比如你当前系统内核是6.10.1,你下载了一个6.10.2的内核源码,在你编译安装切换之后,你输入命令能查看到你换了新版本的内核
- 卸载内核
查看已经安装的内核
sudo dpkg --list | grep linux-image
删除制定内核
sudo apt purge linux-image-6.1.0-23-amd64
然后重启就好了
你可以通过uname -a
来查看当前内核版本,比如你当前系统内核是6.10.1,你下载了一个6.10.2的内核源码,在你编译安装切换之后,你输入命令能查看到你换了新版本的内核
怎么切换内核呢,如果是双系统或者虚拟机的话,在你安装完Linux操作系统,开机之后,应该能看到多了一些东西,那个叫做 UEFI引导,如图
Advanced options for Debian GUN/Linux
这个里面就可以选择系统内核,如果你安装成功之后,在这里面就可以看到你安装的内核(无视我脏掉的屏幕)
也可以直接选择第一个选项Debian GUN/Linux
,默认情况下会直接启动最新的内核(最后安装的内核)
你编译最终产生的内核文件存放位置再linux/arch/(你电脑的架构)/boot/bzImage,架构的查看命令:uname -a
,至于为什么说这个,以后会考的
那么,恭喜你,你已经成功的编译并替换Kernel了