现在,Linux软件工程师大致可分为两个层次:
01
Linux运用软件工程师(Application Software Engineer):
首要运用C库函数和Linux API进行运用软件的编写;
从事这方面的开发作业,首要需求学习:契合linux posix规范的API函数及体系调用,linux的多使命编程技巧:多进程、多线程、进程间通讯、多使命之间的同步互斥等,嵌入式数据库的学习,UI编程:QT、miniGUI等。
02
Linux固件工程师(Firmware Engineer):
首要进行Bootloader、Linux的移植及Linux设备驱动程序的规划作业。
一般来说,固件工程师的要求要高于运用软件工程师的层次,而其间的Linux设备驱动编程又是Linux程序规划中比较杂乱的部分,究其原因,首要包含如下几个方面:
1 ) 设备驱动归于Linux内核的部分,编写Linux设备驱动需求有必定的Linux操作体系内核根底;需求了解部分linux内核的作业机制与体系组成
2)编写Linux设备驱动需求对硬件的原理有适当的了解,大多数情况下咱们是针对一个特定的嵌入式硬件渠道编写驱动的,例如:针对特定的主机渠道:或许是三星的2410、2440,也或许是atmel的,或许飞思卡尔的等等
3 ) Linux设备驱动中广泛涉及到多进程并发的同步、互斥等操控,简略呈现bug;因为linux自身是一个多使命的作业环境,不可避免的会呈现在同一时间对同一设备产生并发操作
4 ) 因为归于内核的一部分,Linux设备驱动的调试也适当杂乱。linux设备驱动没有一个很好的IDE环境进行单步、变量检查等调试辅助工具;linux驱动跟linux内核作业在同一层次,一旦产生问题,很简略形成内核的全体溃散。
在任何一个计算机体系中,大至服务器、PC机、小至手机、mp3/mp4播映器,不管是杂乱的大型服务器体系仍是一个简略的流水灯单片机体系,都离不开驱动程序的身影,没有硬件的软件是海市蜃楼,没有软件的硬件仅仅一堆废铁,硬件是底层的根底,是一切软件得以运转的渠道,代码终究会落实到硬件上的逻辑组合。
可是硬件与软件之间存在一个驳论:为了快速、优质的完结软件功用规划,运用程序工程师不想也不肯关怀硬件,而硬件工程师也很难有功夫去向理软件开发中的一些运用。例如软件工程师在调用printf的时分,不许也不用关怀信息到底是经过什么样的处理,走过哪些通路显现在该显现的当地,硬件工程师在写完了一个4*4键盘驱动后,无需也不用管运用程序在取得键值后做哪些处理及操作。
也便是说软件工程师需求看到一个没有硬件的纯软件世界,硬件有必要通明的供给给他,谁来完结这一使命?答案是驱动程序,驱动程序从字面解说便是:“唆使硬件设备举动”。驱动程序直接与硬件打交道,依照硬件设备的详细方式,驱动设备的寄存器,完结设备的轮询、中止处理、DMA通讯,终究让通讯设备能够收发数据,让显现设备能够显现文字和画面,让音频设备能够完结声响的存储和播映。
可见,设备驱动程序充当了硬件和软件之间的纽带,因而驱动程序的表现方式或许便是一些规范的、事前协定好的API函数,驱动工程师只需求去完结相应函数的填充,运用工程师只需求调用相应的接口完结相应的功用。不管有没有操作体系,驱动程序都有其存在价值,仅仅在裸机情况下,作业环境比较简略、完结的作业较单一,驱动程序完结的功用也就比较简略,一起接口只要在小范围内契合一致的规范即可。可是在有操作体系的情况下,此问题就会被扩大:硬件来自不同的公司、千变万化,全世界每天都会有很多的新芯片被出产,很多的电路板被规划出来,假如没有一个很好的一致规范去规范这一程序,操作体系就会被规划的十分冗余,功率会十分低。
所以不管任何操作体系都会拟定一套规范的架构去办理这些驱动程序:linux作为嵌入式操作体系的模范,其驱动架构具有很高的规范性与聚合性,不光把不同的硬件设备分门别类、归纳办理,而且针对不同硬件的共性进行了一致笼统,将其硬件相关性降到最低,大大简化了驱动程序的编写,形成了具有其特征的驱动安排架构。
下图反映了运用程序、linux内核、驱动程序、硬件的联系。
linux内核分为5大部分:多使命办理、内存办理、文件体系办理、设备办理、网络办理;
每一部分都有承上下的效果,对上供给API接口,供给给运用开发工程师运用;
对下经过驱动程序屏蔽不同的硬件构成,完结硬件的详细操作。