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