热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

Kbuild编译Linux内核系列(一)

Author:WeiYang作者公众号:杨小伟的世界内核编译是一个非常生僻的领域,哪怕是做内核的童鞋也不一定关注过整个内核编译的流程,更不用说内核的门外汉了。然而了解学习内核编译系


Author: Wei Yang


作者公众号:杨小伟的世界


内核编译是一个非常生僻的领域,哪怕是做内核的童鞋也不一定关注过整个内核编译的流程,更不用说内核的门外汉了。


然而了解学习内核编译系统,可能会有你意想不到的收获。我在这个过程中从以下几个方面获得收益。



  • 深入的理解_ makefile _如何管理大型项目

  • 编译出错了也不会那么慌张

  • 多年后才明白究竟是哪个文件才是放在 /boot/ 目录下的那个启动文件以及它和另一个很像的文件之间的差别

  • 节省了编译时间,不会每次都用 make all 这种粗暴的方式了

  • 传说的 make -j8 中,这8个进程是在什么条件下才能开启的

  • 进一步的了解了整个内核的构造,而不是仅仅知道自己做的那一块了

  • 了解了某些编译链接细节,帮助看懂内核启动时的一些操作


但是很多人,包括我自己在很长的一段时间内都没有相对仔细阅读和研究内核编译的过程。在此,我希望通过分享自己一点点的经验,帮助大家破除对内核编译系统的抵触,快速掌握内核编译系统的整体架构,为后续的深入研究开一个好头。


鉴于本人经验尚浅,或有不透彻甚至是错误的地方,还望大家包涵。如能告知,万分感谢。


先用起来


大多数人都是从最简单的开始的,我也不例外。首先你得有这么一个环境,能够编译内核,接下来你才有机会去修改去实验去探索内核编译的过程。


第一步先



编译出你的第一个内核


由此小白们可以体会一下编译的过程,和使用自己编译的内核的快乐。也为后续我们做深入的实验做好准备。


在了解了基本的编译过程和步骤之后,我们再来看看那些



内核编译中的小目标


这些小目标可以帮助我们



  • 生成辅助资料

  • 生成单个目标文件

  • 节约时间

  • 偶尔可以帮助一下调试


或许你会发现某个对你有用的~


跟着我走



现在我们已经会使用基本的命令制作出内核和一些小目标了。说实话,整个 kbuild
系统还是有点复杂的。不过不用担心,我们先来三个简单的小目标,了解一下基本的运作方式。或许你会觉得并没有想象中的那么高不可攀,或许可以让自己觉得还是有那么点机会可以看懂的~


先来一个最简单最直接的



可能是kbuild中最直接的小目标 — help



看了这个例子,你或许会觉得不过瘾。什么嘛,这个 help
的目标就和平时自己写的 makefile
的套路是一样的。没有什么花头,也不是什么高级货。好了,这次我们来一个稍微复杂一些的。上面的例子太直接了只有一个层次的结构,那这次来一个有两层的看看。



使用了一个kbuild函数的目标 — cscope



有了上述这两个不是编译目标的目标,我们已经储备了相当的 make
kbuild
知识,了解了一定的 kbuild
系统结构,接下来来看一个稍微复杂一点但相对还是比较直接的目标。这次可是货真价实的编译目标了哦~



内核中单个.o文件的编译过程


真刀真枪


能走到这,而且看懂上面三个小目标的基本上已经储备了足够多的基础知识。正所谓养兵千日,用兵一时,接下来我们就该动真格的了~


在根目录下最明显的内核目标就数 vmlinux 了。不过编译内核这么多年,安装内核无数次,却从来都没有好好研究过他老人家出生的过程。那我们就先来看看



根目录vmlinux的编译过程



研究完了根目录的 vmlinux ,我突然发现还有一个叫 bzImage 的目标。也是啊,内核不是说要压缩的么? vmlinux 是 ELF
格式,那就能被直接加载到内存了?带着这些疑惑,让我们来探索一下



启动镜像bzImage的前世今生


探索的过程中发现 bzImage 是由 setup.bin 和 vmlinux.bin 两个目标粘合而成。看来马上就要弄明白整个 bzImage 编译过程了。咱逐个探索~



setup.bin的诞生记
和 真假vmlinux–由vmlinux.bin揭开的秘密



终于,经历了九九八十一难之后,可以说彻底的理解了内核编译的整个过程,也对 kbuild
系统架构有了基本的认识。可以学成下山了。


写在最后



整个内核的编译系统依然是十分庞大复杂的。其中还有不少细枝末节在本系列中没有深入仔细地去分析,讲解和探索。经过了这么一段时间的磨练,相信大家已经掌握了基本的知识,对 kbuild
系统运作原理有了深入了解,若能为大家进一步的探索打下了基础也算是没有白费功夫。


本系列文章或许还会再修正更新增加,本次更新就先到这里。愿大家能够在内核探索的道路上勇猛精进。


送君千里,终须一别,我们来日江湖再见~



本文是 LinuxStory
柴米油盐计划

的投稿文章,由 LinuxStory 整理发布。


原作者署名为:Wei Yang 。


转载请注明出处,否则必究相关责任。



本文链接: https://linuxstory.org/kbuild-linux-1/




推荐阅读
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • CentOS7源码编译安装MySQL5.6
    2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 解决微信电脑版无法刷朋友圈问题:使用安卓远程投屏方案
    在工作期间想要浏览微信和朋友圈却不太方便?虽然微信电脑版目前不支持直接刷朋友圈,但通过远程投屏技术,可以轻松实现在电脑上操作安卓设备的功能。 ... [详细]
  • 本文详细记录了在银河麒麟操作系统和龙芯架构上使用 Qt 5.15.2 进行项目打包时遇到的问题及解决方案,特别关注于 linuxdeployqt 工具的应用。 ... [详细]
  • 尽管深度学习带来了广泛的应用前景,其训练通常需要强大的计算资源。然而,并非所有开发者都能负担得起高性能服务器或专用硬件。本文探讨了如何在有限的硬件条件下(如ARM CPU)高效运行深度神经网络,特别是通过选择合适的工具和框架来加速模型推理。 ... [详细]
  • iTOP4412开发板QtE5.7源码编译指南
    本文详细介绍了如何在iTOP4412开发板上编译QtE5.7源码,包括所需文件的位置、编译器设置、触摸库编译以及QtE5.7的完整编译流程。 ... [详细]
  • 本文介绍如何在Ubuntu环境下为OpenWrt系统构建并安装首个'Hello World'应用程序的IPK包。文章不仅涵盖了基本的环境搭建,还详细说明了代码编写、Makefile配置及最终的IPK包生成与安装过程。 ... [详细]
  • 本文详细介绍了如何通过修改Lua源码或使用动态链接库(DLL)的方式实现Lua与C++之间的高级交互,包括如何编译Lua源码、添加自定义API以及在C++中加载和调用Lua脚本。 ... [详细]
  • 本文介绍了在Makefile及Android.mk文件中添加打印输出信息的方法,并详细解析了Android编译过程中的关键步骤,包括环境变量的设置与编译脚本的执行。 ... [详细]
  • OpenWrt 是一款高度可定制的嵌入式 Linux 发行版,广泛应用于无线路由器等领域,拥有超过百个预装软件包。本文详细探讨如何在 OpenWrt 上通过 Luci 构建自定义模块,以扩展其功能。 ... [详细]
  • 本文详细记录了在Ubuntu 9.10操作系统上从零开始搭建LAMP(Linux, Apache, MySQL, PHP)环境的过程,包括遇到的问题及解决方案。旨在为初次尝试搭建LAMP环境的开发者提供参考。 ... [详细]
  • PHP 5.5.0rc1 发布:深入解析 Zend OPcache
    2013年5月9日,PHP官方发布了PHP 5.5.0rc1和PHP 5.4.15正式版,这两个版本均支持64位环境。本文将详细介绍Zend OPcache的功能及其在Windows环境下的配置与测试。 ... [详细]
  • QEMU环境下加载首个Linux驱动模块
    本文介绍了如何在Ubuntu 20.04系统上使用QEMU虚拟机加载一个简单的Linux驱动模块。此过程涉及Linux内核4.0版本的配置与编译。 ... [详细]
  • 我们正在使用GNU Make来构建我们的系统,在makefile文件的末尾,我们通过一个名为Makedepends的包含来生成一系列的.d文件。然而,当文件被删除或移动时,依赖关系会中断,我们需要寻找一种方法来优雅地处理这种情况。 ... [详细]
author-avatar
岸本瑠可的秘密_344
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有