當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > 學(xué)習(xí)Linux一點(diǎn)心得
從2016年8月15日入職到現(xiàn)在有半年時間了,簡單談一下自己的心得及對自己學(xué)習(xí)Linux的一點(diǎn)理解。
本人也是從參加華清遠(yuǎn)見培訓(xùn)才開始接觸Linux,經(jīng)過培訓(xùn)老師的講解、自己平時查閱資料以及實(shí)際工作中的接觸,對Linux認(rèn)識也逐漸加深。下面把自己的認(rèn)識過程簡單說明一下,可以供剛?cè)腴T的同學(xué)參考。
1、 學(xué)習(xí)Linux絕對是一項系統(tǒng)工程,不要想著幾個月或幾天可以搞定。隨著對Linux認(rèn)識的深入,你會越來越覺得這是不可能的(跟智商沒關(guān)系),因為涉及的知識點(diǎn)實(shí)在太多。那我們是不是要把所有的知識學(xué)完才能工作,這個到?jīng)]有必要,因為實(shí)際工作(某個崗位)不需要那么多知識。所以,把教學(xué)大綱內(nèi)容的掌握了,應(yīng)該可以勝任某些初級工作。
2、 如果從事底層開發(fā),與硬件打交道,你需要對CPU架構(gòu)有個大概的了解,因為要讓系統(tǒng)跑起來,你必須知道Linux的引導(dǎo)過程。通常ARM架構(gòu)和X86的引導(dǎo)過程還是有差異的,盡管原理差不多。我們在培訓(xùn)的時候主要接觸的是ARM平臺,但有可能工作時接觸的X86架構(gòu),因此你除了要知道U-boot如何引導(dǎo)ARM平臺的Linux內(nèi)核,還要知道grub如何引導(dǎo)X86平臺下的Linux內(nèi)核,因為當(dāng)前Linux主要發(fā)行版基本都是采用Grub2來引導(dǎo)。有時間需要了解一下grub2,可能還要知道MBR、EFI等,這些是X86平臺的BIOS相關(guān)的知識。掌握了這些你才能在開發(fā)平臺上安裝系統(tǒng),不管什么平臺都能搞定,才能以不變應(yīng)萬變。上課時,可能老師會講init進(jìn)程,但我要告訴你,如果你實(shí)際遇到的init行為跟上課時不一樣,不要奇怪,因為現(xiàn)在發(fā)行版的init已經(jīng)被重寫了好幾個版本,上個時講的是Sysv標(biāo)準(zhǔn)。現(xiàn)在發(fā)行版init雖然部分兼容sysv,但變化也是非常大的。具體的可以上網(wǎng)搜索UpStart 和 systemd。
3、 我們的主要工作不可能僅僅安裝一個Linux操作系統(tǒng),通常主要工作應(yīng)當(dāng)是設(shè)備驅(qū)動的移植或開發(fā)。這個需要的知識就比較專業(yè)了,不是簡單套用一下字符設(shè)備、塊設(shè)備或網(wǎng)絡(luò)設(shè)備能搞定的。需要熟知硬件設(shè)備的工作過程,如何設(shè)置寄存器,寄存器的地址是什么,這個就要“肯“芯片的datasheet和考驗個人E文的能力了,有可能讀了一遍不知所云。還要熟悉相關(guān)標(biāo)準(zhǔn)和協(xié)議(比如:pci、usb、i2c、spi等),這有可能又是幾百或上千頁的文檔需要閱讀。再者就是Linux相關(guān)子系統(tǒng)的實(shí)現(xiàn),比如tty、gpio、i2c、usb、pci、net、blk等,因為終你的驅(qū)動代碼要調(diào)用這些子系統(tǒng)的內(nèi)核代碼,你不能僅僅參考模板代碼,因為那樣如果出現(xiàn)問題,你將束手無策。
4、 文件系統(tǒng)可以說是Linux的靈魂,因為有人云Linux中“一切皆文件”。不要覺得只有磁盤上才存在文件系統(tǒng),內(nèi)存中也有文件系統(tǒng),而且有很多。典型的sysfs文件系統(tǒng)就是內(nèi)存文件系統(tǒng),搞Linux驅(qū)動開發(fā),sysfs文件系統(tǒng)是必須要掌握的,他和驅(qū)動程序的關(guān)系不是一般的密切,了解sysfs文件系統(tǒng)就必須了解Kobject對象體系,這個體系的內(nèi)容也比較豐富。
5、 實(shí)際項目開發(fā)設(shè)計多的就是通訊設(shè)備,除了板上的spi、i2c通訊外,設(shè)備間的通訊主要為串口(RS232、422、485)、網(wǎng)口(802.11)以及無線通訊(wifi、bt、3g、4g),這些通訊協(xié)議即使不能完全掌握,也要了解大概。
6、 驅(qū)動開發(fā)可以參考模板,但調(diào)試驅(qū)動是沒有模板參考的。驅(qū)動程序開發(fā)的真正的能力是體現(xiàn)在解決問題的能力,你不可能憑空想象和猜測哪里出問題了,需要有手段。這就要用到調(diào)試方法、手段了,還有就是對內(nèi)核相關(guān)驅(qū)動架構(gòu)要非常清楚,能夠通過內(nèi)核消息,定位問題大致位置。如果你的硬件知識過硬,不僅不需要和硬件工程師扯皮,還可以“謙虛的“地提示他,硬件哪里可能是有問題的。
7、 如果實(shí)在搞不定,不要忘記找“度娘“。以我的經(jīng)驗,應(yīng)該可以找到80%的答案。
8、 分享一個實(shí)際項目—PCI總線轉(zhuǎn)16串口卡。一看項目的名字,就知道是與PCI總線和串口有關(guān),PCI總線是X86平臺上常用總線,現(xiàn)在已經(jīng)發(fā)展到PCIe了,PCI是32/64位總線而PCIe是串行總線,但速度更快(3.0版的1x帶寬達(dá)到8.0Gbps)。協(xié)議上PCIe是基本兼容PCI的,所以Linux內(nèi)核中采用是同一個架構(gòu),F(xiàn)在PC、工控機(jī)上的千兆網(wǎng)卡、SATA3.0等基本都是采用PCIe轉(zhuǎn)化,只有這樣才能滿足帶寬要求。至于串口部分,如果開發(fā)過Uart(8250)驅(qū)動,應(yīng)該沒問題。實(shí)際的硬件部分是由PLX9054+FPGA來實(shí)現(xiàn),由于存在FPGA,串口部分寄存器由FPGA工程師提供,這個需要軟件和硬件磨合。后的驅(qū)動應(yīng)該是一個復(fù)合驅(qū)動,你不能簡單套用字符設(shè)備、塊設(shè)備或網(wǎng)絡(luò)設(shè)備那一套。PCI部分的驅(qū)動,你不僅要了解PCI協(xié)議、PCI配置過程(配置空間的讀寫),為了實(shí)現(xiàn)PCI設(shè)備上電自動配置還涉及到EEPROM芯片的燒寫,同時還要熟悉Linux內(nèi)核PCI部分架構(gòu),以及驅(qū)動程序的注冊。整個驅(qū)動部分不是兩塊簡單疊加,需要有機(jī)結(jié)合。如果你不知道PCI配置空間、IO空間、內(nèi)存空間,不熟悉內(nèi)存映射機(jī)制、虛擬內(nèi)存概念,不了解PCI的INTA—INTD或PCIe的MSI等中斷機(jī)制,這個驅(qū)動是搞不出來的。這一個項目涉及的知識點(diǎn)非常多,即使是串口部分,也不是簡單一個字符設(shè)備可以搞定的,你需要知道tty、線路規(guī)程、UART協(xié)議。
9、 搞驅(qū)動開發(fā)既需要積累知識、又需要積累經(jīng)驗,切記紙上談兵、好高騖遠(yuǎn)。實(shí)在沒什么Linux學(xué)習(xí)方法推薦,如果要推薦的話,我個人覺得可以參考這個配置《3+1+1+1+1》,具體為:3本書(Linux內(nèi)核開發(fā)(Robert Love)、深入理解Linux內(nèi)核(Daniel P. Bovet / Marco Cesati)、Linux設(shè)備驅(qū)動程序(Jonathan Corbet))+1個軟件(Source Insight)+1套內(nèi)核源碼(建議版本至少大于2.6)+1個網(wǎng)絡(luò)搜索引擎+1個持續(xù)的學(xué)習(xí)熱情。這里說一下閱讀內(nèi)核代碼,對于初學(xué)者可能非常痛苦,因為內(nèi)核代碼里面有很多鏈表、鎖、出錯處理以及你聞所未聞的算法,更傷心的是當(dāng)你懷揣無比堅定的信念,興致勃勃地用SI跟蹤代碼,要一探究竟,結(jié)果代碼跟到一半無法進(jìn)行了。這是因為內(nèi)核很多地方采用了函數(shù)指針和回調(diào)機(jī)制,只有在執(zhí)行的時候,才指向具體的函數(shù)。這樣是不是就沒法跟蹤了呢,當(dāng)然不是,具體就不詳述了,可以到網(wǎng)上查找相關(guān)資料。
10、 基礎(chǔ)知識也需要掌握,Shell編程、Make工具的使用、內(nèi)核編譯系統(tǒng)、gcc編譯和鏈接、elf格式加載過程、ext2文件系統(tǒng)等,扎實(shí)的基礎(chǔ)知識,可以讓你學(xué)習(xí)新知識事半功倍。
以上簡單羅列了一下個人在學(xué)習(xí)Linux過程中的一點(diǎn)體會,有些細(xì)節(jié)沒有展開。若想了解涉及到的具體知識點(diǎn),請自己到網(wǎng)上搜索。由于自己也剛剛?cè)腴T,如果誤導(dǎo)了你,還請見諒!