学编程不知如何入门?10 年经验的底层开发程序员,教你如何入门!

我只是一个虾纸丫 提交于 2020-07-26 09:20:35

“师傅领进门,修行在个人”。Github上一位拥有10年底层开发经验的老程序员gurugio,整理了一套适合嵌入式或底层开发(Low-Level Programming)的程序员入门指导。来帮助众多的初学者成为一名初级的底层开发程序员和Linux内核工程师。

他在底层开发拥有超过10年的从业经验,一直从事以下的工作:

80x86汇编编程

硬件设备与Atmel芯片和固件

Unix的C语言系统编程

Linux中的设备驱动程序

Linux内核:页面分配

Linux内核:块设备驱动和md模块

一、什么是底层开发?

底层开发是非常接近机器的编程,使用底层开发语言(如C或汇编)。这与使用高级语言(例如Python,Java)的程序员进行编程不同。

维基百科:底层开发

系统编程与底层开发的一个非常接近的概念。该页面包括系统编程中未包含的硬件设计和固件开发。

维基百科:系统编程

系统编程包括从硬件组件到Linux内核的内容。这里你能通过文档落得理论基础,但一页文档永远不会覆盖所有层的细节,因此本文档的目的是作为底层开发的起点。

二、理论

底层开发有两个背景理论:

计算机体系结构

操作系统

可以在网上找到很多好的课程。理论是理论,只需了解课堂上的内容大纲,打好理论基础。

三、编程语言

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


自学C/C++编程难度很大,不妨和一些志同道合的小伙伴一起学习成长!

C语言C++编程学习交流圈子,【点击进入微信公众号:C语言编程学习基地

有一些源码和资料分享,欢迎转行也学习编程的伙伴,和大家一起交流成长会比自己琢磨更快哦!

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!