说玩转驱动这话,其实有点过头,玩驱动是个长时间堆集的进程,写出来是一回事,调试起来也是一种锻炼。为了让咱们了解玩驱动的趣味和把握编写驱动的捷径,我共享一些阅历,算是抛砖引玉。不过正所谓一口吃不了个胖子,只需写够了满足多的代码,调试了满足多的模块,玩转驱动也不再话下。期望今日的啰嗦对想踏入或许行将踏入驱动职业的你有些协助。
linux操作体系文章专题:linux操作体系详解(linux不再难明)
咱们很了解Linux 设备驱动的学习是一项浩大的工程,正是由于这个原因,一些人难免望而生畏,其实,只需咱们有满足的堆集和全面的常识,玩转驱动,也是迟早的事。闲话少说,开端来干货。
关于驱动工程师来说,首先要了解驱动在整个体系中的效果,
咱们从上图中能够看出,linux驱动②在这个构架中起到承上硬件①启下运用程序③的效果。在程序的编写中,咱们常用高内聚低耦合的规范,因而,驱动的引进显得含义愈加严重:一方面,使嵌入式运用工程师不必考虑过多的硬件差异,另一方面,经过将设备驱动融入内核,面向操作体系内核的接口,这样的接口由操作体系规则,对一类设备而言结构共同,独立于详细的设备。一起由于linux操作体系有内存办理和进程办理,因而关于多使命并发的要求时,操作体系和驱动的引进使得使命变得简略。可是关于不需求多使命调度、文件体系、内存办理等杂乱功用时,在一个大while(1)循环中既能够完结相关的使命。
上面剖析了驱动的含义,那么,玩转linux驱动需求那方面的常识呢,现在罗列下:
榜首、Linux 驱动工程师要有杰出的硬件根底。
这个要求显而易见,linux驱动工程师的主要使命便是躲藏硬件的差异,给运用工程师一个一致的接口,因而需求能看懂电路图,了解SRAM、Flash、SDRAM、磁盘等模块的读写方法,知道UART、I2C、USB 等设备的接口以及惯例操作,了解轮询、中止、DMA 的原理,PCI 总线的作业方法以及CPU 的内存办理单元(MMU)等。不过关于这种常见的模块,linux内核中有相关的装备,因而需求有阅览linux内核的才能和修正linux内核的才能。
第二 、Linux驱动工程师具有杰出的C 言语根底。
作为一个面向硬件底层和运用层的关键人物,C言语功底是必需求结实的。在编写linux的字符设备和块设备驱动中常用的fopen()、fwrite()、fread()、fclose()以及内存分配中常常运用结构体和指针。因而能灵敏地运用C 言语的结构体、指针、函数指针及内存动态申请和开释闪现的尤为重要。
例如字符设备驱动中的读函数函数的界说
/* 读设备*/
ssize_t xxx_read(struct file *filp, char _ _user *buf, size_t count,loff_t*f_pos)
{
…
copy_to_user(buf, …, …);
…
}
从中看出C言语功底的重要性。
第三、 Linux 驱动工程师具有必定的Linux 内核根底,尽管并不要求工程师对内核各个部分有深化的研讨,但至少要了解设备驱动与内核的接口,尤其是关于块设备、网络设备、Flash设备、串口设备等杂乱设备。
现在作业起来,嵌入式驱动工程师的作业量相对会小一点,由于一般常见的硬件设备供货商都会供给相应的linux版别驱动,驱动工程师的使命便是调试这些驱动能正常运行在自己的体系中,一起确保体系的安稳。
第四、 Linux 驱动工程师具有杰出的操作体系常识。
这个要求关于没有学习过操作体系的人来说仅有的苦楚之处便是关于专有名词不是很了解,例如上半部,下半部,原子操作等。其实刚开端或许是个苦楚的进程,可是只需仔细的剖析了一个或许几个驱动程序后,你就会发现其间的规则。究竟linux驱动大体分为字符设备驱动、块设备驱动和网络设备驱动三类,正所谓抓其大纲,触类旁通,便可融会贯通。因而linux中多使命并发操控和同步等根底很重要,由于在设备驱动中会很多运用自旋锁、互斥、信号量、等候行列等并发与同步机制。
第五、着手才能。
纸上得来终觉浅,因而,看再多的书也没有真实的调试一个驱动来的知道深入。这时你需求建立宿主机渠道,购买开发板。不要好高骛远,从简略的小驱动开端一步一步走,以蚂蚁啃骨头的精力进行学习,收成会很大。
阅历了苦楚的摧残,现在看下嵌入式驱动工程师的甜美吧,作业个三五年,你已经是大师了,能够去招聘网站阅读下,这方面的待遇都是面议奖金都是大大的,赤色票票也随心所愿了。想到这些,你还不下定决计来饱尝linux驱动的优待,信任只需以“驱动虐我千百遍,我待驱动如初恋”的决计,信任你能够玩转linux驱动。