嵌入式linux編程入門
A. 做linux嵌入式入門需要學什麼
嵌入式Linux開發往往是ARM+Linux路線,所以深入學習你可以嘗試以下路線:
(1) C語言是所有編程語言中的強者,單片機、DSP、類似ARM的種種晶元的編程都可以用C語言搞定),因此必須非常熟練的掌握。
推薦書籍:譚浩強的C語言程序設計很不錯,《The C Programming Language》 這本經典的教材是老外寫的,也有中譯版本。
(2) 操作系統原理,是必需的,如果你是計算機專業畢業那也就無所謂了,如果是非計算機專業的就必須找一本比較淺顯的計算機原理書籍看一看,把啥叫「進程」「線程」「系統調度」等等基本問題搞清楚。
(3)Linux操作系統就是用C語言編寫的,所以你也應該先學習下Linux方面的編程,只有你會應用了,才能近一步去了解其內核的精髓。
推薦書籍:《UNIX環境高級編程》(第2版)
(4) 了解ARM的架構,原理,以及其匯編指令,我們在嵌入式開發中,一般很少去寫匯編,但是最起碼的要求是能夠看懂arm匯編。
(5) 系統移植的時候,就需要你從最下層的bootloader開始,然後內核移植,文件系統移植等。而移植這部分對硬體的依賴是非常大的,其配置步驟也相對復雜,也沒有太多詳細資料。
(6) 驅動開發
linux驅動程序設計既是個極富有挑戰性的領域,又是一個博大精深的內容。
linux驅動程序設計本質是屬於linux內核編程范疇的,因而是對linux內核和內核編程是有要求的。在學習前你要想了解linux內核的組成,因為每一部分要詳細研究的話足夠可以擴展成一本厚書。
以上只不過是大概的框架,在實際的開發中還會涉及很多東西,比如:交叉編譯、makefile、shell腳本等等,所以說學習嵌入式的周期較長,門檻較高,自學的話更是需要較強的學習能力和專業功底。只要能堅持下來一定會取得成功!
華清遠見的嵌入式專業教材比較專業,也很出名,高校圖書館以及外面書店都有賣,你可以去網上搜一下,買本看看,華清遠見的網站和技術論壇上面也有很多嵌入式學習資料和入門視頻教程都可以免費下載,而且更新的速度也很快,LZ沒事可以去轉轉,相信對你會有幫助!
B. 該怎樣學習嵌入式Linux的基礎課程
嵌入式Linux操作系統學習規劃
ARM+LINUX路線,主攻嵌入式Linux操作系統及其上應用軟體開發目標:
(1) 掌握主流嵌入式微處理器的結構與原理(初步定為arm9)
(2) 必須掌握一個嵌入式操作系統 (初步定為uclinux或linux,版本待定)
(3) 必須熟悉嵌入式軟體開發流程並至少做一個嵌入式軟體項目。
從事嵌入式軟體開發的好處是:
(1)目前國內外這方面的人都很稀缺。這一領域入門門檻較高,所以非專業IT人員很難切入這一領域;另一方面,是因為這一領域較新,目前發展太快,大多數人無條件接觸。
(2)與企業計算等應用軟體不同,嵌入式領域人才的工作強度通常低一些(但收入不低)。
(3)哪天若想創業,搞自已的產品,嵌入式不像應用軟體那樣容易被盜版。硬體設計一般都是請其它公司給訂做(這叫「貼牌」:OEM),都是通用的硬體,我們只管設計軟體就變成自己的產品了。
(4)興趣所在,這是最主要的。
從事嵌入式軟體開發的缺點是:
(1)入門起點較高,所用到的技術往往都有一定難度,若軟硬體基礎不好,特別是操作系統級軟體功底不深,則可能不適於此行。
(2)這方面的企業數量要遠少於企業計算類企業。
(3)有少數公司經常要碩士以上的人搞嵌入式,主要是基於嵌入式的難度。但大多數公司也並無此要求,只要有經驗即可。
(4)平台依託強,換平台比較辛苦。
興趣的由來:
1、成功觀念不同,不虛度此生,就是我的成功。
2、喜歡思考,挑戰邏輯思維。
3、喜歡C
C是一種能發揮思維極限的語言。關於C的精神的一些方面可以被概述成短句如下:
相信程序員。
不要阻止程序員做那些需要去做的。
保持語言短小精幹。
一種方法做一個操作。
使得它運行的夠快,盡管它並不能保證將是可移植的。
4、喜歡底層開發,討厭vb類開發工具(並不是說vb不好)。
5、發展前景好,適合創業,不想自己要死了的時候還是一個工程師。
方法步驟:
1、基礎知識:
目的:能看懂硬體工作原理,但重點在嵌入式軟體,特別是操作系統級軟體,那將是我的優勢。
科目:數字電路、計算機組成原理、嵌入式微處理器結構。
匯編語言、C/C++、編譯原理、離散數學。
數據結構和演算法、操作系統、軟體工程、網路、資料庫。
方法:雖科目眾多,但都是較簡單的基礎,且大部分已掌握。不一定全學,可根據需要選修。
主攻書籍:the c++ programming language(一直沒時間讀)、數據結構-C2。
2、學習linux:
目的:深入掌握linux系統。
方法:使用linux—〉linxu系統編程開發—〉驅動開發和分析linux內核。先看深,那主講原理。看幾遍後,看情景分析,對照深看,兩本交叉,深是綱,情是目。剖析則是0.11版,適合學習。最後深入代碼。
主攻書籍:linux內核完全剖析、unix環境高級編程、深入理解linux內核、情景分析和源代。
3、學習嵌入式linux:
目的:掌握嵌入式處理器其及系統。
方法:(1)嵌入式微處理器結構與應用:直接arm原理及匯編即可,不要重復x86。
(2)嵌入式操作系統類:ucOS/II簡單,開源,可供入門。而後深入研究uClinux。
(3)必須有塊開發板(arm9以上),有條件可參加培訓(進步快,能認識些朋友)。
主攻書籍:毛德操的《嵌入式系統》及其他arm9手冊與arm匯編指令等。
4、深入學習:
A、數字圖像壓縮技術:主要是應掌握MPEG、mp3等編解碼演算法和技術。
B、通信協議及編程技術:TCP/IP協議、802.11,Bluetooth,GPRS、GSM、CDMA等。
2010-8-21 16:46 回復
122.90.173.* 2樓
C、網路與信息安全技術:如加密技術,數字證書CA等。
D、DSP技術:Digital Signal Process,DSP處理器通過硬體實現數字信號處理演算法。
說明:太多細節未說明,可根據實際情況調整。重點在於1、3,不必完全按照順序作。對於學習c++,理由是c++不只是一種語言,一種工具,她還是一種藝術,一種文化,一種哲學理念、但不是拿來炫耀得東西。對於linux內核,學習編程,讀一些優秀代碼也是有必要的。
注意: 要學會舉一反多,有強大的基礎,很多東西簡單看看就能會。想成為合格的程序員,前提是必須熟練至少一種編程語言,並具有良好的邏輯思維。一定要理論結合實踐。
不要一味鑽研技術,雖然擠出時間是很難做到的,但還是要留點餘地去完善其他的愛好,比如宇宙,素描、機械、管理,心理學、游戲、科幻電影。還有一些不願意做但必須要做的!
技術是通過編程編程在編程編出來的。永遠不要夢想一步登天,不要做浮躁的人,不要覺得路途漫上。而是要編程編程在編程,完了在編程,在編程!等機會來了在創業(不要相信有奇跡發生,盲目創業很難成功,即便成功了發展空間也不一定很大)。
嵌入式書籍推薦
Linux基礎
1、《Linux與Unix Shell 編程指南》
C語言基礎
1、《C Primer Plus,5th Edition》【美】Stephen Prata著
2、《The C Programming Language, 2nd Edition》【美】Brian W. Kernighan David M. Rithie(K & R)著
3、《Advanced Programming in the UNIX Environment,2nd Edition》(APUE)
4、《嵌入式Linux應用程序開發詳解》
Linux內核
1、《深入理解Linux內核》(第三版)
2、《Linux內核源代碼情景分析》毛德操 胡希明著
研發方向
1、《UNIX Network Programming》(UNP)
2、《TCP/IP詳解》
3、《Linux內核編程》
4、《Linux設備驅動開發》(LDD)
5、《Linux高級程序設計》 楊宗德著
硬體基礎
1、《ARM體系結構與編程》杜春雷著
2、S3C2410 Datasheet
英語基礎
1、《計算機與通信專業英語》
系統教程
1、《嵌入式系統――體系結構、編程與設計》
2、《嵌入式系統――採用公開源代碼和StrongARM/Xscale處理器》毛德操 胡希明著
3、《Building Embedded Linux Systems》
4、《嵌入式ARM系統原理與實例開發》 楊宗德著
理論基礎
1、《演算法導論》
2、《數據結構(C語言版)》
3、《計算機組織與體系結構?性能分析》
4、《深入理解計算機系統》【美】Randal E. Bryant David O''Hallaron著
5、《操作系統:精髓與設計原理》
6、《編譯原理》
7、《數據通信與計算機網路》
8、《數據壓縮原理與應用》
C語言書籍推薦
1. The C programming language 《C程序設計語言》
2. Pointers on C 《C和指針》
3. C traps and pitfalls 《C陷阱與缺陷》
4. Expert C Lanuage 《專家C編程》
5. Writing Clean Code -----Microsoft Techiniques for Developing Bug-free C Programs
《編程精粹--Microsoft 編寫優質無錯C程序秘訣》
6. Programming Embedded Systems in C and C++ 《嵌入式系統編程》
7.《C語言嵌入式系統編程修煉》
8.《高質量C++/C編程指南》林銳
盡可能多的編碼,要學好C,不能只注重C本身。演算法,架構方式等都很重要。
這里很多書其實是推薦而已,不必太在意,關鍵還是基礎,才是重中之重!!!
這是從網路 福州鼎嵌貼吧看來的 呵呵
建議樓主自己去它那看看
http://tieba..com/f?kw=%E7%A6%8F%E5%B7%9E%E9%BC%8E%E5%B5%8C&fr=tb0_search&ie=utf-8
C. 嵌入式開發入門--系統學習方案
嵌入式系統開發學習--從入門到精通
很多新手學習嵌入式系統,不清楚那麼多方向舵知識和參考書,該從哪裡開始學習。入手了,卻又在該先學習什麼後學習什麼上失去方向。這里有你想要的答案,幫你指點迷經。
這是我在ITjob培訓網上找到的課程大綱,覺得作為嵌入式系統開發的學習步驟,按部就班地去施行和學習,到不失為一種好的學習方法:)就算是作為參考也是有很好的價值的!
隨著現代社會信息化進程的加快,嵌入式系統被廣泛的地應用於軍事、家用、工業、商業、辦公、醫療等社會各個方面,表現出很強的投資價值。從國際范圍來看,作為數字化電子信息產品核心的嵌入式系統目前其硬體和軟體開發工具市場已經突破2000億美元,嵌入式系統帶來的全球工業年產值更是達到了一萬億美元,隨著全球經濟的持續增長以及信息化的加速發展,嵌入式系統市場必將進一步增長。
本課程是為了適應目前發展迅速的嵌入式Linux需求而設計,課程目標是讓學員達到適應嵌入式應用軟體開發、嵌入式系統開發或嵌入式驅動開發的基本素質。課程循序漸進的帶領您嵌入式開發的世界,採用了目前應用最廣泛的軟硬體開發平台(Linux和Arm),可以保證您盡量貼近目前企業需求。
學習步驟如下:(一步步來哦:)
1、Linux 基礎
安裝Linux操作系統
Linux文件系統
Linux常用命令
Linux啟動過程詳解
熟悉Linux服務能夠獨立安裝Linux操作系統
能夠熟練使用Linux系統的基本命令
認識Linux系統的常用服務安裝Linux操作系統
Linux基本命令實踐
設置Linux環境變數
定製Linux的服務 Shell 編程基礎使用vi編輯文件
使用Emacs編輯文件
使用其他編輯器
2、Shell 編程基礎
Shell簡介
認識後台程序
Bash編程熟悉Linux系統下的編輯環境
熟悉Linux下的各種Shell
熟練進行shell編程熟悉vi基本操作
熟悉Emacs的基本操作
比較不同shell的區別
編寫一個測試伺服器是否連通的shell腳本程序
編寫一個查看進程是否存在的shell腳本程序
編寫一個帶有循環語句的shell腳本程序
3、Linux 下的 C 編程基礎
linux C語言環境概述
Gcc使用方法
Gdb調試技術
Autoconf
Automake
Makefile
代碼優化 熟悉Linux系統下的開發環境
熟悉Gcc編譯器
熟悉Makefile規則編寫Hello,World程序
使用 make命令編譯程序
編寫帶有一個循環的程序
調試一個有問題的程序
4、嵌入式系統開發基礎
嵌入式系統概述
交叉編譯
配置TFTP服務
配置NFS服務
下載Bootloader和內核
嵌入式Linux應用軟體開發流程
熟悉嵌入式系統概念以及開發流程
建立嵌入式系統開發環境製作cross_gcc工具鏈
編譯並下載U-boot
編譯並下載Linux內核
編譯並下載Linux應用程序
5、嵌入式系統移植
Linux內核代碼
平台相關代碼分析
ARM平台介紹
平台移植的關鍵技術
移植Linux內核到 ARM平台 了解移植的概念
能夠移植Linux內核移植Linux2.6內核到 ARM9開發板
6、嵌入式 Linux 下串口通信
串列I/O的基本概念
嵌入式Linux應用軟體開發流程
Linux系統的文件和設備
與文件相關的系統調用
配置超級終端和MiniCOM 能夠熟悉進行串口通信
熟悉文件I/O 編寫串口通信程序
編寫多串口通信程序
7、嵌入式系統中多進程程序設計
Linux系統進程概述
嵌入式系統的進程特點
進程操作
守護進程
相關的系統調用了解Linux系統中進程的概念
能夠編寫多進程程序編寫多進程程序
編寫一個守護進程程序
sleep系統調用任務管理、同步與通信 Linux任務概述
任務調度
管道
信號
共享內存
任務管理 API 了解Linux系統任務管理機制
熟悉進程間通信的幾種方式
熟悉嵌入式Linux中的任務間同步與通信
編寫一個簡單的管道程序實現文件傳輸
編寫一個使用共享內存的程序
8、嵌入式系統中多線程程序設計
線程的基礎知識
多線程編程方法
線程應用中的同步問題了解線程的概念
能夠編寫簡單的多線程程序編寫一個多線程程序
9、嵌入式 Linux 網路編程
網路基礎知識
嵌入式Linux中TCP/IP網路結構
socket 編程
常用 API函數
分析Ping命令的實現
基本UDP套介面編程
許可證管理
PPP協議
GPRS 了解嵌入式Linux網路體系結構
能夠進行嵌入式Linux環境下的socket 編程
熟悉UDP協議、PPP協議
熟悉GPRS 使用socket 編寫代理伺服器
使用socket 編寫路由器
編寫許可證伺服器
指出TCP和UDP的優缺點
編寫一個web伺服器
編寫一個運行在 ARM平台的網路播放器
10、GUI 程序開發
GUI基礎
嵌入式系統GUI類型
編譯QT
進行QT開發熟悉嵌入式系統常用的GUI
能夠進行QT編程使用QT編寫「Hello,World」程序
調試一個加入信號/槽的實例
通過重載QWidget 類方法處理事件
11、Linux 字元設備驅動程序
設備驅動程序基礎知識
Linux系統的模塊
字元設備驅動分析
fs_operation結構
載入驅動程序了解設備驅動程序的概念
了解Linux字元設備驅動程序結構
能夠編寫字元設備驅動程序編寫Skull驅動
編寫鍵盤驅動
編寫I/O驅動
分析一個看門狗驅動程序
對比Linux2.6內核與2.4內核中字元設備驅動的不同
Linux 塊設備驅動程序塊設備驅動程序工作原理
典型的塊設備驅動程序分析
塊設備的讀寫請求隊列了解Linux塊設備驅動程序結構
能夠編寫簡單的塊設備驅動程序比較字元設備與塊設備的異同
編寫MMC卡驅動程序
分析一個文件系統
對比Linux2.6內核與2.4內核中塊設備驅動的不同
12、文件系統
虛擬文件系統
文件系統的建立
ramfs內存文件系統
proc文件系統
devfs 文件系統
MTD技術簡介
MTD塊設備初始化
MTD塊設備的讀寫操作了解Linux系統的文件系統
了解嵌入式Linux的文件系統
了解MTD技術
能夠編寫簡單的文件系統為 ARM9開發板添加 MTD支持
移植JFFS2文件系統
通過proc文件系統修改操作系統參數
分析romfs 文件系統源代碼
創建一個cramfs 文件系統
D. 小白看過來,新人如何入門嵌入式
作為一個新人,怎樣學習嵌入式Linux
原文鏈接:網頁鏈接
作為一個新人,怎樣學習嵌入式Linux?被問過太多次,特寫這篇文章來回答一下。
在學習嵌入式Linux之前,肯定要有C語言基礎。匯編基礎有沒有無所謂(就那麼幾條匯編指令,用到了一看就會)。C語言要學到什麼程度呢?越熟當然越好,不熟的話也要具備基本技能。比如寫一個數組排序、輸入數字求和什麼的。學C語言唯一的方法是多寫程序多練習,編譯出錯沒關系,自己去解決;執行出錯沒關系,自己去分析。以前我是用VC來練習C語言的,經常去嘗試著寫一些C語言競賽的題目。它們是純C、純數學、純邏輯的題目,不涉及界面這些東西,很適合煅煉你的編程能力。
回到主題,首先我們要明白你的目的是什麼,大概來說所謂嵌入式Linux可以分為兩部分:底層系統、應用開發。如果你是想做應用開發,那麼你去把C語言、數據結構、JAVA什麼的學好吧。嵌入式應用開發和PC上的應用開發並沒有什麼特別要注意的。也許你說在嵌入式上要做些優化,是的,要優化,但是未經優化的程序和PC上的程序開發沒什麼差別。另外,當你有能力去優化時,你已經不用來問這個問題了。具體到某個例子,比如說開發界面,在PC上我們用VC;在嵌入式Linux里也許我們用QT也許用Android,這個時候你應該去學學QT、Android的編程。但是基礎還是C或JAVA,在此基礎上去熟悉它們的介面。你學過VC的話,也是要花時間去了解那些類、控制項的。
如果你的目的是想學習底層系統,這是我的專長,倒是可以說一點。在回答這個問題之前,我先回答:不少人問我,到底是學驅動還是學應用?
我只能說憑興趣,並且驅動和應用並不是截然分開的
我們說的驅動,其實並不局限於硬體的操作,還有操作系統的原理、進程的休眠喚醒調度等概念。 想寫出一個好的應用,想比較好的解決應用碰到的問題,這些知識你應該懂
做應用門檻低,特別是現在的ANDROID,純JAVA。做應用的發展路徑個人認為就是業務純熟。比如在通信行業、IPTV行業、手機行業,你了解行業的需求。所以,當領導的人,多是做應用的。
做驅動,其實我不想稱為「做驅動」,而是想稱為「做底層系統」,做好了這是通殺各行業。我工作幾年,做過手機、IPTV、會議電視,但是這些產品對我毫無差別,因為我只做底層。他們的業務跟我沒關系。當應用出現問題,他們解決不了時,我就會從內核角度給他們出主意,給他們提供工具。 做底層的發展方向,個人認為是技術專家。
其實,做底層還是做應用,之間並沒有一個界線,有底層經驗,再去做應用,你會感覺很踏實。有了業務經驗,你再了解一下底層,很快就可以組成一個團隊。
電腦一開機,那些界面是誰顯示的?是BIOS,它做什麼?一些自檢,然後從硬碟上讀入windows,並啟動它。類似的,這個BIOS對應於嵌入式Linux里的bootloader。這個bootloader要去Flash上讀入Linux內核,並啟動它。
啟動windows的目的是什麼?當然是上網聊天什麼的了。這些上網、聊天工具在哪?
在C盤、D盤上。所以, windows要先識別出C盤、D盤。在Linux下我們稱為根文件系統。
windows能識別出C盤、D盤,那麼肯定能讀寫硬碟才行。這涉及的東西稱為驅動程序。當然不僅僅是硬碟,還有網卡、USB等等。嵌入式Linux能從Flash上讀出並執行應用程序,肯定也得有Flash的驅動程序啊,當然也不僅僅是Flash。
對硬體的操作
對ARM體系處理器的了解
程序的基本概念:重定位、棧、代碼段數據段BSS段什麼的。
用繪圖板畫圖講解──相當於學校里老師在黑板上畫圖講解,很直觀絕對不是對著PPT念。
用source insight當場寫程序,從第1行開始寫,每一課都是這樣。我講了20多個驅動,就寫了20多個程序。
寫完就編譯、測試。
很全面,字元設備驅動、塊設備、網卡驅動3大類齊全,硬體介紹、驅動框架分析、測試3大類齊全。
我在學校時讀的是物理電子專業,其實課程里沒有教怎麼設計電路,只是教了些電子電路方面的知識。PCB的設計是在實驗室里自學的,只設計過2層板,現在忘記得差不多了。但是保留了看原理圖、看晶元手冊的能力。
選修了軟體學位,對軟體設計挺感興趣,但是也只是學了C語言、資料庫而已。憑著興趣做了不少競賽題。沒能力去參加競賽,但是把C語言練得很扎實。
在實驗室、在第1家公司,就是設計些簡單的PCI卡,寫一下windows的驅動程序
在第2家公司,用51單片機做車載電話,開始走上純軟體的道路。
開始感到單片機的不足,辭職半年閉門學Linux,從red hat怎麼操作開始。步驟就是先看<ARM體系架構與編程>,再自己寫裸板程序操作硬體,接著到分析u-boot。同時看<linux內核完全注釋>,對LINUX框架有所了解。在寫裸板時,建議各位加強對中斷的理解,內核就是用中斷來完成各種功能的。
分析完u-boot,就開始進行簡單的驅動編程了,這時候,能力還很弱。
開始去中興上班,工作2年,編寫各類驅動、解決各類問題(驅動問題、幫助定位應用問題),能力得到煅煉。
韋東山Linux視頻第1期(基於S3C2440錄制): ARM實驗,u-boot,文件系統,初級驅動
韋東山Linux視頻第1期(基於S3C6410錄制): 裸板程序
韋東山Linux視頻第2期: 高級驅動
韋東山Linux視頻第3期:項目實戰
韋東山Linux視頻第4期:Android驅動
回到怎麼學的問題上。嵌入式Linux底層系統包含哪些東西?不要急,舉一個例子你就知道了。
先說到這里吧,嵌入式LINUX里含有bootloader, 內核, 驅動程序、根文件系統這4大塊。
一、bootloader:
它就是一個稍微復雜的裸板程序。但是要把這裸板程序看懂寫好一點都不容易。Windows下好用的工具弱化了我們的編程能力。
很多人一玩嵌入式就用ADS、KEIL。你能回答這幾個問題嗎?
1. 一上電,CPU從哪裡取指令執行?
答:一般從Flash上指令。
2. 但是Flash一般是只能讀不能直接寫的,如果我用到全局變數,這些全局變數在哪裡?
答:全局變數應該在內存里
3. 那麼誰把全局變數放到內存里去?
答:長期用ADS、KEIL的朋友,你能回答嗎?這需要"重定位"。在ADS或KEIL里,重定位的代碼是製作這些工具的公司幫你寫好了。你可曾去閱讀過?
4. 內存那麼大,我怎麼知道把"原來存在Flash上的內容"讀到內存的"哪個地址去"?
答:這個地址用"鏈接腳本"決定,在ADS里有scatter文件,KEIL里也有類似的文件。但是,你去研究過嗎?
5. 你說重定位是把程序從Flash復制到內存,那麼這個程序可以讀Flash啊?
答:是的,要能操作Flash。當然不僅僅是這些,還有設置時鍾讓系統運行得更快等等。
自問自答到這里吧,bootloader這一個裸板程序,其實有3部分要點:
對硬體的操作,需要看原理圖、晶元手冊。這需要一定的硬體知識,不求你能設計硬體,但是至少能看懂; 不求能看懂模擬電路,但是要能看懂數字電路。這方面的能力我是在學校里學到的,微機原理、數字電路這2本書(書名忘了)就足夠了。但是我懷疑你有無耐心把這2本書看完。我不知道現在有沒有更快捷的書。想速成的話,就先放掉這塊吧,不懂就問GOOGLE、發貼。
另外,晶元手冊是肯定要讀的,別去找中文的,就看英文的。開始是非常痛苦,以後就會發現那些語法、詞彙一旦熟悉後,讀任何晶元手冊都很容易。對ARM體系處理器的了解, 看杜春蕾的<ARM體系架構與編程>吧,裡面講有匯編指令,有異常模式、MMU等。也就這3塊內容需要你了解。
程序的基本概念,王道當然是去看編譯原理了。可惜,這類書絕對是天書級別的。勸你若非超級天才還是別去看了。就看我寫的<嵌入式Linux應用開發完全手冊>和第1期視頻吧,別擔心,不用花錢。照著視頻把硬體相關的實驗做了,這些概念就清楚了。我還沒有
發現第2套講這些概念的書或視頻。
對於bootloader,我學習時是先看了<ARM體系架構與編程>,然後自己寫程序把各個硬體的實驗都做了一遍,比如GPIO、時鍾、SDRAM、UART、NAND。把它們都弄清楚了,組台在一起就很容易看懂u-boot了
總結一下,看懂硬體原理圖、看晶元手冊,這需要你自己去找資料。剩下的,就按<嵌入式Linux應用開發完全手冊>和第1期視頻的章節目錄去學習吧。
二、內核:
想速成的人,先跨過內核的學習,直接學習怎麼寫驅動。
想成為高手,內核必須深刻了解。注意,我說的是了解,我沒奢望去寫出一個內核。
要對裡面的調度機制、內存管理機制、文件管理機制等等有所了解。
推薦兩本書:
1. 通讀<linux內核完全注釋>,請看薄的那本(浮燥的社會講求速度, 呵),
2. 選讀<Linux內核情景分析>, 想了解哪一塊就讀哪一節
三、驅動:
驅動包含兩部分:硬體本身的操作、驅動程序的框架。
又是硬體,還是要看得懂原理圖、讀得懂晶元手冊,多練吧。
說到驅動框架,有一些書介紹一下。LDD3,即<Linux設備驅動>,老外寫的那本,裡面介紹了不少概念,值得一讀。但是,它的作用也就限於介紹概念了。我基本上是入門之前用它來熟悉一下概念,入門後就扔掉了。
驅動方面比較全的介紹,應該是宋寶華的<linux設備驅動開發詳解>了,老實說我只看過目錄,有不少人說好,這里推薦一下。要想深入了解某一塊,<Linux內核情景分析>絕對是超5星級推薦。你別指望把它讀完,1800多頁,上下兩冊呢。我是某一塊不清楚時,就去翻一下它。任何一部分,這書都可以講上2、3百頁,非常詳細。並且是以某個目標來帶你分析內核源碼。它以linux 2.4為例,但是原理相通,同樣適用於其它版本的linux。
還有沒有其他介紹?呵呵,當然有了,韋東山Linux視頻第2期。<嵌入式Linux應用開發完全手冊>里對驅動講得不多,不夠深入。於是我錄制了這期視頻。不僅僅教你怎麼寫怎麼改驅動,還教你為什麼這樣寫這樣改驅動。
每一個驅動都是現場編寫:
培訓機構里教的內容,遠不及這期視頻豐富。我在多個培訓機構講過課,從沒看到哪個老師敢每一課都當場講解當場編寫代碼,當場測試,除我之外!也沒看到哪個培訓機構講完這些內容──因為時間不夠,講完起碼要一個月,但是這部分基本只有2周授課時間。
把你手上的開發板所涉及的硬體,都去嘗試寫一個驅動吧。有問題就先"痛苦地思考",思考的過程中你會把很多不相關的知識串聯起來,最終貫通。
四、根文件系統:
大家有沒有想過這2個問題:
1. 對於Linux做出來的產品,有些用作監控、有些做手機、有些做平板。那麼內核啟動後,掛載根文件系統後,應該啟動哪一個應用程序呢?
答:內核不知道也不管應該啟動哪一個用戶程序。它只啟動init這一個應用程序,它對應/sbin/init。顯然,這個應用程序就要讀取配置文件,根據配置文件去啟動用戶程序(監控、手冊界面、平板界面等等)這個問題提示我們,文件系統的內容是有一些約定的,比如要有/sbin/init,要有配置文件
2. 你寫的hello,world程序,有沒有想過裡面用到的printf是誰實現的?
答:這個函數不是你實現的,是庫函數實現的。它運行時,得找到庫。這個問題提示我們,文件系統里還要有庫。
簡單的自問自答到這里,要想深入了解,可以看一下busybox的init.c,就可以知道init進程做的事情了。當然,也可以看<嵌入式Linux應用開發完全手冊>里構建根文件系統那章。
說一下我的學習經歷吧。
總結一下:
1. 硬體方面的書: 微機原理、數字電路,高校里的教材。畢業多年,忘名了。
2. Linux方面的書:
<ARM體系架構與編程>
<嵌入式Linux應用開發完全手冊>
<Linux設備驅動>,老外寫的那本
<linux設備驅動開發詳解>
<linux內核完全注釋>
<Linux內核情景分析>
3. 視頻:
視頻信息請看網頁鏈接
————————————————
版權聲明:本文為博主「韋東山」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/thisway_diy/article/details/51887326