"师傅领进门,修行在个人"。Github上一位拥有10年底层开发经验的老程序员gurugio,整理了一套适合嵌入式或底层开发(Low-Level Programming)的程序员入门指导。来帮助众多的初学者成为一名初级的底层开发程序员和Linux内核工程师。 他在底层开发拥有超过10年的从业经验,一直从事以下的工作: 80x86汇编编程 硬件设备与Atmel芯片和固件 Unix的C语言系统编程 Linux中的设备驱动程序 Linux内核:页面分配 Linux内核:块设备驱动和md模块 一、什么是底层开发? 底层开发是非常接近机器的编程,使用底层开发语言(如C或汇编)。这与使用高级语言(例如Python,Java)的程序员进行编程不同。 维基百科:底层开发 系统编程与底层开发的一个非常接近的概念。该页面包括系统编程中未包含的硬件设计和固件开发。 维基百科:系统编程 系统编程包括从硬件组件到Linux内核的内容。这里你能通过文档落得理论基础,但一页文档永远不会覆盖所有层的细节,因此本文档的目的是作为底层开发的起点。 二、理论 底层开发有两个背景理论: 计算机体系结构 操作系统 可以在网上找到很多好的课程,例如Coursera.org和edx.org。理论是理论,只需了解课堂上的内容大纲,打好理论基础。 三、编程语言 1.部件 8086汇编编程与emu8086包涵: CPU和计算机体系结构的基本概念 C编程语言的基本概念 64位汇编程序包涵: 现代CPU和计算机架构的基本概念 C代码的拆解和调试的基本概念 2.C语言 没有捷径。只能阅读以下书籍并解决所有的练习。 C编程:现代方法第2版 C编程语言第2版 现代C:对于C的新标准 并行编程困难,如果是这样,你能做什么呢? 原始实现与C同步,大规模C编程(特别是内核编程)的基本要素 C编程挑战? 计划像Eudyptula挑战赛的任务 你的想法和思路 如果你可以完成该页面中的所有小项目,那么你将能够尝试大型项目。 四、应用 1.硬件&固件 如果想成为嵌入式系统工程师,最好从简单的硬件套件开始,而不是从最新的ARM芯片组开始。 2.Arduino启动套件 有各种系列的Arduino,但"Arduino启动工具"有最简单的处理器(Atmega328P)和指导书 Atmega328P具有8位内核,开始"数字电路设计"和"Firware开发"。 你不需要知道如何绘制原理图和布局,并组装芯片。 但是需要知道如何阅读原理图并了解芯片的连接方式。 固件开发人员应该能够阅读原理图,并找出如何将数据发送到目标设备。 按照指导书! 3.8086手册 如果是x86架构的初学者,8086也是处理器架构和80x86程序集的非常好的指南 4.80386手册 80x86处理器的保护模式和寻呼机制的最佳指南 网页版本:https://pdos.csail.mit.edu/6.828/2011/readings/i386/toc.htm 在这些基础之上,你可以开始接触ARM或x86处理器。 https://www.raspberrypi.org/ https://beagleboard.org/ https://www.arduino.cc/en/ArduinoCertified/IntelEdison 例如,Raspberry Pi板具有支持64位指令集的Cortex-A53处理器。这允许你体验具有rPi的现代处理器架构。是的,你可以买它,但是你要怎么做?如果你没有目标项目,可能会将该板放入抽屉中,并将其忘记。 所以,我为你推荐一个项目。 制作自己的内核 参考资料:https://www.reddit.com/r/osdev/ 我制作了一个支持64位长模式,分页和非常简单的上下文切换的toy内核。制作toy内核是了解现代计算机架构和硬件控制的好方法。 实际上,你已经有最新的处理器和最新的硬件设备。你的笔记本电脑!你的桌面!你已经有了所有的开始!你不需要买任何东西。qemu仿真器可以模拟最新的ARM处理器和Intel处理器。所以你需要的一切已经在手。有很多toy内核和文件可以参考。只需安装qemu模拟器,并制作一个小型内核,只需启动并打开分页,并打印一些消息。 其他toy内核: https://littleosbook.github.io/ https://tuhdo.github.io/os01/ 五、Linux内核和设备驱动 不需要制作完整的操作系统。加入Linux社区并参与开发。 阅读以下书籍: 《Unix操作系统的设计》:Unix的基本概念适用于所有操作系统。很好的了解操作系统的概念。 《Linux设备驱动程序》:做所有的用例。 《Linux内核开发》:了解Linux内核的设计。 《了解Linux内核》:阅读本书,了解内核源码v2.6 使用qemu和gdb逐行运行内核源代码 http://stackoverflow.com/questions/11408041/how-to-debug-the-linux-kernel-with-gdb-and-qemu https://gurugio.kldp.net/wiki/wiki.php/howto_debug_kernel 使用busybox来做最简单的文件系统,只需要1秒钟即可引导 https://gurugio.kldp.net/wiki/wiki.php/qemu_kernel Eudyptula挑战赛 这就像一个非常棒的私人老师,指导你做什么。 块层和设备驱动程序(还在整理中) Linux内核的md驱动程序(正在进行中) mdadm工具如何工作以及如何调用md驱动程序 md驱动程序的工作原理 参考文献 检查什么时候需要什么 自由电子主页(Free-electrons homepage):许多幻灯片文件引入了很好的话题,特别是ARM-linux 朱莉娅·埃文斯的发布:你可以是一个内核黑客!:指导启动内核编程。 六、未来的底层开发 我不知道未来,但我注意到了RUST。如果有一个星期的空余时间,我会学习RUST。因为RUST是可以开发Linux设备驱动程序的最新语言。 IoT是新的趋势,所以值得检查什么操作系统可满足IoT开发。ARM,三星和一些公司都有自己的操作系统,但可获得的资料太少了。但Linux基金会提供了一个解决方案:Zephyr 典型的云服务器有很多层次,例如主机操作系统,kvm驱动程序,qemu进程,客户操作系统和服务应用程序。因此,容器已经开发出来提供轻型虚拟化。在不久的将来,一个新的OS概念,即所谓的库OS或Unikernel,将替代虚拟化的典型的SW堆栈。 获得本文提到的所有Github库资源,请访问https://github.com/gurugio/lowlevelprogramming-university#linux-kernel-and-device-driver