最近20多天来一直在忙于将一个Linux平台下的软件移植到Unix平台下,在完成这个项目的过程中自己的感受其实还是挺多的,下面就随便记录下以作为自己成长的见证吧。公司有个软件,分为Windows版的和Linux版的,可能是因为公司人少的缘故,领导让我一个人负责Linux版本下的软件维护及开发。Linux,地球人都知道,虽然内核用的是同一个,但有各种各样的发行版,要考虑到在各种发行版下软件都能正常工作,所以Linux下的软件维护与开发工作也是比较劳神的。客户那边的运行平台为FreeBSD,刚接到项目时,认为FreeBSD也只是某个Linux的发行版(刚毕业参加工作,大学是在颓废中度过的,原谅我的无知),在原先代码的基础上稍微改动下也就ok了。但看了些FreeBSD的资料最后发现它其实是一个UNIX的系统,虽说Linux也是从UNIX演化出来的,可以说是同宗,但经过这么多年了它们的内核实现肯定各种不同了。
在分析Linux下我们软件的实现机制过程中,发现有些机制在FreeBSD下根本不支持,比如Linux下我们的用户模块和内核模块的通信使用的是netlink,而FreeBSD下没有这种机制;Linux下我们软件的内核模块中使用的一些内核数据结构,在FreeBSD下的实现也不相同......没办法,只有用FreeBSD下的相关机制来替换掉Linux下特有的机制了。
在查找替代机制的过程中,说实话自己心中不自觉的打起了退堂鼓(再一次要求原谅我的不担当),总觉得这个改动太大了吧,自己一个刚毕业参加工作的新兵蛋子能做出来吗。在领导一次次的催问下自己总不能直接了当的说这个我做不出来吧,怎么说自己也是个985学校出来的专业人士,丢不起这个人。没办法,只能采取委婉的语气了,跟领导说:这个改动很大什么的了,短时间内完不成啊什么的。可领导就是领导,不听你这种虚的,直截了当的问我:为什么完不成啊,有问题就解决问题,不要妄下结论,只要你敢想,没什么完不成的。在这种形势下自己只能带着一颗非常不情愿的心一步一步的去解决问题了,说实话刚开始做的时候自己心中是真的极不情愿,但是过一段时间后又换了中想法,觉得这个项目自己再怎么不情愿,领导既然发话了,也是必须要在最短时间内做完的,要是不做的话给领导的印象那就是你的能力有问题了。
换了种想法后,开始踏踏实实的查资料搞起。首先要解决的是内核模块的编译通过,由于FreeBSD的内核与Linux的内核实现机制不同,所以这块除了业务层相关的代码保留了下其他的基本是重写了,比如由于FreeBSD下内核模块的写法与Linux下内核模块的写法不同,这块冲写成FreeBSD下的内核模块的写法;用户层与内核层的通信机制由nelink换成了虚拟设备驱动程序;产生的日志使用一个FIFO的队列存起来以等待用户层来读取日志(用户层使用的是一个while结构不断的read虚拟设备,使用队列可以防止日志还未被读取就被覆盖掉了);数据存储时用的双链表结构在FreeBSD下与在Linux下的实现不一样,以FreeBSD下的双链表的方式重写了数据存储这块;FreeBSD内核提供的一些接口与Linux内核中提供的一些接口不一样,甚至没有提供这种接口,比如struct file结构体定义不一样,FreeBSD下没有current关键字等等,这些地方全换成FreeBSD能提供的接口来实现与Linux下相同的功能。将所有这些搞定并且编译通过后,自己的内心还是不自觉地有一阵狂喜,原来只要你去做,还是会有很大收获的,当然在完成内核模块的重写的过程中得到了某些同事的无私的支持,这也让我明白团队的重要性,很多事情靠你一个人虽然也能做出来,但是如果能依靠一个团队的话项目完成的效率就可以提高一大截,在与团队交互的过程中你也能知道自己与别人的差距,这是一件让人非常惬意的事情。
最后就只剩用户层了。还好UNIX有个POSIX标准,也还好Linux一直在使自己靠近POSIX,我们的软件用户层的代码基本可以编译过去,除了把Linux下的一些相关的编译开关去掉,把使用的Linux的相关的头文件换成FreeBSD下的头文件,以及一些比较特殊的地方稍作修改后用户层编译通过了,还有把与内核层通信的netlink部分的代码换成对虚拟设备的write和read操作,所有的这一切搞完后,离成功就只剩测试了。
在做完这个项目后,感觉自己最大的收获就是要有动手能力,有有实践意识。对于理论知识,只是看看是远远不够的,要有将理论知识转化为实际代码的能力;对于看起来有些难度的工作,不要怕困难,不要找一些让自己心安理得的借口,要动手去做,去实践,有问题解决问题,有困难解决困难。起码在自己的接触面内自己应该有这样一种意识:只要是技术上的问题就都不应该是问题,就应该都是有解决方案或者替代方案的。
阅读(784) | 评论(0) | 转发(0) |