我眼中的嵌入式linux开发<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
2005-10-09
说到linux开发,大家可能有不同的观点。在我看来开发人员大致分为3类:应用程序开发、驱动程序开发、内核开发。
1. 应用程序开发
此类开发和在PC平台上开发基本一致,如不考虑硬件的差异问题,也就是一模一样了。比如在PC的RH9里面用GCC编译了个HELLO WORLD程序,到了ARM或其他平台,只需要使用ARM-LINUX-GCC重新交叉编译一次即可。代码完全可以重用。
需要的技术可以是最简单的编程技术,当然如果做的比较好,涉及到多进程多线程、资源共享等高级编程技术,需要对操作系统的运行机制有一定了解。
2. 驱动程序开发
这是目前嵌入式linux开发领域最热门的,编程和调试相对复杂。驱动程序开发顾名思义是要驱动某个设备,我们主要强调是驱动某个硬件实体设备。由于驱动程序针对的是具体的硬件设备,而该设备在PC平台往往又无法模拟的,因此调试过程必须在目标系统里完成。如果你在PC平台里面交叉编译好了一个设备的驱动程序,该驱动程序必须下载到目标系统里面完成调试。
驱动程序开发人员需要对内核的运行机制有深入的了解,还需要明白驱动程序模型。驱动程序不像应用程序结构框架任意定,一个能用的驱动程序要严格按照内核提供的框架来写。如何申请设备、注册设备、申请内存、申请中断、申请DMA等等,这些都是内核规定好的,不按照规范来,驱动将来就很难稳定运行。驱动程序由于是和CPU架构无关,如果你的PC平台和目标系统能够满足相同的设备配置,那你的驱动开发将和应用程序开发一样容易。
驱动程序编写出了可以参考《linux device drivers》(已经到第三版了)这本书外,最好就是看内核/drivers目录下面的源码。驱动程序可以编写在模块中,也可以直接写入内核,不管哪种,驱动程序都不是内核!
3. 内核开发
linux程序开发的最高境界,少数人能及。内核开发说白了就是如何写一个操作系统,开发人员需要对软件工程有很高的造诣并对硬件平台有手册级的了如指掌。在此,我把内核开发再次细分为核开发和核移植两种任务。
核开发也就是最先出现的linux系统,那是针对X86平台的。核开发的完成给linux系统奠定了一个操作系统需要完成的各个任务的框架。比如进程管理、内存管理、文件系统、设备管理、中断和DMA等,在一个内核出来后就基本确定了所采用的思想和原理。
核移植是在第一个基于X86平台的内核上完成向ARM、PPC、M68K等平台上的移植,或者在同一个平台内在不同的处理器之间移植。针对不同的处理器,要完成相同的任务多少会有些区别,核移植人员要有十分强的“盗版”能力。有些核开发人员同时也是核移植人员,在此向他们致敬。
内核开发就是写操作系统,如果你接触过uc/os等其他简易的系统,你就明白系统开发的过程了。内核开发多是基于一块裸板,开发过程需要该CPU的仿真器支持,或者CPU本身就有调试能力。
目前大部分人在做1和2工作,其实3工作只需做一次就可以了,毕竟CPU的数量和硬件的平台数目有限。除非你用的是一款新设计的CPU,linux-2.6已经提供的大部分的CPU支持,再重复去做内核就是浪费了。
原来偶一直认为在做嵌入式linux开发,动辄就说是内核开发,毕竟驱动有时也是内核的一部分,说内核开发还可以提高从事工作的技术含量。真正的细细看来,从纯技术角度看,只能算是个驱动程序开发。
文章评论(0条评论)
登录后参与讨论