精通linux 驱动程序开发_linux驱动开发学习
精通linux 驱动程序开发的今日更新不仅仅是技术上的更新,更是人们生活方式的改变。今天,我将和大家探讨关于精通linux 驱动程序开发的今日更新,让我们一起探讨它对我们生活的影响。
1.嵌入式linux驱动要学哪些
2.如何玩转linux驱动
3.如何自学linux驱动开发,做驱动开发需要哪些方面的知识
4.linuxarm驱动开发linuxarm驱动
5.做linux下的驱动开发,需要掌握哪些技能和知识点?有没具体的要求列一下.谢谢各位
6.linux如何开发显卡驱动
嵌入式linux驱动要学哪些
1、 编写Linux设备驱动要求工程师有非常好的硬件基础,懂得SRAM、Flash、SDRAM、磁盘的读写方式,UART、I2C、USB等设备的接口以及轮询、中断、DMA的原理,PCI总线的工作方式以及CPU的内存管理单元(MMU)等。
2、编写Linux设备驱动要求工程师有非常好的C语言基础,能灵活地运用C语言的结构体、指针、函数指针及内存动态申请和释放等。
3、编写Linux设备驱动要求工程师有一定的Linux内核基础,虽然并不要求工程师对内核各个部分有深入的研究,但至少要明白驱动与内核的接口。尤其是对于块设备、网络设备、Flash设备、串口设备等复杂设备,内核定义的驱动体系架构本身就非常复杂。
4、编写Linux设备驱动要求工程师有非常好的多任务并发控制和同步的基础,因为在驱动中会大量使用自旋锁、互斥、信号 量、等待队列等并发与同步机制。朱,有,鹏的驱动开发讲得还不错。
如何玩转linux驱动
目前Linux内核和驱动开发工程师的发展前景主要有以下几点:
从事嵌入式开发是当下比较热门的一个领域,做职业规划的时候,比较清晰的是有三条路可以走:
C1、嵌入式软件开发工程师
C2、嵌入式硬件开发工程师
C3、嵌入式驱动开发工程师。
其中
C1是计算机相关专业的同学可以选择的,因为学习的课程相对偏软,平时在PC上编程比较多,做软件开发会相对轻松。
C2是学习电子电路的同学可以考虑,对模拟电路比较熟悉,可以设计出质量好的电路板。
C3的难度比较大,需要同时熟悉软件和硬件,真正的做到软、硬相结合,搭建软件和硬件互通的桥梁,当然了在业界的待遇也是相对来说比较高的。
我们可以去一些招聘网站查看相关企业的岗位要求,这样学习的时候就有了一个比较明确的目标。今天看到一位前辈的博文,谈究竟应该如何成为优秀的驱动开发工程师,很受鼓舞,在此与大家分享共勉。
何谓优秀的驱动开发工程师
首先要定义,我所认为的一个优秀的驱动开发工程师,应该具备什么样的能力,这里列一下按照从易到难的顺序,个人认为应该会有几个方面的要求吧:
能够独立完成驱动的功能开发任务
能够分析和优化驱动的性能,针对特定硬件扬长避短
能够充分了解模块相关软硬件能力、发展方向,辅助应用工程师最大化利用硬件能力
能够辅助硬件工程师规划硬件设计,预防问题,谋求功能模块的最佳方案
能够协助定义系统架构,合理规划软硬件,谋求产品实现的最佳方案
作为一个驱动工程师,很多时候不是完全从头开发一个完整的子系统,而是针对特定硬件和平台移植驱动,增加功能,解决Bug等等,如果从这方面外在的表现来看:
解决问题的境界,大概会有这么几个阶段:
不知道哪里存在BUG
不知道如何解决BUG
知道如何解决BUG
知道如何发现BUG
知道如何规划BUG
知道如何发现BUG(而不是撞上BUG)其实并不简单,需要你对系统有足够的了解,能够察觉可能出问题的地方。
而规划Bug更难,需要你能对问题的轻重缓急做出准确的判断。没有的完美的世界,只有适当的取舍,规避和预防。
而从解决问题过程的角度来看,我认可以分为几个阶段:
BUG发生 -> 大量跟踪调试代码 -> 终于发现并解决BUG
BUG发生 -> 理论推测可能原因 -> 迅速定位并解决BUG
阅读代码 -> 预测可能出现的BUG -> 证实并解决BUG
应该具备怎样的素质
那么要达到上诉最佳境界,需要具备和发展哪些素质和能力呢?
一、足够的硬件知识
能看简单的原理图,能够分析硬件异常的可能原因,能够使用常见的硬件调试工具,我想这是做为优秀的驱动工程师,区别与其它软件工程师,所不可避免、必须具备的专业素质。当然取决于你具体从事的工作,对这方面的要求不尽相同。
对于驱动开发者来说,不了解所开发驱动外设的硬件原理和相关背景知识,也许很多时候,也能够完成一些移植,修补的工作任务,但这就好比无源之水,无根之木,我相信是很难走远的。
二、多多益善的操作系统知识
做驱动开发,特别是纯粹的外设的驱动移植工作,刚开始的时候,也许你并不需要了解很多操作系统本身的知识(像内存管理,进程调度,锁,各种内核子系统的原理框架等等),也能顺利完成手头的一些工作。
但是,如果一但需要优化驱动,需要完善软件框架,或者是遇上疑难问题需要跟踪解决,对操作系统,内核本身的了解,就体现出它的价值了。
对于Linux内核驱动开发者,尤其如此,首先,代码是完全开源的,你有条件去了解背后的运行机制,其次,Linux内核和各个组成子系统总是在迅速的进化发展中,不进则退,你也有必要跟上时代发展的脚步。
三、强烈的好奇心,持续的热情
如果驱动开发不仅仅是你的爱好,更是你养家糊口的途径,我想,很多时候,你大概不会有机会专注于一两个你最有经验的模块的开发和维护。随着能力的成长,势必会要求你接触和掌握越来越多的各式各样的驱动模块的开发。
对于这件事,包括我自己,有时候大概都会有如下几种反应:
哇,原来的工作做太久了,太乏味了,很高兴能做不同的工作。
啊?又要做别的模块啊?我手头的工作已经太多了!
这个模块没意思,我不想做。
相信多数有志青年们都是第一种表现了,不过,有些时候,我发觉,很多人的这种热情其实并不持久,一个新的模块没做多久,就再次厌倦了,是已经炉火纯青了么,未必,或许只是修改了几个BUG以后不甚其烦。很多时候,我面试前来求职的工程师时,发现简历上这个也做过,那个也做过,但是一旦问到解决了什么问题,所做过的驱动,框架、流程、原理之类的问题的时候,就一问三不知了。
我觉得如果自己的目标是优秀,那么最起码的标准应该是对具体驱动模块相关的子系统的整体工作流程,框架,具备足够的好奇心,乐于去了解和学习,而不仅仅是为了完成任务而工作,否则的话,很难积累下扎实的经验和技术。
四、清晰的逻辑思维能力
这一点,也许是个软件开发人员都应该具备吧,不过,做为驱动开发工程师来说,有时候,大多数情况下,工作的硬件环境并不是完美的,遇到问题需要分析判断错误的原因是硬件问题还是驱动Bug,这时候,清晰的逻辑思维能力尤其重要。
五、良好的工作习惯
大多数人都不是天才,要成为优秀的开发工程师,其一需要持续努力,其二需要时间积累经验,而这过程中,很重要的一点,就是要有良好的工作习惯。譬如,注意设计文档的维护,对工作中遇到的问题的记录,过往经验的及时记录,适当的软件开发流程等等。文档工作,可能很多人很不愿意去做,它的确很花费时间。不过,唉。。。老啦,好记性不如烂笔头啊
。当然,其实设计文档更多的是为你提供思考的机会,而过往经验的总结,也可以起到和大家交流技术,共同进步的目的。
六、英语
这个也是必须的啦,没有办法,邮件列表,技术文档,社区,精通英语肯定是很大的优势,做开源项目尤其如此。阅读各种Spec标准文档之类的速度还是很重要的。阅读无障碍是一回事,能和母语一样一目十行,那才爽呀,唉,人生苦短,效率啊!光读文档,就不知道要比老外多花多少时间。
如何自学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驱动。
linuxarm驱动开发linuxarm驱动
做嵌入式应用的话一般的编程就可以了。那么嵌入式驱动开发与内核开发的话就需要学习多个方面的知识。我就把这方面的要求给你交流一下:
(一家之言啊,自己多年从事嵌入式开发的一点感悟)
嵌入式驱动开发需要了解的知识大概有以下几类:
1 嵌入式操作系统驱动框架。每一个操作系统都有自己的构架,应该了解驱动在整个系统中的具体位置与构建驱动程序的主要事项
2 总线知识,比如PCI、USB总线。
3 芯片知识。驱动其实就是对设备上一些寄存器的配置、CPU与设备本身的通讯以及对不同命令的处理
4 要做好驱动,必须对所使用的CPU体系结构有一个比较深刻的认识
5 C++基本用不上,主要是C和汇编。
6 做驱动最好要懂内核调试(比如说linux)
做linux下的驱动开发,需要掌握哪些技能和知识点?有没具体的要求列一下.谢谢各位
linux内核目录driver/usb/serial/option.c驱动请教?arch下面是体系架构,以及平台相关文件:
比如,把arch/arm/config里面的s3c2410_defconfig,拷贝到内核根目录,命名为.config
再修改根目录Makefile,选择arm交叉编译工具,执行makemenuconfig就可以配置
你定义的内核,选择自己的驱动。
USB、TTY、LCD、网卡等驱动在不同的目录,建议先了解和熟悉linux目录树结构,
以及各自对应的功能。
比如/net目录是网络驱动,但是/driver/net/下面是网络相关的具体设备驱动。
假设你有两个网卡,一个是DM9000,一个是CS8900,在/driver/net/下面,对应两个目录,但是这两个设备驱动,都属于网卡驱动,在/net下面。
建议结合书本和代码,来一步一步学习。比如LDD等经典书籍。
安卓内核能不能移植至ARM9开发板?
先学PC上的linux编程,内核编程,驱动编程。然后嵌入式移植到ARM9。
linux驱动开发和单片机驱动的区别?
.lonux驱动开发和单片机驱动开发的区别塞以下几点?ARM-Linux应用开发和单片机lonux:
这里先要做一个说明,对于ARM的应用开发主要有两种方式:一种是直接在ARM芯片上进行应用开发,不采用操作系统,也称为裸机编程,这种开发方式主要应用于一些低端的ARM芯片上,其开发过程非常类似单片机,这里不多叙述。
还有一种是在ARM芯片上运行操作系统,对于硬件的操作需要编写相应的驱动程序,应用开发则是基于操作系统的,这种方式的嵌入式应用开发与单片机开发差异较大。ARM-Linux应用开发和单片机的开发主要有以下几点不同:
(1)应用开发环境的硬件设备不同单片机:开发板,仿真器(调试器),USB线;ARM-Linux:开发板,网线,串口线,SD卡;对于ARM-Linux开发,通常是没有硬件的调试器的,尤其是在应用开发的过程中,很少使用硬件的调试器,程序的调试主要是通过串口进行调试的;但是需要说明的是,对于ARM芯片也是有硬件仿真器的,但通常用于裸机开发。
(2)程序下载方式不同单片机:仿真器(调试器)下载,或者是串口下载;
ARM-Linux:串口下载、tftp网络下载、或者直接读写SD、MMC卡等存储设备,实现程序下载;这个与开发环境的硬件设备是有直接关系的,由于没有硬件仿真器,故ARM-Linux开发时通常不采用仿真器下载;这样看似不方便,其实给ARM-Linux的应用开发提供了更多的下载方式。
(3)芯片的硬件资源不同单片机:通常是一个完整的计算机系统,包含片内RAM,片内FLASH,以及UART、I2C、AD、DA等各种外设;
ARM:通常只有CPU,需要外部电路提供RAM以供ARM正常运行,外部电路提供FLASH、SD卡等存储系统映像,并通过外部电路实现各种外设功能。由于ARM芯片的处理能力很强,通过外部电路可以实现各种复杂的功能,其功能远远强于单片机。
(4)固件的存储位置不同单片机:通常具备片内flash存储器,固件程序通常存储在该区域,若固件较大则需要通过外部电路设计外部flash用于存储固件。
ARM-Linux:由于其没有片内的flash,并且需要运行操作系统,整个系统映像通常较大,故ARM-Linux开发的操作系统映像和应用通常存储在外部的MMC、SD卡上,或者采用SATA设备等。
(5)启动方式不同单片机:其结构简单,内部集成flash,通常是芯片厂商在程序上电时加入固定的跳转指令,直接跳转到程序入口(通常在flash上);开发的应用程序通过编译器编译,采用专用下载工具直接下载到相应的地址空间;所以系统上电后直接运行到相应的程序入口,实现系统的启动。
ARM-Linux:由于采用ARM芯片,执行效率高,功能强大,外设相对丰富,是功能强大的计算机系统,并且需要运行操作系统,所以其启动方式和单片机有较大的差别,但是和家用计算机的启动方式基本相同。其启动一般包括BIOS,bootloader,内核启动,应用启动等阶段;
(a)启动BIOS:BIOS是设备厂家(芯片或者是电路板厂家)设置的相应启动信息,在设备上电后,其将读取相应硬件设备信息,进行硬件设备的初始化工作,然后跳转到bootloader所在位置(该位置是一个固定的位置,由BIOS设置)。(根据个人理解,BIOS的启动和单片机启动类似,需要采用相应的硬件调试器进行固件的写入,存储在一定的flash空间,设备上电启动后读取flash空间的指令,从而启动BIOS程序。)
(b)启动bootloader:该部分已经属于嵌入式Linux软件开发的部分,可以通过代码修改定制相应的bootloader程序,bootloader的下载通常是采用直接读写SD卡等方式。即编写定制相应的bootloader,编译生成bootloader映象文件后,利用工具(专用或通用)下载到SD卡的MBR区域(通常是存储区的第一个扇区)。此时需要在BIOS中设置,或者通过电路板的硬件电路设置,选择bootloader的加载位置;若BIOS中设置从SD卡启动,则BIOS初始化结束后,将跳转到SD卡的位置去执行bootloader,从而实现bootloader的启动。Bootloader主要作用是初始化必要的硬件设备,创建内核需要的一些信息并将这些信息通过相关机制传递给内核,从而将系统的软硬件环境带到一个合适的状态,最终调用操作系统内核,真正起到引导和加载内核的作用。
(c)启动内核:bootloader启动完成初始化等相关工作之后,将调用内核启动程序。这就进入了实际的操作系统相关内容的启动了,包括相应的硬件配置,任务管理,资源管理等内核程序的启动。
(d)启动应用:在操作系统内核启动之后,就可以开始启动需要的应用,去完成真正的业务操作了。
linux如何开发显卡驱动
.您要驱动什么东西?抛开Linux系统的约束,您对要驱动的东西是如何工作的、如何去编程驱动它了解吗?是一点不了解?半知半解?一般了解?还是熟知?精通?如果对要驱动的东西都不了解,或者纯粹就想泛泛地学习Linux驱动编程,估计收获不会很大。
2.做过多线程编程吗?为什么要多线程?深刻理会了多线程中如何访问临界资源,如何使用mutex,semaphore?多个线程工作起来,怎么控制它们像我们几个人一起协作干活那样,该各干各的,又该相互通知与配合呢?
3.如果把操作系统比作一个大的执行程序,那么驱动程序就相当于以动态链接库形式提供的“插件”。您有没有做过“插件”式的应用程序?没做过也没关系,您认真思考一下这样的问题:您要做一个控制小车的程序,您这个程序功能很牛X,您希望无论是张家的小车,还是李家的小车都能被您控制,无奈您手头上只有牛家的小车,但你明白,张家、李家的小车功能和你牛家的差不多,控制也就那些事,就是目前不知道具体该如何控制。您得想个法子,留好接口,尽可能保证以后张家、李家的小车都可以被你的程序控制——这时候,你的程序该怎么设计结构比较好呢?
4.CPU在时钟脉冲“PIA-PIA”的节奏下都在干些什么?无论是X86或是ARM,要做驱动,对这个还是得有点基本的了解。
5.保护模式,虚拟内存,大致的道理明白吗?这个得知道。咱们现在大多数的处理器都有cache,cache干啥用?对DMA会有些什么不良影响?这个如果要搞DMA(例如PCI设备驱动)需要明白。
6.按楼上的兄弟说的,找本LDD学习
7.总的来说,设备驱动程序干的是驱动硬件的活,但它的编写更需要注重软件的思路、结构和方法。前面说的写小车控制程序能一定程度上说明这个问题。当然,听起来好像有点难,但是干起来还是挺爽的,没有想的那么复杂
嵌入式开发(七):linux字符型设备驱动初步
linux系统是需要安装显卡驱动的。安装Linux系统并不难,参考用户手册很容易完成。在安装系统以前,看过很多的文章,知道Linux系统对硬件的兼容性很差,安装驱动会非常费事。
1.安装完成后,进入桌面,听到悦耳的启动音乐想起-——系统兼容声卡;无线网卡找到TP-LINK——兼容无线网卡。只是屏幕图像很差,系统本身的显示驱动严重不兼容显卡,因此必须重新安装显卡驱动。
2.在Linux系统下安装显卡驱动比较麻烦,网上浏览,不成功的例子很多。不像Windows只要点击鼠标即刻完成。
3.下面是我安装显卡驱动的详细步骤记录:
1,下载适合我笔记本电脑的显卡驱动,需要注意的是必须是For Linux。我的显卡是ATI Mobility Radeon HD2400,上ATI官方网站找到显卡驱动:ati-driver-installer-8-4-x86.x86_64.run
2,将下载的驱动ati-driver-installer-8-4-x86.x86_64.run拷贝至Linux的Root/下;
3,进入/etc/inittab/ ,修改启动级别为3(id:5:initdefault中的5改为3);重新启动,....Looin:root,进入文字模式;
4,输入:sh ati-driver-installer-8-4-x86.x86_64.run;
5,进入安装提问模式,一直点OK;安装结束;
6,进入文字模式下,输入:startx,进入Linux X-windows桌面;
7,进入/etc/x11/xorg.conf文件,修改下列这段:
Section "Device"Driver "fglrx" ——将vesa改为fglrxIdentifier "Card0 for screen 0"EndSection再添加下列一段:Section "Extensions"Option "Composite" "0"EndSection
8.进入显示设置:在显卡驱动下拉菜单中找到fglrx,点击确定。
9.进入/etc/inittab文件,改回启动级别为5;
电脑重启(因为是X-windows桌面,用reboot命令重启电脑)
启动后,系统进入KDE桌面,这样显卡驱动就完全安装完成了,
在嵌入式系统开发中,Linux字符型设备驱动的设计和实现是一个关键的环节。以下是对该主题的初步介绍:1.设备驱动概述
字符型设备驱动是Linux内核中的一种驱动程序,负责与字符设备进行交互。字符设备是一种顺序访问的设备,如串口、打印机等。驱动的目标是为应用程序提供统一的接口,使其可以通过文件I/O的方式与设备进行通信。
2.驱动程序结构
一个典型的字符型设备驱动包含以下核心部分:
模块初始化:驱动加载时进行的初始化工作,包括设备注册、内存分配等。文件操作函数:处理应用程序对设备文件的各种操作,如读、写、打开、关闭等。中断处理:如果设备支持中断,需要编写中断处理函数。设备注册与注销:在模块加载时注册设备,在模块卸载时注销设备。3.设备文件与驱动关联
Linux采用虚拟文件系统(VFS)将文件与设备驱动关联。在设备注册时,会创建对应的设备文件,应用程序通过对文件的操作来与设备进行通信。
以上内容是由猪八戒网精心整理,希望对您有所帮助。
今天关于“精通linux 驱动程序开发”的探讨就到这里了。希望大家能够更深入地了解“精通linux 驱动程序开发”,并从我的答案中找到一些灵感。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。