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


    “师傅领进门,修行在个人”。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语言编程学习基地

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

  • 相关阅读:
    转:专题五线程同步——事件构造
    转:专题四线程同步
    转:专题三线程池中的I/O线程
    转:[C# 开发技巧]如何防止程序多次运行
    转:专题二线程池中的工作者线程
    转:专题一线程基础
    C# 设置按钮快捷键
    jmeter链接多台负载机报错
    java读取properties
    使用Runtime.getRuntime().exec()方法的几个陷阱
  • 原文地址:https://www.cnblogs.com/yxy6/p/13307268.html
Copyright © 2020-2023  润新知