學(xué)編程不知如何入門?10 年經(jīng)驗(yàn)的底層開發(fā)程序員,教你如何入門!
“師傅領(lǐng)進(jìn)門,修行在個(gè)人”。Github上一位擁有10年底層開發(fā)經(jīng)驗(yàn)的老程序員gurugio,整理了一套適合嵌入式或底層開發(fā)(Low-Level Programming)的程序員入門指導(dǎo)。來幫助眾多的初學(xué)者成為一名初級(jí)的底層開發(fā)程序員和Linux內(nèi)核工程師。

他在底層開發(fā)擁有超過10年的從業(yè)經(jīng)驗(yàn),一直從事以下的工作:
80x86匯編編程
硬件設(shè)備與Atmel芯片和固件
Unix的C語言系統(tǒng)編程
Linux中的設(shè)備驅(qū)動(dòng)程序
Linux內(nèi)核:頁面分配
Linux內(nèi)核:塊設(shè)備驅(qū)動(dòng)和md模塊
一、什么是底層開發(fā)?
底層開發(fā)是非常接近機(jī)器的編程,使用底層開發(fā)語言(如C或匯編)。這與使用高級(jí)語言(例如Python,Java)的程序員進(jìn)行編程不同。
維基百科:底層開發(fā)
系統(tǒng)編程與底層開發(fā)的一個(gè)非常接近的概念。該頁面包括系統(tǒng)編程中未包含的硬件設(shè)計(jì)和固件開發(fā)。
維基百科:系統(tǒng)編程
系統(tǒng)編程包括從硬件組件到Linux內(nèi)核的內(nèi)容。這里你能通過文檔落得理論基礎(chǔ),但一頁文檔永遠(yuǎn)不會(huì)覆蓋所有層的細(xì)節(jié),因此本文檔的目的是作為底層開發(fā)的起點(diǎn)。
二、理論
底層開發(fā)有兩個(gè)背景理論:
計(jì)算機(jī)體系結(jié)構(gòu)
操作系統(tǒng)
可以在網(wǎng)上找到很多好的課程。理論是理論,只需了解課堂上的內(nèi)容大綱,打好理論基礎(chǔ)。

三、編程語言
1.部件
8086匯編編程與emu8086包涵:
CPU和計(jì)算機(jī)體系結(jié)構(gòu)的基本概念
C編程語言的基本概念
64位匯編程序包涵:
現(xiàn)代CPU和計(jì)算機(jī)架構(gòu)的基本概念
C代碼的拆解和調(diào)試的基本概念
2.C語言
沒有捷徑。只能閱讀以下書籍并解決所有的練習(xí)。
C編程:現(xiàn)代方法第2版
C編程語言第2版
現(xiàn)代C:對(duì)于C的新標(biāo)準(zhǔn)
并行編程困難,如果是這樣,你能做什么呢?
原始實(shí)現(xiàn)與C同步,大規(guī)模C編程(特別是內(nèi)核編程)的基本要素
C編程挑戰(zhàn)?
計(jì)劃像Eudyptula挑戰(zhàn)賽的任務(wù)
你的想法和思路
如果你可以完成該頁面中的所有小項(xiàng)目,那么你將能夠嘗試大型項(xiàng)目。

四、應(yīng)用
1.硬件&固件
如果想成為嵌入式系統(tǒng)工程師,最好從簡單的硬件套件開始,而不是從最新的ARM芯片組開始。
2.Arduino啟動(dòng)套件
有各種系列的Arduino,但“Arduino啟動(dòng)工具”有最簡單的處理器(Atmega328P)和指導(dǎo)書
Atmega328P具有8位內(nèi)核,開始“數(shù)字電路設(shè)計(jì)”和“Firware開發(fā)”。
你不需要知道如何繪制原理圖和布局,并組裝芯片。
但是需要知道如何閱讀原理圖并了解芯片的連接方式。
固件開發(fā)人員應(yīng)該能夠閱讀原理圖,并找出如何將數(shù)據(jù)發(fā)送到目標(biāo)設(shè)備。
按照指導(dǎo)書!
3.8086手冊(cè)
如果是x86架構(gòu)的初學(xué)者,8086也是處理器架構(gòu)和80x86程序集的非常好的指南
4.80386手冊(cè)
80x86處理器的保護(hù)模式和尋呼機(jī)制的最佳指南
網(wǎng)頁版本:https://pdos.csail.mit.edu/6.828/2011/readings/i386/toc.htm
在這些基礎(chǔ)之上,你可以開始接觸ARM或x86處理器。
https://www.raspberrypi.org/
https://beagleboard.org/
https://www.arduino.cc/en/ArduinoCertified/IntelEdison
例如,Raspberry Pi板具有支持64位指令集的Cortex-A53處理器。這允許你體驗(yàn)具有rPi的現(xiàn)代處理器架構(gòu)。是的,你可以買它,但是你要怎么做?如果你沒有目標(biāo)項(xiàng)目,可能會(huì)將該板放入抽屜中,并將其忘記。
所以,我為你推薦一個(gè)項(xiàng)目。
制作自己的內(nèi)核
參考資料:https://www.reddit.com/r/osdev/
我制作了一個(gè)支持64位長模式,分頁和非常簡單的上下文切換的toy內(nèi)核。制作toy內(nèi)核是了解現(xiàn)代計(jì)算機(jī)架構(gòu)和硬件控制的好方法。
實(shí)際上,你已經(jīng)有最新的處理器和最新的硬件設(shè)備。你的筆記本電腦!你的桌面!你已經(jīng)有了所有的開始!你不需要買任何東西。qemu仿真器可以模擬最新的ARM處理器和Intel處理器。所以你需要的一切已經(jīng)在手。有很多toy內(nèi)核和文件可以參考。只需安裝qemu模擬器,并制作一個(gè)小型內(nèi)核,只需啟動(dòng)并打開分頁,并打印一些消息。
其他toy內(nèi)核:
https://littleosbook.github.io/
https://tuhdo.github.io/os01/

五、Linux內(nèi)核和設(shè)備驅(qū)動(dòng)
不需要制作完整的操作系統(tǒng)。加入Linux社區(qū)并參與開發(fā)。
閱讀以下書籍:
《Unix操作系統(tǒng)的設(shè)計(jì)》:Unix的基本概念適用于所有操作系統(tǒng)。很好的了解操作系統(tǒng)的概念。
《Linux設(shè)備驅(qū)動(dòng)程序》:做所有的用例。
《Linux內(nèi)核開發(fā)》:了解Linux內(nèi)核的設(shè)計(jì)。
《了解Linux內(nèi)核》:閱讀本書,了解內(nèi)核源碼v2.6
使用qemu和gdb逐行運(yùn)行內(nèi)核源代碼
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來做最簡單的文件系統(tǒng),只需要1秒鐘即可引導(dǎo)
https://gurugio.kldp.net/wiki/wiki.php/qemu_kernel
Eudyptula挑戰(zhàn)賽
這就像一個(gè)非常棒的私人老師,指導(dǎo)你做什么。
塊層和設(shè)備驅(qū)動(dòng)程序(還在整理中)
Linux內(nèi)核的md驅(qū)動(dòng)程序(正在進(jìn)行中)
mdadm工具如何工作以及如何調(diào)用md驅(qū)動(dòng)程序
md驅(qū)動(dòng)程序的工作原理
參考文獻(xiàn)
檢查什么時(shí)候需要什么
自由電子主頁(Free-electrons homepage):許多幻燈片文件引入了很好的話題,特別是ARM-linux
朱莉婭·埃文斯的發(fā)布:你可以是一個(gè)內(nèi)核黑客!:指導(dǎo)啟動(dòng)內(nèi)核編程。

六、未來的底層開發(fā)
我不知道未來,但我注意到了RUST。如果有一個(gè)星期的空余時(shí)間,我會(huì)學(xué)習(xí)RUST。因?yàn)镽UST是可以開發(fā)Linux設(shè)備驅(qū)動(dòng)程序的最新語言。
IoT是新的趨勢(shì),所以值得檢查什么操作系統(tǒng)可滿足IoT開發(fā)。ARM,三星和一些公司都有自己的操作系統(tǒng),但可獲得的資料太少了。但Linux基金會(huì)提供了一個(gè)解決方案:Zephyr
典型的云服務(wù)器有很多層次,例如主機(jī)操作系統(tǒng),kvm驅(qū)動(dòng)程序,qemu進(jìn)程,客戶操作系統(tǒng)和服務(wù)應(yīng)用程序。因此,容器已經(jīng)開發(fā)出來提供輕型虛擬化。在不久的將來,一個(gè)新的OS概念,即所謂的庫OS或Unikernel,將替代虛擬化的典型的SW堆棧。
獲得本文提到的所有Github庫資源,請(qǐng)?jiān)L問https://github.com/gurugio/lowlevelprogramming-university#linux-kernel-and-device-driver

學(xué)習(xí)C/C++編程知識(shí),提升C/C++編程能力,歡迎關(guān)注UP一起來成長!
另外,UP在主頁上傳了一些學(xué)習(xí)C/C++編程的視頻教程,有興趣或者正在學(xué)習(xí)的小伙伴一定要去看一看哦!會(huì)對(duì)你有幫助的~