编程随想:Linux的四个维度

上一篇 / 下一篇  2012-04-26 11:16:10 / 个人分类:Linux

Linux系统是软件开发历 史上的一个传奇。来自全球的个人、公司、团体为了完成开放和自由的诉求,在一种松散但是却有效的方式下,成功地创建一个伟大的生态系统。无论从软件的规模 和稳定性上面,Linux都是首屈一指的。当然这里说的Linux更多的是一个生态,它包括内核、驱动、库文件、gui、数据库以 及上层应用软件。Linux产生的基因决定了它的应用只能局限在一个小的范围内。当然,你可以不服气地说不是还有android嘛,但是我们要清楚 android事实上是一个建立在Linux之上的虚拟机,严格意义上说和Linux的关系不是那么大。没有google的推广和移动终端联盟的支 持,Linux系统本身只能偏安一隅,在特定的领域发挥特定的作用,而不是像windows一样成为所有人每天必须要面对的系统软件。51Testing软件测试网]o2K/|#]/L-r0O

  当然,说了这么多,我们真正关心的是自身可以从这个生态圈中获得些什么?说得更直白一点就是,我们可以从Linux系统上面学到点什么,它对我们个人的成长和发展有哪些积极的因素。个人觉得,完全可以通过下面四个维度并结合自己的兴趣进行选择和判断。51Testing软件测试网;i6T\{~"\/d

*O`7oa$M8YPW0  (1)熟练学习Linux、配置Linux和使用Linux

X2N:D$P9b4Gr051Testing软件测试网go8L*J/ufb{

   2011年有一本书特别火,长期位列在热销排行榜上,这本书就是《鸟哥的Linux私房菜》。这本书以centos为例,讲了很多的内容,比如说系统安 装、常见配置、软件更新、特殊命令的用法、服务器的配置等等。整本书的内容很厚,而且内容是一版再版,可见大家对Linux的基础知识是非常渴求的。另外 一方面,现在随着电商和视频网站的迅速发展,一种称为运维工程师的职业开始热门起来。由于行业的特殊性,某些互联网公司需要成百上千的服务器统一对客户进行服务,那么怎么样搭建网站、配置服务器均衡负载、进行远程控制、正确配置数据库和统一管理服务器集群,这些都是运维工程师需要关注的事情。从这个意义上来说,运维工程师的重要性可见一般了。

A9A&n0\1H0

O%`"K B#z5Qo9w0t0  (2)利用Linux开发应用层软件51Testing软件测试网1KBh zX;dy/e5y?

3v;tI$q1N,E7o0   通俗意义上来说,利用Linux开发应用层的软件和windows上面开发应用软件没有什么不同。可能,在windows上面使用得比较多的就是 mfc、gdi、win32这些接口,而在嵌入式上面使用的就比较多种多样了,什么qt、minigui、gtk都是可以用来进行开发的。当然,上面说的 都是界面程序,很多公司的Linux程序是没有界面的,比如说游戏公司的Linux工程师。相比较而言,他们看中的更多的是Linux的稳定性,所以在 Linux上开发的更多的都是服务器端程序。很多人都有一个误解,认为操作系统就 一定比应用软件高级,其实不然。在我看来,office、webkit、samba、mplayer这些软件的代码都是在百万行以上,本身的结构也是相当 复杂的。说到应用开发,网上有几本书,分别是《Linux程序设计》、《unix环境高级编程》、《unix网络编程》,对我们都很有借鉴意义。诚然有些 书是基于unix系统的,但是基本的编程接口都是差不多的,相应的代码在Linux跑绝对没问题。51Testing软件测试网zi O_+Q b W0\

6Ea`o'qr0  (3)利用Linux开发驱动

2q V*WS9g0

d+C,e'N)Ev9Fj w8n5k0  和其他os系统开发驱动的工作一样,Linux驱动开发也有自己的一整套流程。要想真正地做好驱动,一般来说你需要知道芯片的寄存器特性、电气原理图、总线标准,当然熟悉信号测试, 通晓定时器、互斥工具、回调机制、位运算、中断机制、芯片设置、信号时序、地址分配,这些也是少不了的。更极端一点,如果本身创业的公司比较小,驱动开发 工程师有的时候还需要自己测试信号、调试boot、焊接芯片,这些都是可能的。所以说,对于真正的芯片企业来说,无论是美资、日资、台资企业来说,驱动开 发工程师的收入都是非常可观的。特别是现在有了android的推波助澜,驱动开发工程师的薪酬更是水涨船高。希望在软件上有所突破的硬件工程师或者是希 望对系统本身进行更多了解的软件工程师,都可以将此作为自己长期发展的一个方向。关于这方面的书很多,《Linux kernel development》无疑是人气最旺的一本,但是我想说的是有一本国内朋友写的书也相当不错,那就是宋宝华的《Linux设备驱动开发详解》,质量也 相当不错,朋友们有时间也可以关注一下。51Testing软件测试网|,B GL^1`)`4C0[8jS

51Testing软件测试网 m[d+l"_

  Linux驱动其实并不复杂,我们要做的就是在Linux统一的驱动框架下实现对外设的统一管理。很多的代码架构都是现成的,所以我们只要做好模仿、学习、测试和验证就可以了。比较简单的代码就是下面的这一段话,51Testing软件测试网T.JoY_-q#d

51Testing软件测试网4fV\Z3O h#M

#include <linux/init.h>51Testing软件测试网lz2V(SX$_|
#include <linux/module.h>
51Testing软件测试网7p"?$T(dmHo

nqfhQOOh$v0MODULE_LICENSE("GPL");
CC$vD+\V e"n0S!u0MODULE_AUTHOR("feixiaoxing");51Testing软件测试网)u:z(k[ tI
MODULE_DESCRIPTION("This is just a hello module!\n");

mfhna7y!dy0

\9P v:bUz*[bz~0static int __init hello_init(void)51Testing软件测试网 @[A O!D#H$i
{
5HJ_+S?k*d0    printk(KERN_EMERG "hello, init\n");
A @*P2ekx0 return 0;51Testing软件测试网GL0BoL.S3G
}
51Testing软件测试网 w&o8r#j&fcj/@j

51Testing软件测试网GC'~(g:}P

static void __exit hello_exit(void)
/}{\$N2o!k9]0{51Testing软件测试网2js$[ e~V
    printk(KERN_EMERG, "hello, exit\n");
? C2Io"Z1se0}
51Testing软件测试网9g/v$fz/]Q

51Testing软件测试网.O |f?I;pGY_~

module_init(hello_init);51Testing软件测试网,^(O~n9OyC
module_exit(hello_exit);

8Z3N X-]GT)m0

b!LT vEm _ L,}0  加载模块就是输入insmod hello.ko,卸载模块就是rmmod hello.ko。在这过程中,我们都可以看到相应的打印内容。当然,朋友们可以一直往里面加代码,一步步调试,一步步学习,只要坚持和总结,都是可以学习好Linux的驱动代码的。51Testing软件测试网 NF&_ B*dU

9ZG4b _'N0  这里顺便把Makefile也写一下51Testing软件测试网6_\0}_*q ?/XEh"]

%RK^ sx1yt:l0ifneq ($(KERNELRELEASE),)51Testing软件测试网%j'|;K'y:b$}6B^%~
obj-m := hello.o

1K2lt-zdGHK'c051Testing软件测试网9v d.iN;K)w5M

else51Testing软件测试网 c3o(pu B
PWD  := $(shellpwd)
8V t,t!E O'e^0C+m6u0KVER := $(shell uname -r)
3gd!? t/i!lZ!\0KDIR := /lib/modules/$(KVER)/build
TAE"QrL3Cz0f)U'\0all:
JY%vl{B)a0j1A0        $(MAKE) -C $(KDIR) M=$(PWD) modules
4}$khOs D4v%J0clean:51Testing软件测试网F9es6Z&|
        rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions
:o&Z*s2JG{,B0endif
51Testing软件测试网)\3oK"Gsi-FA

-gJ;x }#j0  (4)Linux kernel代码移植、修改和维护51Testing软件测试网 |'H}&[-xA

xd@R9n!K$o0   Linux kernel代码相信是被很多人奉为经典的,但是Linux kernel的代码很长也很难。一方面,Linux代码存在技巧代码、汇编代码,同时部分函数冗长、文件冗长、命名不规范,另外一方面Linux的代码分 布合理、系统流程明显、相关资料众多。关键是我们自己怎么从Linux kernel中学到东西?是看书呢,还是看代码呢?是每一行都看呢,还是按照模块看呢?是掌握主要原理呢,还是看实现技巧呢?是看高版本呢,还是先熟悉低 版本呢?下面,我想就自己的经历谈谈自己的看法,

rIX{cp051Testing软件测试网5UGn,A*x

  a)熟悉的代码认真看,不熟悉的代码了解一下接口就可以,对于内存管理只要了解__get_free_page、kmalloc、vmalloc这几个函数就可以了;

PN yl/P0

(i#V Y y hj!z0  b)代码不要贪多求快,多思考多实践;51Testing软件测试网R`h#YW_ ^P*}

%N.D4mpQ$B{9i0  c)忽视技巧,看中代码的处理流程和策略的权衡,多多思考为什么要这么设计;51Testing软件测试网2_+B,b Ep\

51Testing软件测试网$sCX8j%?5l:f(^A~

  d)利用module特性查看代码的执行日志,代替函数堆栈的功能;51Testing软件测试网\Y)o$\4T&N7_6@

wB}Jo/I"b&v"Gn0  e)了解Linux性能的改进方法,了解为什么有软中断、rcu、slab和各种各样的延时函数;

k,S9A(\2y$D2F:@ eP0

\*dOC'}][!v0  f)自己编写os,实现内存管理、信号量、消息队列、驱动开发、中断和线程调度,深入理解os的流程。51Testing软件测试网j${M!Q ar*RUdz-X}


TAG:

 

评分:0

我来说两句

Open Toolbar