推薦語
最近在充電,沒來得及輸出筆記。本次先給大家?guī)硪晃磺拜叺?a href="/tags/嵌入式" target="_blank">嵌入式Linux學習經驗及一些學習資料清單,跟著大佬走不迷路。這份資料清單有點長。。。
下轉原文:
嵌入式 Arm Linux 入門必讀書籍推薦
前段時間有個剛開始學習 Arm Linux 的同學問我:對于還處于入門階段的新手,有什么建議。并讓我推薦一些好的書籍。
嵌入式 Linux 是一個龐大的系統(tǒng),涉及到硬件和計算機科學,是橫跨電子和計算機的綜合學科。很多從電子相關專業(yè)切入的學生對計算機原理和操作系統(tǒng)不了解,而從計算機相關專業(yè)切入的同學對硬件、電路也很迷惑,所以入門確實是有一定的難度的。
然后我告訴這位同學:首先得有興趣,興趣是克服一切困難的源動力。然后要善于利用網絡和身邊的資源,多嘗試、多搜索、多討論。
我本人也是電子相關專業(yè)(自動化)畢業(yè)的,大四找工作之前在實驗室一直玩 51 單片機 和 Cortex-M3,可是機緣巧合卻面試進了一家做 Android 的公司——面試之前,我看招聘要求上只寫了要熟悉 Arm 體系結構,Cortex-M3 也是 Arm 啊,所以我就去面試了,最后竟然拿到了 offer。簽三方的時候 HR 說:你回去后要開始學 Linux,這是你進來后工作的重點技術。我點頭說:好的、好的……
出來后我就蒙了——Linux!WTF!我要是看到招聘要求上有寫 Linux,再給我個膽子我也不敢去面試啊!
回來后去實驗室,老師知道我簽了這家公司,還是很高興的!說你先學會怎么在 Linux 系統(tǒng)下工作吧,不然你連門的入不了。
于是老師給我找了一臺臺式機,裝了 Ubuntu,然后又從實驗室倉庫的最里面翻出來了一塊 S3C2410 的開發(fā)板—— 沒錯,我沒寫錯,就是 2410。因為我們是自動化院系,大部分老師的項目都是和各種廠礦、車間的控制相關,這里面大部分都是用 PLC、單片機、MCU 來做控制,跑 Linux,那是不存在的!老師說,一個控制不當,機毀人亡,那是要去坐牢的。所以院系里也沒人玩 Linux、這塊開發(fā)板還是好幾年前一家公司來做推廣的時候送的。我會玩玩 Ubuntu 已經是比較潮流的了。
于是后面的幾個月我就在這塊 S3C2410 的板子上開始了 Arm Linux 的入門學習:不停的重復實驗、不停的上網搜索……
后面就畢業(yè),順利入職。工作后蠻順利,在各種芯片上折騰 Android、Linux,樂此不疲。
得益于入門時期的特殊經歷,我對業(yè)內的相關書籍一直比較關注,看到哪位大牛出版了好書,就忍不住要買回來,看到網上有對應的 PDF 版本,也一定會想辦法下下來。
所以剛好這幾天有空,我就把這些我看過的書單整理了出來,希望對大家有所幫助:
這些書籍我按照 Arm Linux 系統(tǒng)所需要的知識結構,做了分類:
Linux 系統(tǒng)環(huán)境
Git 版本管理
C 語言和匯編
Arm 體系結構
Linux 應用編程
Linux 內核基礎原理
Linux 內核開發(fā)與實踐
操作系統(tǒng)理論與基礎
前三類是基礎,無論從事哪個方向的開發(fā),這些都是必須要熟練掌握的基本功。后面五類是相輔相成的,理論基礎相當于內功心法,開發(fā)實踐相當于招式,要相互結合相互印證。招式好上手,使起來也漂亮,可以讓你快速在江湖上闖出一定的小名頭,但是要想走的更遠、飛的更高、躋身真正的高手行列,還是離不開深厚的內功心法。
1、Linux 系統(tǒng)環(huán)境
熟悉 Linux 系統(tǒng)環(huán)境是一切的前提 —— Linux 系統(tǒng)環(huán)境中,最強大的開發(fā)武器是命令行和 Shell 腳本。
為什么?因為大量(幾乎所有)的開源項目的編譯、配置、都是通過命令行實現(xiàn);在涉及海量源碼的工程下,命令行的 find、grep 命令可以提供強大、高效的搜索功能,能幫忙快速的定位、理解源碼;通過 Shell 腳本能夠讓大量重復的工作自動化,節(jié)省時間和生命。我曾經向 U-Boot 和 Linux Kernel mainline 提交過兩個補丁,涉及到大幾十個文件中雷同代碼的修改,如果一步步手工修改,可能要幾天時間,我花了大半天的時間寫了個腳本利用 sed
命令來處理,跑一把就搞定了。
我聽到過很多還處在入門階段的同學說:以后的趨勢是桌面化、圖形化、所以我不需要命令行。其實這種看法是不對的,至少在可以看到的將來,命令行沒有被取代的趨勢。至少我現(xiàn)在還經??吹接型瑢W問:我照著教程敲的這個命令,為什么報錯了?我問他:你明白這個命令是什么意思嗎?你看懂它報錯的提示信息了嗎?他說不知道。所以你要熟悉命令行,至少你要知道你敲下去的每個命令是什么意思,能看懂它的錯誤提示信息。能會用 help
命令行去查閱相關工具的用法。
所以這部分我推薦了四本書(資料):
《LINUX命令行與SHELL腳本編程大全》第三版
這本書是一個外國人寫的,然后中國人翻譯,是一本非常詳細的書籍,詳細的講解了 Linux 系統(tǒng)中各種常用命令的使用,以及使用 Linux 系統(tǒng)的一些通用原理。可以先粗讀一遍,后面當作工具書來用,需要的時候隨時查閱。
《Shell 編程大全》
這本書是在網上下的,我大部分的 Shell 腳本技和命令行技巧都是從這本書書里面學的,是我經常查閱的工具書。
《Shellbook》
也叫做《Shell編程范例》,是泰曉科技(也是魅族前 BSP 總監(jiān))的吳章金寫的開源書籍,雖然只有100多頁,但是在網絡上廣受歡迎。
《Shell 命令行操作》
這份 14 頁的 pdf 列舉了一些常用命令行的使用范例,可以做快速參考。
2、Git 版本管理
我把 Git 版本管理放在了第二位、是想凸顯它的重要性,在現(xiàn)在這種團隊化、快速迭代的開發(fā)模式中,用不好版本管理,開發(fā)工作也很難做的干凈高效。我現(xiàn)在寫文檔都是用 Git + Markdown + Github 做版本管理,發(fā)現(xiàn)錯誤隨時迭代修改。
據傳說,中國的第一代的程序員——求伯君、王江民,他們晚上下班之前會把主機上存儲自己寫的程序的軟件盤拆下來,帶回家——怕發(fā)生意外,自己寫的程序丟了?,F(xiàn)在依托 Git 這種版本管理工具,似乎再也沒有人有這種憂慮了。
其實版本管理工具很多,推薦 Git 是因為它用的廣泛,Android 項目用的是 Git做版本管理,Linux 內核、U-Boot 這些知名的開源項目都是用 Git 做版本管理,還有 Github、Gitlab、Gitee 這種代碼托管網站都是以 Git 作為基石,可見在版本管理上,Git 以及形成了一種生態(tài)級別的存在。所以你應該毫不猶豫的擁抱它。
對了,Git 的原型是 Linus 大神(就是寫出 Linux kernel 的那位)在一個星期內寫出來的。
我推薦了兩本書,對,兩本:
《GitHub 入門與實踐》
GitHub 是一個以 Git 技術作為依托實現(xiàn)的代碼托管網站,你可以在上面選擇以公開或者非公開的方式托管自己的代碼,公開的方式就是所有的人都可以瀏覽下載你的代碼,非公開的私有倉庫只有你自己才能看到你的代碼。
這本書主要講解了如何使用 GitHub,當然也列舉了常用的 Git 基礎操作。我把 Git 基礎操作這部分單獨列了出來,就是那份《Git基礎功能》,看完這份資料基本可以應付日常的版本管理了。
《Pro Git》第二版
這也是一本開源書籍,詳細講述了 Git 內部的基本原理,如果你想對 Git 有進一步的深入了解,去解決大型項目,多分支多倉庫管理中的更復雜問題,可以讀讀這本書。
3、C 語言和匯編
做嵌入式開發(fā)、C 語言的重要性就不用多說了,從 U-Boot 到 Linux kernel,已經各種基礎組件,基本都是用 C 語言寫的,所以要做一個好的嵌入式 Hacker,C 語言是必須會的。
不像 C 這種跨平臺的語言,匯編是和 CPU 體系結構強相關的一門語言,不同的架構 匯編都不一樣,比如 32 位的 Armv7 和 64 位的 Armv8 匯編就不一樣,比較難以掌握。
對于入門者來說,剛開始不會匯編也沒關系,對你的工作影響不大,因為絕大部分場景都用不到。
但是當你的技能提高的一定層次,掌握了匯編就會讓你更能深入系統(tǒng)內部,看清程序運行的內部機理。
U-Boot 和 Linux Kernel 中的第一段啟動代碼,基本都是匯編寫的,Cache、MMU 相關的控制,也只能通過匯編實現(xiàn)。
有時候一段 C 代碼運行異常,或者效率低下,或者你的 Linux 系統(tǒng)跑崩潰了,這時候把對應的代碼反匯編,從匯編級別的去分析,更容易發(fā)現(xiàn)問題之所在。我平時經常的一部分工作就是通過匯編去發(fā)現(xiàn)或者分析前線部門或者客戶報過來的各種疑難雜癥。
當然了,匯編不用把每一句都搞懂,只要能大概看懂常用的指令就行,具體遇到問題的時候再去查對應的匯編手冊,然后就是熟能生巧的問題了。
這里我推薦了三本 C 語言的書和 三份 Arm64 的匯編指令簡介:
《C 和 指針》
老外寫的書,適合有一定 C 語言基礎后提高進階用。
《C 語言深度剖析》
這本書只有 130 多頁,作者是中國人,是個牛人,而且已經出版發(fā)行到第二版,大家如果有機會可以考慮買正版支持一下,搞懂了這本書,面試啥的應該不成問題。
《高質量C++編程指南》
作者林銳博士,這本書用來培養(yǎng)自己的編碼規(guī)范比較好,也是在大學實驗室的適合,老師讓我打印出來學習的一份資料。
另外三份 PDF 是關于 Arm64 指令集的,都很簡短,最長的一份只有 135 頁,適合做 Arm 匯編手冊。用的時候拿來做參考,我沒有加 Arm32 指令集相關的,Arm32 有更好的書籍推薦。
4、Arm 體系結構
要想把 Arm 嵌入式 玩的溜,尤其是想了解整個系統(tǒng)的,對 Arm 體系結構還是要有一定的學習。如果深入到一定的層次,Arm 體系結構相關的,也是必須要熟悉的,因為很多優(yōu)化做到極致都是和體系結構緊密相關的。
上面是《奔跑吧 Linux Kernel》的作者笨叔叔前兩天在朋友圈幫國內手機大廠打的招聘信息,里面有對 Arm 體系結構的要求,大家可以自行感受下。
現(xiàn)階段的 Arm 處理器,應用最廣泛的大概分為三類:定位于 MCU 的 Cortex-M 系列,定位于應用處理器的 Cortex-A 系列:Armv7-A 和 Armv8-A,Armv7-A 是 32 位的 CPU,包括 Cortex-A7/A9/A15/A17 這些,比如大家常見的 i.MX6ULL 芯片就屬于 Arm Cortex-A7,Armv8-A 是 32 位的 CPU,包括 Cortex-A35/A53/A57/A72/A73 市面上在售 的 i.MX8,RK3399、以及現(xiàn)在的主流手機 CPU,都屬于 Armv8-A。
這部分我推薦了兩本書,剩下的都是 Arm 官方發(fā)布的文檔:
《ARM 嵌入式系統(tǒng)開發(fā)-軟件設計與優(yōu)化》
我印象中這本書的作者就是 Arm 公司的工程師,中文版是北航的一位老師翻譯的,本書介紹了 Arm11 之前的歷代經典架構,對 Arm 匯編指令,MPU、MMU、Cache、中斷等關鍵模塊的管理和應用介紹的十分詳細,甚至還專門用了兩章來介紹 Bootloader 和嵌入式操作系統(tǒng)的設計。
因為這本書寫作的時間比較早,所以沒有設計 Cortex-A 系列的處理器,但是它任然是一本值得強烈推薦的書,因為對于 32 位的 Arm 來說,他們的架構和匯編指令保持了很大的延續(xù)性,把這本書看懂了,對 Arm 架構的理解也就不存在什么障礙了。
《ARM系列處理器應用技術完全手冊》
這本書是華清遠見出的,主要內容是對 ARM 處理器的簡介和 ARM 匯編程序設計,對學習ARM 指令還是很有幫助的。
ARM 官方文檔
Arm 官方文檔主要分為三類:編程指南(pg),芯片的技術參考手冊(trm),架構參考手冊(ARM)。這三類文檔,gp-》trm-》ARM,前面的更容易懂,越到后面越貼近芯片內部,越難懂。所以建議大家按順序閱讀。
編程指南:
《The_Definitive_Guide_to_ARM_Corte_M3&M4》
《Arm Cortex-A 編程指南》
《Armv8-A 編程指南》
他們主要描述 Arm 處理器上各個模塊的應用原理,和軟件開發(fā)比較貼近,內容只有幾百頁,是最實用最 容易上手的文檔。
技術參考手冊(trm)
trm 是 Technical Reference Manual 的縮寫,它是針對特定 CPU 的單獨文檔,比如 Cortex-A7/A9/A53/A72 技術參考手冊,內容主要包括對 CPU 上重要模塊的介紹,比如 Cache、Timer、系統(tǒng)控制,性能監(jiān)控、Debug 這些模塊,多則 300 頁,少的只有 100 多頁,當你拿到特具體的開發(fā)板芯片,可以有針對性的去閱讀。
架構參考手冊(arm)
這里的 arm 是 Architecture Reference Manual,Arm 官方稱這份文檔為 Arm arm。這份文檔詳細描述具體架構的內部細節(jié),比如 《Armv7-AR 架構手冊》是針對 32 位的 Arm Cortex-A/R 系列處理器架構的詳細描述,《Armv8-A架構手冊》是針對 64 位 Arm Cortex-A 系列處理器的架構詳細描述,這份文檔主要適用于 SOC 設計工程師和進行底層芯片開發(fā)的軟件工程師,Armv7-AR 的架構文檔 2000 多頁,Armv8-A 的架構文檔將近 9000 頁,堪稱宏篇巨著。了解大概結構后,我一般把它當作工具書,要用到相關模塊的知識就去找出來看看。
5、Linux 應用編程
從應用編程的角度切入 Linux 世界,是一個很好的方式。相比內核開發(fā),應用編程容易上手很多,甚至都不需要開發(fā)板,也不用擔心寫錯程序把整個系統(tǒng)弄崩潰。而且透過應用程序的各種機制,我們也能感知到 Linux Kernel 在背后運行的機理,畢竟 Kernel 還是為應用服務的,每一個產品都要靠應用來實現(xiàn)和終端用戶交互的接口。應用程序寫好了,再來開發(fā) Linux kernel,你會更容易理解,它為什么要這么實現(xiàn)。
關于應用編程我推薦了五本書:
《Linux 環(huán)境編程:從應用到內核》
《GNU Linux 編程指南》
《Linux 程序設計》
《Linux 系統(tǒng)編程》
《UNIX 環(huán)境高級編程》
除了第一本是中國人寫的,剩下的四本都是老外寫的,而且部頭都比較大,所以選一本你自己喜歡的認真去實踐即可。
6、Linux 內核基礎原理
很多學習嵌入式 Linux 開發(fā)的同學一上來就呆住一個驅動就開始較勁,然后發(fā)現(xiàn)看著像天書一樣,各種奇怪的 API 完全不知道為什么需要這樣寫,這時候你需要了解一些 Linux 內核的基礎原理。
這種書一般不是上來就給你分析某個驅動時怎么寫的,它側重于描述 Linux 內核的基礎框架,基礎數(shù)據結構,基本驅動模型,CPU 調度、內存管理這些機制。
我推薦了五本書:
《Linux 內核設計與實現(xiàn)》
《Linux 設備驅動程序》
《深入 Linux 內核架構》
《深入Linux 設備驅動程序內核機制》
《Mastering Linux Kernel Development》
當然,你不用希望一上來就能熟讀他們,第一遍你可能只能看個大概,而且看的很容易犯困。沒關系,瞌睡了就去睡覺,或者去找個簡單的驅動寫一寫,過幾天遇到疑問了再返回來看一看。這樣周而復始,總會有看明白的一天。
這里面的前兩本我從大四就開始看,最開始看著就犯迷糊,到后來工作了,結合平時寫的一些驅動,再返回去看,總算不再會打瞌睡?,F(xiàn)在偶爾還會拿起來翻一翻。
我知道有的同學會說 《Linux 設備驅動程序》這本書太老了,它是針對 2.6 內核的,連設備樹都沒有。其實在技術里面,也有一個道和術的問題,這本書講的是驅動的基礎原理,雖然 Linux kernel 一直在發(fā)展,現(xiàn)在 5.4 都快發(fā)布了,但是那些基本的內在邏輯還是一致的,驅動最底層的結構和原理都還沒有變化。Linux Kernel 開發(fā)的哲學就是這樣的,不允許你上來就直接推到之前的設計重新搞一套,你必須在原有的基礎上做持續(xù)性的改進,對于一個擁有龐大用戶群體的系統(tǒng),前向兼容性比什么都重要。至于設備樹(dts)這些東西,只是技術實現(xiàn)上的細枝末節(jié),找到規(guī)律很快就能掌握。
《深入 Linux 內核架構》這本書是一個德國人寫的,其實我沒看過,但是我知道這本書很出名,講的很深入,在我的閱讀計劃之內。
《深入 Linux 設備驅動程序內核機制》這本書是一個中國人寫的,基于 Linux 2.6.39,也是講 Linux 設備驅動的基本原理和組件,對于做驅動開發(fā)來說,還是值得一讀,而且中國人寫的書在思維也和大家更接近。
《Mastering Linux Kernel Development》這本書比較新,基于 Linux 4.9 ,所以這本書也只有英文版本。
7、Linux 內核開發(fā)與實戰(zhàn)
第六部分給大家推薦的書都比較偏理論,這部分推薦到是比較偏實踐的,基本就是告訴你開發(fā)環(huán)境怎么搭建,內核怎么編譯,文件系統(tǒng)怎么構建,驅動怎么編寫,所以建議六、七兩部分要結合起來看。
還是五本書:
《Linux 設備驅動開發(fā)詳解》
業(yè)內大名鼎鼎的宋寶華老師寫的,這本書我附了兩個版本,第二版和第三版,第二版是基于 Linux 2.6,第三版是基于 Linux 4.x,兩本書我都買了,第二版我看的比較多,兩本書都很不錯,比較注重理論和實踐的結合。
《精通 Linux設備驅動開發(fā)》
這是一本老外寫的書,宋寶華老師參與了中文版的翻譯,這本書也是基于 Linux 2.6,涵蓋了 Linux 內核中重要模塊的驅動編寫,比如字符設備,塊設備,網卡,串口,framebuffer,alsa,usb。
《嵌入式 Linux 基礎教程》
這本書講是一個老外寫的,華清遠見翻譯的,講的比較泛,但是涉及到了一個嵌入式系統(tǒng)的方方面面,比如 U-Boot、Linux Kernel、文件系統(tǒng)、toolchain,GDB。對于了解整個嵌入式系統(tǒng)是如何構建的還是比較有價值的
《構建嵌入式 Linux 系統(tǒng)》
這本書也是一個老外寫的,目前已經出到第二版,但是我沒找到,這本書和 《嵌入式 Linux 基礎教程》比較類似,兩本可以對照著看。
8、操作系統(tǒng)理論與基礎
Linux Kernel 是一個綜合性的工程,是大量科學理論的具體實現(xiàn)。對這些基礎理論有個基礎的認識,會讓我們學的更好。當然,短時間內不了解這些知識,也不會影響到你去調試一個驅動,Bringup 一塊板子,但是要想讓更深入的去研究一些問題,這些知識還是要補充的。尤其是對于電子相關專業(yè)的學生,可能連計算機基本原理,進程、線程、虛擬內存、Cache這些概念都沒有,那下邊這兩本書可以很好的幫到你。
《深入理解計算機系統(tǒng)》
這本書很出名,作者任教于卡內基-梅隆大學。是我剛工作的時候我老板送我的一本書,剛開始沒當回事,后面隨著工作中遇到疑問的逐漸增多,來來回回翻了好多遍,前段時間又拿來出來翻了翻,為了查一個 Cache 相關的問題。
《Operating Systems:Three Easy Pieces》
這本書是宋寶華老師推薦的,它涉及了操作系統(tǒng)中非常難的一些知識點:比如調度和內存管理,但是這本書卻能用簡單易懂的方式把這些原理解釋清楚,讀了這本書我對操作系統(tǒng)中的調度,內存管理總算有了一些稍微清晰的認識,感覺我又可以去讀一讀內核中相關的代碼實現(xiàn)了。
寫在最后
這份書單非常的長,53 份!
幾乎不可能全部讀完!
其實你也用不著把他們詳細的讀完!
如果從這篇介紹文章中,你能區(qū)分出哪些是要精讀的,哪些是當作工具書來需要的時候查閱的,它們就會對你有一定的幫助了。
我也會感到很高興。
另外,寫作不宜,這里面提到的大部分書,都已出版,如果可能,去買一本,支持下作者,也算是對知識的一種尊重。
我每年都會買很多書,有些書買來都沒來得及看,但是看著就感覺是好書,買回來,擺在案頭,看著就開心。
如果你想先睹為快,急著拜讀這些大作,
可以掃碼關注公眾號:HackforFun
可以掃碼關注公眾號:HackforFun
可以掃碼關注公眾號:HackforFun
然后發(fā)送關鍵字 linux
獲取下載鏈接。
猜你喜歡:
【Linux筆記】pc機_開發(fā)板_ubuntu互ping實驗
【Linux筆記】掛載網絡文件系統(tǒng)
后臺回復:加群。添加ZhengN微信,加入交流群
點個贊,證明你還愛我
免責聲明:本文內容由21ic獲得授權后發(fā)布,版權歸原作者所有,本平臺僅提供信息存儲服務。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!