“师傅领进门,修行在个人”。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设备驱动程序》:做所有的用例。
使用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