编译linux内核
编译内核
一听就有点上档次,但是不管这个操作到底有好高大上,俗话说得好
一切从实际出发,理论结合实际,实事求是,在实践中检验真理并发展真理,人参补酒王八汤。。。
要编译内核关键就是编译过后我咋晓得我到底编译成功没有喃?要想验证就在内核中加入自己的代码,编译完内核后,调用一哈就晓得自己到底成功没有。步骤就是:
- 通过
sudo apt-get install linux-source-4.15.0
下载linux内核源码 - 将下图代码添加到sys.c文件中
- 在类似于表映射文件syscall_64.tbl中修改如下代码
- 这一步我感觉好像可以不用。。
- 然后就是正式编译了
- 最后就是在内核安装结束后,写自己的测试程序,然后观察结果,两行的结果中的第一列应该是相同的因为第一项是从1970年到现在的系统记录的是时间,以秒为单位,而这个程序一般来说要不到什么时间,除非你在一分钟的最后59的最后机微妙精确的执行才会不同,而第二项一般都要差几个数,第二项是修饰第一项中最后一秒里面走到了多少微妙就相当于一点半修饰一点这个小时里面走了多少分钟
- 最后就是截图
提供几个非常好的,我在编译linux内核中遇到问题的博客
大概的步骤可以参考这篇ubuntu编译内核流程
当遇到磁盘空间不够的时候,千万不要去干重装这种浪费时间的事,最好的办法:扩展空间
这篇为博客相当好: Ubuntu使用Gparted扩展分区空间
再有就是编译的时候我们用的都是make[…]等命令,为啥我们不用最常见的gcc命令喃?
这两篇博客好: makefile粗略认识 和 跟我一起写Makefile
看了这两个博客之后就可以干点有意思的事情了~,比如说自己悄悄咪咪的把内核源码那个文件夹头的Makefile拷贝出来,自己写那个Makefile,然后假装遇到困难,去找自己的同学(不要切找那种很凶的,因为别个可能早就晓得了),然后就假装自己遇到了看不懂的提示,就是自己一输make命令就弹出来个莫名其妙的提示,然后其他的就自己发挥了 ~除了这个Makefile还有就是printk,一起用。。。
然后就是编译的时候太慢,因为我们老师提都没给我们这个小东西,我们就瓜兮兮的编译,一编就3、4个小时,其实是可以用更短的时间的,用 make -j4
,这就是开多线程并发便宜,因为现在电脑大多都是多核,可以达到真正的并发,我是从这篇博客 985的计算机学到的,他里面有很多截图我就不上我自己的图了~
我的cpu是四核四线程,我把那个逻辑处理器当成线程数,可以让任务管理器把cpu性能显示成几张图,有几张图就是几线程,然后在虚拟机里面设置一哈就可以跑了,确实不一样!我之前一个线程要四个小时左右,现在要一个小时20分钟。但是这就有个问题了,按理来说一个线程四个小时,那四个线程应该稳进1个小时左右三,左右分钟三,但是这个为啥会差二十多分钟将近半个小时,经过我的观察,如果四线程要是起作用的话的上面那张图里面的四个小框框都会使用率100%的情况,但是在编译过程中有一些情况是cpu的使用率会降下来的情况,也就是说可能Makefile中写的并不是所有的文件编译都能采用并发的情况,有些文件的编译只能用单线程来,并发可能会出现某种问题,所以就不是简单的线性关系。
经过上面的九九八十一难之后,我终于。。。系统崩溃了
看来九九八十一难我才经历了八十难,革命尚未成功啊~
我第一反应就是我把原本的内核整坏了,导致开不了机,但这里其实不是这么回事,但是如果真的是内核出了问题,尽量不要重装因为你的系统一般不止一个内核,可以进入GRUB引导选择可以用的内核进入系统,或者真的没有其他可以用的内核的话,可以参考这篇文章linux修复内核 和 ubuntu内核损坏的修复,只是参考,因为毕竟出问题开不了机的时候,只有通过U盘或者光盘开机,然后打开的是光盘或者U盘中的系统,你需要挂在自己的分区才能访问到自己电脑中的数据,所以你要想装入新的内核就必须要把自己电脑中的一些重要分区都挂载进来,然后装内核才会真正装到你的电脑中。
不过这个提示信息是out of memory and no killab.....
, 这个的解决办法就是把自己虚拟机的内存设置高一点,我感觉之所以自己的内核编译后会出现这种问题,就是系统的内核是经过某种优化处理的,所以我只用设置1G内存就够用了,但是我们自己拿到源码就开始乱整编译出来的东西,没有经过处理,所以在性能上面有差距。
进去以后通过GRUB引导,选择内核,这个内核会更具版本的高低自动降序排列,所以编译之前就要记住自己到编译的什么版本的内核,还有就是如果时间安装的现成的内核,我感觉后面就有(-generic)字样, 因为我自己编译的内核就没有generic
还有就是网上有删除内核的方法,但是那些都是针对那些能够通过命令找到img文件的内核(我就把这一类的内核成为正规安装的内核,我们自己编译安装的内核就是歪内核),如果想删除自己编译的歪内核,就需要自己手动删除,这篇 删除linux内核的方法 ,我试过了反正把/boot
目录下的下的内核文件都删干净了而且还更新了GRUB中的内容,因为内安装都是默认安装到/boot
下的,因为/boot
是开机启动的目录