http://www.tinylab.org/why-computer-students-learn-linux-open-source-technologies/
目录 [隐藏]
为什么计算机的学生要学习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,基本输入输出系统,是个啥玩意,感觉得到,看得到面纱,看不到她真实的样子。但是有了Uboot:http://www.denx.de/wiki/U-Boot,你可以。
可以直接在Qemu里头做Uboot的实验:Using QEMU for Embedded Systems Development, Part 3 或者 利用qemu模拟嵌入式系统制作全过程
操作系统
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://github.com/tinyclub/linux-0.11-lab.git以及这里的五分钟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”,国内一点叫“共赢”,传统一点叫“三人行,必有我师”。