Linux驱动工程师成长之路
linux驱动开发(一)

linux驱动开发(⼀)1:驱动开发环境要进⾏linux驱动开发我们⾸先要有linux内核的源码树,并且这个linux内核的源码树要和开发板中的内核源码树要⼀直;⽐如说我们开发板中⽤的是linux kernel内核版本为2.6.35.7,在我们ubuntu虚拟机上必须要有同样版本的源码树,我们再编译好驱动的的时候,使⽤modinfo XXX命令会打印出⼀个版本号,这个版本号是与使⽤的源码树版本有关,如果开发板中源码树中版本与modinfo的版本信息不⼀致使⽆法安装驱动的;我们开发板必须设置好nfs挂载;这些在根⽂件系统⼀章有详细的介绍;2:开发驱动常⽤的⼏个命令lsmod :list moduel 把我们机器上所有的驱动打印出来,insmod:安装驱动rmmod:删除驱动modinfo:打印驱动信息3:写linux驱动⽂件和裸机程序有很⼤的不同,虽然都是操作硬件设备,但是由于写裸机程序的时候是我们直接写代码操作硬件设备,这只有⼀个层次;⽽我们写驱动程序⾸先要让linux内核通过⼀定的接⼝对接,并且要在linux内核注册,应⽤程序还要通过内核跟应⽤程序的接⼝相关api来对接;4:驱动的编译模式是固定的,以后编译驱动的就是就按照这个模式来套即可,下⾯我们来分下⼀下驱动的编译规则:#ubuntu的内核源码树,如果要编译在ubuntu中安装的模块就打开这2个#KERN_VER = $(shell uname -r)#KERN_DIR = /lib/modules/$(KERN_VER)/build# 开发板的linux内核的源码树⽬录KERN_DIR = /root/driver/kernelobj-m += module_test.oall:make -C $(KERN_DIR) M=`pwd` modulescp:cp *.ko /root/porting_x210/rootfs/rootfs/driver_test.PHONY: cleanclean:make -C $(KERN_DIR) M=`pwd` modules cleanmake -C $(KERN_DIR) M=`PWD` modules这句话代码的作⽤就是到 KERN_DIR这个⽂件夹中 make modules把当前⽬录赋值给M,M作为参数传到主⽬录的Makefile中,实际上是主⽬录的makefile中有⽬标modules,下⾯有⼀定的规则来编译驱动;#KERN_VER = $(shell uname -r)#KERN_DIR = /lib/modules/$(KERN_VER)/build我们在ubuntu中编译内核的时候⽤这两句代码,因为在ubuntu中为我们保留了⼀份linux内核的源码树,我们编译的时候直接调⽤那个源码树的主Makefile以及⼀些头⽂件、内核函数等;了解规则以后,我们设置好KERN_DIR、obj-m这两个变量以后直接make就可以了;经过编译会得到下⾯⼀些⽂件:下⾯我们可以使⽤lsmod命令来看⼀下我们ubuntu机器现有的⼀些驱动可以看到有很多的驱动,下⾯我们使⽤insmod XXX命令来安装驱动,在使⽤lsmod命令看⼀下实验现象可以看到我们刚才安装的驱动放在了第⼀个位置;使⽤modinfo来打印⼀下驱动信息modinfo xxx.ko这⾥注意vermagic 这个的1.8.0-41是你⽤的linux内核源码树的版本号,只有这个编译的版本号与运⾏的linux内核版本⼀致的时候,驱动程序才会被安装注意license:GPL linux内核开元项⽬的许可证⼀般都是GPL这⾥尽量设置为GPL,否则有些情况下会出现错误;下⾯使⽤rmmod xxx删除驱动;-------------------------------------------------------------------------------------5:下⾯我们分析⼀下驱动。
如何学习linux设备驱动

如何学习linux设备驱动Linux系统目前主要维护2.4和2.6两个内核版本,在/ 网站上已经可以下载到最新的2.6内核linux-2.6.38.6,及最新的2.4内核linux-2.4.37.11。
稳定版本号基本上是1~3月更新一次,如:2.6.35至2.6.36,升级版本号每1~2周更新一次,如:2.6.35.1至2.6.35.2。
升级后的高版本内核并不完全兼容低版本内核,所以内核升级对于从事linux开发的技术人员来说影响很大,特别是对于那些刚刚从事linux开发的人员。
通常,内核的升级对从事linux应用程序开发的人员来说影响较小,因为系统调用基本保持兼容,影响比较大的是驱动开发人员。
每次内核的更新都可能导致许多内核函数原型上的变化,其中既有内核本身提供的函数,也有硬件平台代码提供的函数,后者变化的更加频繁。
这一点从许多经典书籍就可验证,当你按照手里的经典著作,如:Alessandro的《linux设备驱动程序》,编写驱动时,发现并不能够成功的在你的linux平台上编译通过、或不能正常执行,原因就在于你用的内核和书里的不一致。
本文从两个方面去解释这个问题,一方面是如何写好linux设备驱动,另一方面是如何应对不断升级的内核。
如何写好Linux设备驱动Linux设备驱动是linux内核的一部分,是用来屏蔽硬件细节,为上层提供标准接口的一种技术手段。
为了能够编写出质量比较高的驱动程序,要求工程师必须具备以下几个方面的知识:●熟悉处理器的性能如:处理器的体系结构、汇编语言、工作模式、异常处理等。
对于初学者来说,在还不熟悉驱动编写方法的情况下,可以先不把重心放在这一项上,因为可能因为它的枯燥、抽象而影响到你对设备驱动的兴趣。
随着你不断地熟悉驱动的编写,你会很自然的意识到此项的重要性。
●掌握驱动目标的硬件工作原理及通讯协议如:串口控制器、显卡控制器、硬件编解码、存储卡控制器、I2C通讯、SPI通讯、USB通讯、SDIO通讯、I2S通讯、PCI通讯等。
linux驱动开发知识点总结

linux驱动开发知识点总结Linux驱动开发是指在Linux操作系统下开发和编写设备驱动程序的过程。
Linux作为一种开源操作系统,具有广泛的应用领域,因此对于驱动开发的需求也非常重要。
本文将从驱动程序的概念、驱动开发的基本步骤、常用的驱动类型以及驱动开发的注意事项等方面进行总结。
一、驱动程序的概念驱动程序是指控制计算机硬件和软件之间通信和交互的程序。
在Linux系统中,驱动程序负责与硬件设备进行交互,实现对硬件的控制和管理。
二、驱动开发的基本步骤1. 确定驱动的类型:驱动程序可以分为字符设备驱动、块设备驱动和网络设备驱动等。
根据具体的硬件设备类型和需求,选择合适的驱动类型。
2. 编写设备注册函数:设备注册函数用于向系统注册设备,使系统能够识别和管理该设备。
3. 实现设备的打开、关闭和读写操作:根据设备的具体功能和使用方式,编写设备的打开、关闭和读写操作函数。
4. 实现设备的中断处理:如果设备需要进行中断处理,可以编写中断处理函数来处理设备的中断请求。
5. 编写设备的控制函数:根据设备的需求,编写相应的控制函数来实现对设备的控制和配置。
6. 编译和安装驱动程序:将编写好的驱动程序进行编译,并将生成的驱动模块安装到系统中。
三、常用的驱动类型1. 字符设备驱动:用于控制字符设备,如串口、打印机等。
字符设备驱动以字符流的方式进行数据传输。
2. 块设备驱动:用于控制块设备,如硬盘、U盘等。
块设备驱动以块为单位进行数据传输。
3. 网络设备驱动:用于控制网络设备,如网卡。
网络设备驱动实现了数据包的收发和网络协议的处理。
4. 触摸屏驱动:用于控制触摸屏设备,实现触摸操作的识别和处理。
5. 显示驱动:用于控制显示设备,实现图像的显示和刷新。
四、驱动开发的注意事项1. 熟悉硬件设备的规格和寄存器的使用方法,了解硬件设备的工作原理。
2. 确保驱动程序的稳定性和可靠性,避免出现系统崩溃或死机等问题。
3. 对于需要频繁访问的设备,要考虑性能问题,尽量减少对硬件的访问次数。
学会linux驱动程序的步骤

学会linux驱动程序的步骤
第一步:建立Linux驱动的骨架
linux内核使用驱动时候,需要先初始化,包括建立设备文件,分配内存地址空间等,退出的时候要释放资源,删除设备文件,释放内存地址空间等。
所以在linux驱动中需要提供两个函数来分别处理驱动初始化和退出的工作,这两个函数分别用module_init和module_exit宏来指定,linux驱动一般都需要指定这两个函数,所以linux驱动有一个C 文件,文件中包含处理驱动初始化和退出的函数,以及指定这两个函数的module_init和module_exit宏.
第二步:注册和注销设备文件
任何一个驱动都有设备文件,misc_register,misc_deregister
第三步:指定与驱动相关的信息
驱动程序带自描述内容,比如用modinfo可以获取包括作者名称,版本号等等,有MODULE_AUTHOR,MODULE_LICENSE,MODULE_ALIAS,MODULE_DESCRIPTION等宏
第四步:指定回调函数
linux驱动的各个动作也可称为事件,这些时间就有相应的回调函数,
第五步:编写功能逻辑
编写程序,来实现该驱动所要求达到的功能,可以由多个函数/多个文件/甚至多个模块组成
第六步:编写Makefile
一个新的驱动程序必须要有一个Makefile,obj-m表示将驱动作为模块编译,obj-y则表示将驱动编译进内核,
echo obj-m := led.o > Makefile
上句表示新建一个Makefile文件,文件中只有一个话:obj-m := led.o。
Linux驱动开发学习的一些必要步骤

Linux驱动开发学习的一些必要步骤5. 写一完整驱动,加上read,write,ioctl,polling等各种函数的驱动实现。
在ioctl里完成从用户空间向内核空间传递结构体的实现。
6. 写一block驱动,加上read,write,ioctl,poll等各种函数实现。
7. 简单学习下内存管理,这个是最难的,明白各种memory alloc的函数实现细节。
这是Linux开发的基本功。
8. 学习锁机制的应用,这个不是最难的但是最容易犯错的,涉及到很多同步和并发的问题。
9. 看内核中实际应用的驱动代码。
你会发现最基本的你已经知道了,大的框架都是一样的,无非是read,write,ioctl等函数的实现,但里面包含了很多很多细小的实现细节是之前不知道的。
这时候就要考虑到很多别的问题而不仅仅是基本功能的实现。
推荐您看中integrated的一个驱动kvm,记得是在driver/lguest下,很好玩的,就是Linux 下的虚拟机驱动,代码不长,但功能强大。
有能力的可以自己写一操作系统按照要求做成磁盘镜像加载到虚拟机中,然后客户机可以有自己的4G虚拟地址空间。
10. 看完驱动欢迎您进入Linux kernel学习中来。
最简单的方法,跟着ldd(Linux devive driver)做一遍。
1、Makefile 是如何编写eg:# 这是上面那个程序的Makefile 文件 1main:main.o mytool1.o mytool2.o 2gcc -o main main.o mytool1.o mytool2.o 3main.o:main.c mytool1.h mytool2.h 4gcc -c main.c 5mytool1.o:mytool1.c mytool1.h 6gcc -c mytool1.c 7mytool2.o:mytool2.c mytool2.h 89分析:在Makefile 中也#开始的行都是注释行.Makefile 中最重要的是描述文件的依赖关系的说明.一般的格式是:Linux 操作系统C 语言编程入门target:components //表示的是依赖关系TAB rule //规则mytool1.o mytool2.o 当倚赖的对象在目标修改后修改的话,就要去执行规则一行所指定的命令.就象我们的上面那个Makefile 第3行所说的一样要执行gcc -o main main.o mytool1.o mytool2.o(注意规则一行中的TAB表示那里是一个TAB 键)Makefile 有三个非常有用的变量.分别是$@,$^,$<代表的意义分别是:$@--目标文件;$^--所有的依赖文件;$<--第一个依赖文件。
linux系统运维工程师面试自我介绍

linux系统运维工程师面试自我介绍面试官您好!我叫[名字],今天特别高兴能来参加这个面试。
我接触Linux系统已经有好长一段时间啦。
我就像是一个在Linux世界里探险的小探险家。
最初接触它的时候,我就被它那种开源、自由的理念给深深吸引住了。
就感觉,哇塞,这简直是一个充满无限可能的宝藏系统呢!在日常的运维工作里,我可处理过不少有趣又棘手的问题哦。
比如说,有一次服务器突然出现故障,各种报错信息就像乱码一样在屏幕上蹦跶。
当时我心里也是有点慌的,不过我知道,慌也没啥用呀。
于是我就静下心来,一条一条地查看日志文件,就像侦探在寻找线索一样。
最后呢,还真让我找到问题的根源啦,原来是一个配置文件里的小参数出了错。
那种解决问题后的成就感,简直无法形容!我这人吧,特别喜欢研究新的技术和工具。
像Ansible这个自动化运维工具,我一接触就爱上了。
它可以让很多重复的工作变得超级简单,就像拥有了一个魔法棒一样。
我经常自己捣鼓,看看怎么能把它运用得更好。
而且我觉得在这个技术不断更新的时代,就得一直保持学习的热情,您说是不是?我也知道,运维工作有时候会很枯燥,但是我不这么觉得。
每一次解决一个系统的小毛病,或者优化一下性能,就像是给一个生病的小伙伴治好病,或者让一个健康的小伙伴变得更强壮,这种感觉特别棒!我觉得自己还算一个比较细心的人。
在运维工作里,细节可是决定成败的呀。
一个小小的字符错误,可能就会引发大问题。
所以我每次操作的时候,都会反复检查,就像考试的时候检查答卷一样,生怕出啥岔子。
当然啦,我也有不足的地方。
有时候遇到特别复杂的问题,可能会钻牛角尖,陷在里面出不来。
不过我也在慢慢改进呢,学会从不同的角度去思考问题。
我真的特别希望能加入咱们这个团队,继续在Linux系统运维的道路上探索下去。
我相信我能给团队带来活力和不一样的想法呢!您觉得我咋样呀?。
linux 开发新驱动步骤

linux 开发新驱动步骤Linux作为一款开源的操作系统,其内核源码也是开放的,因此,许多开发人员在Linux上进行驱动开发。
本文将介绍在Linux上进行新驱动开发的步骤。
第一步:确定驱动类型和接口在进行驱动开发前,需要确定驱动类型和接口。
驱动类型包括字符设备驱动、块设备驱动、网络设备驱动等。
接口包括设备文件、系统调用、ioctl等。
根据驱动类型和接口的不同,驱动开发的流程也有所不同。
第二步:了解Linux内核结构和API驱动开发需要熟悉Linux内核的结构和API。
Linux内核由许多模块组成,每个模块都有自己的功能。
API是应用程序接口,提供了许多函数和数据结构,开发人员可以使用这些函数和数据结构完成驱动开发。
第三步:编写驱动代码在了解了Linux内核结构和API后,就可以编写驱动代码了。
驱动代码需要按照Linux内核的编码规范编写,确保代码风格统一、可读性好、可维护性强等。
在编写代码时,需要使用API提供的函数和数据结构完成相应的功能。
第四步:编译驱动代码和内核模块驱动代码编写完成后,需要编译成内核模块。
编译内核模块需要使用内核源码中的Makefile文件。
编译完成后,会生成一个.ko文件,这个文件就是内核模块。
第五步:加载和卸载内核模块内核模块编译完成后,需要加载到Linux系统中。
可以使用insmod命令加载内核模块,使用rmmod命令卸载内核模块。
在加载和卸载内核模块时,需要注意依赖关系,确保依赖的模块已经加载或卸载。
第六步:调试和测试驱动开发完成后,需要进行调试和测试。
可以使用printk函数输出调试信息,在/var/log/messages文件中查看。
测试时需要模拟各种可能的情况,确保驱动程序的稳定性和可靠性。
Linux驱动开发需要掌握Linux内核结构和API,熟悉驱动类型和接口,按照编码规范编写驱动代码,并进行编译、加载、调试和测试。
只有掌握了这些技能,才能进行高效、稳定和可靠的驱动开发。
linux驱动程序设计入门

深入浅出 Linux 设备驱动编程之内核模块
Linux 设备驱动属于内核的一部分,Linux 内核的一个模块可以以两种方式被编译和加载: (1)直接编译进 Linux 内核,随同 Linux 启动时加载;
Edited by Foxit Reader Copyright(C) by Foxit Software Company,2005-2008 For Evaluation Only.
unsigned long copy_from_user(void *to, const void *from, unsigned long n); unsigned long copy_to_user (void * to, void * from, unsignerom_user、copy_to_user 函数返回不能被复制的字节数,因此,如果完全复制成 功,返回值为 0。 include/asm/uaccess.h 中定义的 put_user 和 get_user 用于内核空间和用户空间的单值交互 (如 char、int、long)。 这里给出的仅仅是关于内核中内存管理的皮毛,关于 Linux 内存管理的更多细节知识, 我们会在本文第 9 节《内存与 I/O 操作》进行更加深入地介绍。 输出
gcc -D__KERNEL__ -DMODULE -DLINUX -I /usr/local/src/linux2.4/include -c -o hello.o hello.c
由此可见,Linux 内核模块的编译需要给 gcc 指示-D__KERNEL__ -DMODULE -DLINUX 参数。-I 选项跟着 Linux 内核源代码中 Include 目录的路径。 下列命令将可加载 hello 模块:
深入浅出 Linux 设备驱动之字符设备驱动程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本人此刻还不是什么驱动工程师,连入门都谈不上,但我坚信在未来的3-5年我肯定能成为我想像中的人,因为我马上就要进入这一行工作了。
写下这个日志来记录我是怎么最后成为我想像中的人才的,呵呵。
《Linux驱动工程师》这个东西是我在大二的时候看到有一篇讲如何学习嵌入式的,点击这里下载PDF,里面讲到嵌入式分为四层:硬件,驱动,系统,应用程序;还说linux驱动最难然后工资也最高就冲着他这句话我就决定我大学毕业的时候要去做这个linux驱动工程师,随后我就先后买了51单片机,ARM7,ARM9还有一大堆的视频教程准备来进行学习。
我还跟我旁边那个哈工大哥们说:“我们学校像我这样的人很少,你们学校呢?”他说:“太少了,不过我们学校都是做这种板子卖的人比较多!”。
行,你们牛!即使是买了这些东西,从大二到现在都快毕业了但感觉还是没有入门。
回想一下我都学过什么啊:1:自己在ARM9上写bootloader(主要锻炼了三方面的知识:C语言应该写了有近万行的代码,ARM9的外设的基本操作方法如UART,LCD,TOUCH,SD,USB,ETHERNET...,makefile);2:移植和学习linux驱动。
下面我说一下我学习Linux驱动的一个思路这也是我在面试的时候自我介绍中最重要的部分;1:硬件知识学习Linux驱动首先得了解这个驱动对应的硬件的一些基本原理和操作方法比如LCD你得了解它的场同步,行同步,像素时钟,一个像素的表示模式,还有就是这个LCD是怎么把图像显示在屏幕上的。
如果是USB,SD卡就得了解相关协议。
可以通过spec(协议)、datasheet来了解,这就是传说中的Linux驱动开发三件宝之二,还有一个就是linux相关源码。
2:了解linux驱动框架linux下的每一类驱动差不多都是一个比较完善的子系统,比如FLASH的驱动它就属于MTD子系统从上到下分为四层:设备节点层,设备层,原始设备层,最下面的与具体硬件相关的硬件驱动层,通常要我们自己来实现就是最下面这个与具体硬件相关那部分代码。
3:了解这个驱动的数据流。
这个过程与第二个过程紧密相关,如果了解了驱动的框架差不多这个过程也算了解了。
比如flash.在/dev/目录下有对应flash的字符设备文件和块设备文件,用户对这些文件进行读、写、ioctl操作,其间通过层层的函数调用最终将调用到最下面的硬件驱动层对硬件进行操作。
了解这个过程我相信在调试驱动的时候是很有帮助。
3:分析与硬件相关通常需要我们实现的那部分源代码。
4:三板子上将驱动调试出来。
每次调试都会出问题,但我买的板子提供的资料比较全调试过程中遇到的问题都比较浅显,即使是浅显的问题也要把它记录下来。
(这个是我上次在华为面试的时候,那个人问我你调试驱动遇到过什么问题吗?你是如何解决的。
当时我学习还没有到调试驱动这一步,所以那次面试也惨败收场)。
好像说了这么多,还没有进入正题《工作的选择》。
在年前去了龙芯,实习2.8K,转正3.5k,环境还是不错,经理很好,头儿也很帅都是中科院的硕士。
不过去了两周我就没去了身边的人都不太理解,我也一度有过后悔的时候,从龙芯出来应该是1月6号,也就是从那个时候开始我就没有再找工作,转而学习linux驱动。
一直到上周日。
上周日的晚上我就开始投简历一开始要找linux驱动,在智联里面输入linux驱动出来500来个职位,点开一看没有一个自己符合要求的,差不多都要3-5年经验本科,有时候好不容易有个实习的关键字在里面,一看要求硕士,严重打击了我的信心,哎不管了随便投,最后又投了一下嵌入式关键字的职位。
最后就瞎申请,看看职位要求差不多就申请。
周一来了,这周一共来了6个面试,创下了我求职以来的历史新高。
周一下午面了一家感觉还不错不过到现在也没有给我一个通知,估计当时我要了4500把他给要跑了,这家是做测量的不是Linux驱动,差不多是把ARM当单片机用。
周二上午一家也是要招linux驱动面了估计不到二分钟,他们就要招有几年工作经验马上能干活的人,不过唯一让我欣慰的是那个前台真TDM漂亮。
周二下午有一家直接没去。
周三有两家,上午是做专业计算机的,下午是百纳威尔(天语)linux 中级驱动工程师,天语是我重点对待的对象。
两家都很远去第一家要近2个小时,第二家要超过2个小时,从第一家到第二家要2个小时。
本来打算不去第一家,直接去天语。
但想了一下去吧长一下见识也行。
直接面试没有笔试问了一些大概情况,没有问太细的技术问题感觉还不错。
10点到的那儿,出来才10点25,直接坐车到天语,一下车就看到两个大字“天语”,真是大,里面还有篮球场,网球场,估计有我们学校这么大,李宁也在旁边,这个时候才12点,本来约的是下午三点前,去那边吃了个饭,又围着天语的大门转了几圈,这个时候上午那家来电话了让我下周一上班,说第一个月给我3.5k,第二个月给4k,我当时一听这么高,直接就答应了,还准备打道回府不去天语了,反正来就来了就去试一下,我从13:20进去到16:20才出来,一进那个6楼我就被震到了给我一个感觉-大公司,这一层就像一个大会场一样一眼望去一片隔断式的办公桌和以前在电视里面看的很像。
先让做一套题做了一个小时,都是操作系统,C语言,ARM,还有LINUX驱动方面的。
完了来了一个人,拿着我做的题一道一道的看,我错的了,不会的还给我讲。
到目前为止也面了十几家了也做了不少题像他这样的我还是第一次碰到,他总体觉得我还做得不错,然后就问我问题:问我做过什么项目吗?我说没有(单片机的都不好意思说了)。
问我IIC,UART,LCD,SD,USB,FLASH,每个我都能答上来一些我确实也都学过,但稍微一深入点问我就不行,比如问:uboot启动时候对nandflash做哪些初始化?设置频率(瞎说的)linux启动过程?不知道(曾经准备研究)IIC有几根线?我说这个简单两根(sclk,data)。
UART的速度有哪些?115200,9600.UART的流控制熟悉吗?不知道。
IIC和UART有什么区别?不清楚(他说一个是同步一个是异步)。
SD卡有几根线,有哪些线?9根,4根数据线,cmd线,clk线等等USB都有哪些过程?枚举,枚举就是要获取设备的信息。
(这个我答得还行)愿意加班吗?不加班都不习惯。
我一看这情况好像没戏,虽然东西是了解一些但是没有做过什么东西。
当时我觉得已经无所谓了,反正有上午那家保底。
最后他给我的评价是:没做过项目都了解这么多,已经不错了,但是如果要上项目的话会比较吃力。
然后他说让我等会儿,他去找他们经理再来和我谈一下。
5分钟后他带来一个人说是他们驱动经理,驱动经理来了就和我聊家常,废话了半天,我只记得他说linux驱动我们很少招本科生一般都是招硕士生,即使是本科生也是工作了好几年的。
这话听我感觉很爽。
出去了说让我再等等,5分钟后驱动经理又带来一个人说是他们总监,总监也不问技术问题就说你的这种情况可以先来我们公司实习到你毕业的时候就转正,实习工资2k。
我问他能不能提供住宿,他说实习期间可以提供住宿,我们也有班车,绕着3,4,5环转。
让我呢回去考虑一下如果可以就去实习。
回来之后,我当时决定就去上午那家,把最优路线都查好了。
晚上把这个我今天面试的情况和老孙汇报了一下,又共同探讨了一下:他说去天语,大公司,又是你梦寐以求的linux驱动,去那儿干上2-3年你不就成了高级linux驱动工程师了吗?又问了两个人都说让我去天语。
最后我也决定去天语。
今天上午我给那个驱动经理打电话,我再问了一下我过来是做linux驱动吗,他说是的就在我的部门,我是驱动经理。
我说的决定来实习。
他说那我通知人事部,人事部会再通知你。
0-前言:以前我在学习Linux驱动的时候就特别想知道,那些正在做linux驱动工作的人到底一天都在做什么呢?如果有谁能描述一下,那让我们这些初学者更清楚的知道工作需要些什么,那我们就更好的去学习,现在我就来记录一下,我的这个菜鸟之路。
1-实验环境:我相信每个学习驱动的人都要做两件事:一个是理论的学习,另一个是做实验;理论的学习算是比较的轻松,驱动相关书籍(我用的是《LDD3》和华清的那本《Linux设备驱动开发详解》),Linux设备驱动开发详解PDF宋宝华版下载见/Linux/2011-04/35312.htm还有网上的很多资源;学习完一个驱动的理论之后,我们就要做实验,效果出来之后,我们才会感觉,真的学习了驱动。
比如学习LCD驱动,先看相关理论知识,然后就得让LCD真正显示出东西来。
在以前学习C语言或者应用程序的编写时,这个实验的环境很容易的搭建起来,只要一台电脑,装个开发软件就ok了,而现在这个嵌入式,是要与具体的硬件打交道,光有电脑不行,还得有板子,有了板子还得搭建这个驱动开发的环境。
我的驱动学习环境是这样的:虚拟机里装RedHat5,板子里面有烧写好的bootloader,bootloader能够和PC机进行网络通信,可以通过网络下载PC机上的内核到板子上,然后让内核跑起来。
内核起来之后就通过NFS挂载根文件系统,NFS根文件系统的好处就在于,我们可以在PC机上去写程序,然后在板子上挂载的NFS根文件系统的运行,效果就会在板子上显示出来(如果不了解NFS根文件系统上网查一下),不过后期我调驱动的时候都是将驱动编进内核,然后把内核下载到板子上跑。
我当时为搭建这个驱动调试环境费了很大的劲,不知道搭了多少遍,主要问题出在那个bootloader不能和PC机通信,就不能用网络下载内核了,内核搞不进去就没法调了。
来到公司,领到电脑后第一个任务就是搭建开发环境,公司有专门的人负责这个开发环境的搭建,装什么软件,出了什么问题都会有专门人来给你解决,我相信其它公司也一样,你去工作不会让你在搭建环境上费劲的,除非你是重头做起。
所以我在这儿和初学者说一下:不要花太多的时间去搭建那个环境,工作当中公司肯定会给你做好的。
拿到开发板后按照他的手册,尽快把环境搭建好进入驱动的学习。
2-驱动调试先说一下,我感觉驱动组的人都在做什么;他们好像都是在调试bug。
从我们整个公司的研发结构来讲:有做硬件的(原理图的设计,画PCB,调试硬件),我们驱动组(专门负责驱动),应用程序组,测试组。
测试组的人相当于用户,整天都在那儿测试,如果发现有bug他们就提交上来,这些bug很多都是我们驱动的事。
比如声音有POP音,POP音什么意思呢,就是你手机开音乐时,最先出来一个特别高的音,这个bug是带我那个人在调,他已经调出来了,他说是因为codec和另外一个模块的上电顺序不对。
找这种bug难吗?如果经验不多,最开始估计还得靠靠运气,有些bug真难调。
以前我多少认为做驱动,就是写驱动,现在看来不是,有些驱动芯片厂家会给的,但也不是一拿来就好用。