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