標籤:開源 電腦 學生 linux
by falcon of TinyLab.org
2013/08/25
Linux開源相關技術對於學生來說,特別是電腦專業的學生來說,非常重要,下面就幾個方面進行討論:
研究平台
因為開源的優勢,有非常多的開放的文案可以參考,有很多有趣的點子可以拿來做深入的研究。任何一個點挖進去都是一片天地。
專業視野
通過那些開放的項目,你可以通過郵件清單、Linkedin、Google Group接觸到來自全球各地的天才,不僅可以提升英文讀寫能力,認識國際友人,還可以把握領域前沿,甚至還有機會得到大佬們的指點迷津。
工作機會
就像2004年左右,自己在學校毅然而然地選擇轉到Linux平台一樣,現在有同樣的預感,Linux以及相關的開源技術因為它包含人類共贏(Open, Free, Share)的”大同”理念,融合了全球眾多企業和天才的智慧,以及它不斷更新換代地自我革新,她將持續繁榮下去。
目前的Linux人才看似很多,剛從學校畢業沒什麼編碼經驗的學生也可以很快寫個小驅動,看似門檻很低,但是真正能夠從系統層面解決問題,做了工作不用別人搽屁股的高端人才很少。如果從大學開始抓取,畢業的時候就比其他同學多了四年的使用經驗和思維培養。對於後續的研究和工作來說,都會是非常重要的競爭力。
課程實踐
幾乎從硬體到軟體,Linux平台能夠提供從下而上的所有觸及“靈魂”的學習案例,讓所有課程從紙上談兵轉變成沙場實戰,會極大地提升工程實踐的效率和技能。
硬體方面
硬體類比已經是趨勢,不可阻擋。包括處理器類比、系統類比,大名鼎鼎的Qemu,以及它的偉大的派生者:Android emulator提供了易用的案例,支援四大,不是律師事務所,是ARM, X86, PPC以及MIPS。這東西不僅能夠類比處理器指令,還支援系統級(各種外設)的類比,還支援直接在一個架構上執行另一個架構的可執行檔(通過qemu-user-static翻譯)。有了它,你不用花錢買開發板,有了它,你可以研究如何類比設計和實現一個硬體系統,一套處理器指令,還可以研究虛擬化技術,虛擬化叢集。
跟GNU序列工具的開創者Stallman以及Linux的開創者Linus一樣,Qemu的開創者也是一個偉大的先驅,看看他的簡介和個人首頁吧:http://bellard.org/,以及那個用Javascript寫的可以直接通過瀏覽器跑Linux的模擬器吧:http://bellard.org/jslinux/
法布裡斯·貝拉 是一位法國著名的電腦程式員,因FFmpeg、QEMU等項目而聞名業內。他也是最快圓周率演算法貝拉公式、TCCBOOT和TCC等項目的作者。 1972年生於法國Grenoble。在高中就讀期間開發了著名的可執行壓縮程式LZEXE,這是當年DOS上第一個廣泛使用的檔案壓縮程式。
接觸開源,讓我們有機會瞭解和認識這些瘋狂的前輩,這無疑是一件非常勵志和讓人血脈賁張的趣事。
引導程式/BIOS
我們大學的時候學習了BIOS,基本輸出入系統 (BIOS),是個啥玩意,感覺得到,看得到面紗,看不到她真實的樣子。但是有了Uboot:http://www.denx.de/wiki/U-Boot,你可以。
可以直接在Qemu裡頭做Uboot的實驗:Using QEMU for Embedded Systems Development, Part 3 或者 使用Qemu類比Cortex-A9運行U-boot和Linux
作業系統
Linux本身絕大部分都是Open的,作業系統課程如果在上課的同時能夠讀一讀Linux 0.11的原始碼:http://oldlinux.org/,你會發現作業系統不是乾巴巴的電梯調度演算法之類演算法描述。你可以看到實實在在的活生生的情境,可以說話的情境。
什麼調度演算法,什麼同步機制,什麼中斷管理,什麼檔案系統,什麼各類外設的驅動等等,通通可以看到原始碼實現並允許親自去修改,調試和完善,甚至可以通過郵件清單提交Patch到官方Linux社區,然後有機會接觸Linux社區的那些印象中“神一般”現實裡“平易近人”的大佬們。
你還可以自己製作一個完整的作業系統。看看Building Embedded Linux System這本書, 從Linux官方社區: http://www.kernel.org下載一份原始碼,編譯一下,然後用Busybox,Buildroot、LFS或者Openembedded製作自己的檔案系統,然後就是一個完整的作業系統。然後你會知道什麼是一個完整的作業系統,什麼僅僅是一個作業系統Kernel。然後你會瞭解,使用者互動的介面,除了GUI,其實它最最本質的東西還是Shell Terminator,GUI只是換上了一襲花衣裳。你會真正地理解,當按下一個鍵盤上的按鍵的時候,這個背後發生了什麼樣的故事和演變。作為電腦的學生,我們不應該被這些蒙在鼓裡,應該掀開那襲花衣裳,打探背後的細枝末節,然後,等到哪一天,閉上眼睛,當整個故事情節在腦海裡像放電影一樣清晰不再模糊的時候,你就如償所願了,那種美妙的滋味在出現Bug需要解決的時候會得到印證。
做這些實驗,根本不需要買開發板,Qemu就綽綽有餘了,可以參考:
Using QEMU for Embedded Systems Development, Part 1
Using QEMU for Embedded Systems Development, Part 2
如果想看Linux 0.11的原始碼,可以到http://oldlinux.org/下載開放的書籍和原始碼,在Ubuntu下用Qemu做實驗就好了。記得下載可以在Ubuntu下用最新編譯器編譯的Linux 0.11代碼: https://gitlab.com/tinylab/tinylinux.git
另外,這裡有一份比較詳細的文章,介紹了相關用法:可供GDB源碼調試的用GCC 4.X編譯的Linux 0.11實驗環境
組合語言
估計學校還在用王老師的書吧,這個是我大二的時候有寫的《組合語言 王爽著》課後實驗參考答案。
Share在這裡是非常想強調實踐的重要性,不知道有幾個同學認真地做完了所有或者絕大部分大學電腦課程課後的實驗,實驗真地非常重要。另外一個原因是,真地希望大家能夠在Linux平台下學X86的彙編,用gas彙編器,用AT&T的文法,用gcc看C語言寫的東西是怎麼用組合語言實現的。非常美妙的事情。當然,還可以用qemu-user-static跑一個debootstrap製作的Debian for ARM, MIPS or PPC,學習ARM,MIPS和PPC彙編。精選學習MIPS彙編,精簡指令集,最優美的純天然的組合語言。
結合上面的作業系統課程,精選一個國外的貌似是舊金山大學的課程,叫CS630,本來這個老師(Allan B. Cruse)是在I386真機上做實驗的,我完善了他的Makefile,然後直接在Qemu上做實驗。分享一個趣事:我給那個老師分享了在Qemu上做實驗的方法,人家說這個學生不錯,可以直接給個A了,呵呵。具體用法和原始碼請參考:Learn CS630 on Qemu in Ubuntu。
BTW:上面Linux 0.11的課程,為了可以直接用現在流行的標準gas和gcc,那個boot引導的16bit彙編代碼我有用AT&T重寫。
如果想學ARM彙編:推薦《ARM System Developers’ Guide: Designing and Optimizing System Software》,如果想學MIPS彙編: 推薦《See MIPS Run Linux》
如果想學X86彙編,不要錯過那個CS630課程以及Allan B. Cruse的個人首頁,有蠻多相關的資料。
C語言
就語言本身來說,她太有生命力了,而且現在以及可以預知的未來,她還會保持她專屬的生命力。
語言本身我們是不是還在學譚老師的課程呢?建議還是要自學C語言作者的書:
The C programming Language
然後,不要忘記把基礎打紮實一下,下面幾個內容基本可以作為日後學習和工作的持久參考書,最好是在大學階段系統地全部閱讀和實踐一遍,你會受益匪淺的:
C Traps and Pitfalls
C FAQ: http://c-faq.com/
Advanced Unix Programming
精選Jserv黃的大作《深入淺出 Hello World》,它揭示了“Linux 背後的層層布幕”,他在部落格裡面提到:
許多充斥於開放資源的 Linux programming 檔案常只敘及概念或技術細節,往往以照單全收卻沒有充分消化的結局作收。我們何嘗不能以「實驗」的心態去思考 “Hello World” 這種小規模應用程式在執行時期的微妙變化,此時再佐以網路上豐富的資料,不是更能享受醍醐灌頂的美妙嗎?
他把整個序列的slides放置在這裡。
巧合地是,我在2008年左右也有過類似的心路曆程,雖然跟前輩Jserv比起來只是咿呀學步,不過有興趣的朋友也可以一同分享,目前已經整理成開源書籍:《C語言編程透視(開源書籍)》,目前只是0.01版,正在持續校訂中。
忘記提gcc,gdb之類了。在Linux下面學習C,你離不開他們,當然還有編輯器vim+cscope+ctags,還有gprof, gcov等。
指令碼語言
學一兩樣指令碼語言,對於平時的學習和工作會起到事半功倍的效果。
比如說要處理一些資料,可以用sed, awk加gnuplot,這個時候shell程式設計就非常重要。關於Shell,我有寫過一個《shell編程範例序列》,已經作為開源書籍PLEAC-Shell項目發布。
又比如,要做一些比較複雜的甚至帶有圖形的互動,這個時候可以用Python,可以高效地實現一些案子,而且可以學習物件導向的思路。
編譯原理
編譯原理太重要的,你瞭解turob c, virtual studio C++背後的故事嗎?很難吧,但是gnu toolchains可以。
從原始碼編輯(vim)、預先處理(Gcc -E, cpp)、彙編(as)、編譯(gcc -c)、連結(gcc, ld)的整個過程你可以看得一清二楚。你可以用binutils提供的一序列工具readelf, objdump, objcopy, nm, ld, as理解什麼是可執行檔,可執行檔的結構是什麼樣的,它包含了哪些東西,那些所謂的程式碼片段、資料區段是如何組織的。通過objdump,你可以反組譯碼一個有趣的可執行檔,看看它背後的實現思路。還可以看看為了支援動態連結,可執行檔該怎麼組織。還可以瞭解,一個程式執行時的細節,它怎麼能夠在螢幕上列印出來一個”Hello, World!”,這需要什麼樣的支援,這個背後的硬體、作業系統以及應用程式做了什麼樣的工作?
另外,你還可以去看gnu toolchains的原始碼。如果覺得這個東西太龐大。你也可以去閱讀我們剛才提到的那個天才:法布裡斯·貝拉 ,他寫的TCC:Tiny C Compiler,可以看到一個完整的小巧的C編譯器是如何?的。
對了,相關的方面,我有寫一個序列的Blog:Linux下C語言程式開發過的程視圖,目前已經整理成開源書籍:《C語言編程透視(開源書籍)》。
資料庫
Mysql, PostgreSQL, SQLite?我在上學的時候,這些東西就很火,這麼多年了,還是那麼火。特別是那個小巧的SQLite,Android都在用了。而且她小巧,你可以學習那些SQL語言背後具體是怎麼實現的。
也許你說企業級的Oracle, SQLServer很好用啊,是的,她們是濃妝豔抹的貴婦,高高在上,在有錢人的圈子裡打轉,不會投懷送抱的,你永遠沒有機會摸透她們的心思。
電腦網路
回到虛擬化,用Qemu(當然,還有VirtualBox之類),你理論上可以建立任意多台虛擬電腦,搭建任意多種不同的網路服務,建立一個複雜的叢集,想做橋接器,還是想做NAT你可以選……
其他
幾乎所有的課程,你都可以找到開放的實踐項目,看: 20 Source Code Hosting Sites You Should Know
小結
以上從多個方面分析了學習Linux開源技術的諸多益處。潮流一點叫“社區化學習”,國際一點叫“Open, Free, Share”,國內一點叫“共贏”,傳統一點叫“三人行,必有我師”。
為什麼電腦的學生要學習 Linux 開源技術