Linux驱动工程师成长之路
- 格式:pdf
- 大小:276.67 KB
- 文档页数:11
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系统目前主要维护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系统中,驱动程序负责与硬件设备进行交互,实现对硬件的控制和管理。
二、驱动开发的基本步骤1. 确定驱动的类型:驱动程序可以分为字符设备驱动、块设备驱动和网络设备驱动等。
根据具体的硬件设备类型和需求,选择合适的驱动类型。
2. 编写设备注册函数:设备注册函数用于向系统注册设备,使系统能够识别和管理该设备。
3. 实现设备的打开、关闭和读写操作:根据设备的具体功能和使用方式,编写设备的打开、关闭和读写操作函数。
4. 实现设备的中断处理:如果设备需要进行中断处理,可以编写中断处理函数来处理设备的中断请求。
5. 编写设备的控制函数:根据设备的需求,编写相应的控制函数来实现对设备的控制和配置。
6. 编译和安装驱动程序:将编写好的驱动程序进行编译,并将生成的驱动模块安装到系统中。
三、常用的驱动类型1. 字符设备驱动:用于控制字符设备,如串口、打印机等。
字符设备驱动以字符流的方式进行数据传输。
2. 块设备驱动:用于控制块设备,如硬盘、U盘等。
块设备驱动以块为单位进行数据传输。
3. 网络设备驱动:用于控制网络设备,如网卡。
网络设备驱动实现了数据包的收发和网络协议的处理。
4. 触摸屏驱动:用于控制触摸屏设备,实现触摸操作的识别和处理。
5. 显示驱动:用于控制显示设备,实现图像的显示和刷新。
四、驱动开发的注意事项1. 熟悉硬件设备的规格和寄存器的使用方法,了解硬件设备的工作原理。
2. 确保驱动程序的稳定性和可靠性,避免出现系统崩溃或死机等问题。
3. 对于需要频繁访问的设备,要考虑性能问题,尽量减少对硬件的访问次数。
学会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驱动开发学习的一些必要步骤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世界里探险的小探险家。
最初接触它的时候,我就被它那种开源、自由的理念给深深吸引住了。
就感觉,哇塞,这简直是一个充满无限可能的宝藏系统呢!在日常的运维工作里,我可处理过不少有趣又棘手的问题哦。
比如说,有一次服务器突然出现故障,各种报错信息就像乱码一样在屏幕上蹦跶。
当时我心里也是有点慌的,不过我知道,慌也没啥用呀。
于是我就静下心来,一条一条地查看日志文件,就像侦探在寻找线索一样。
最后呢,还真让我找到问题的根源啦,原来是一个配置文件里的小参数出了错。
那种解决问题后的成就感,简直无法形容!我这人吧,特别喜欢研究新的技术和工具。
像Ansible这个自动化运维工具,我一接触就爱上了。
它可以让很多重复的工作变得超级简单,就像拥有了一个魔法棒一样。
我经常自己捣鼓,看看怎么能把它运用得更好。
而且我觉得在这个技术不断更新的时代,就得一直保持学习的热情,您说是不是?我也知道,运维工作有时候会很枯燥,但是我不这么觉得。
每一次解决一个系统的小毛病,或者优化一下性能,就像是给一个生病的小伙伴治好病,或者让一个健康的小伙伴变得更强壮,这种感觉特别棒!我觉得自己还算一个比较细心的人。
在运维工作里,细节可是决定成败的呀。
一个小小的字符错误,可能就会引发大问题。
所以我每次操作的时候,都会反复检查,就像考试的时候检查答卷一样,生怕出啥岔子。
当然啦,我也有不足的地方。
有时候遇到特别复杂的问题,可能会钻牛角尖,陷在里面出不来。
不过我也在慢慢改进呢,学会从不同的角度去思考问题。
我真的特别希望能加入咱们这个团队,继续在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软件工程师大致可分为两个层次:(1)Linux应用软件工程师(Application Software Engineer):主要利用C库函数和Linux API 进行应用软件的编写;(2)Linux固件工程师(Firmware Engineer):主要进行Bootloader、Linux的移植及Linux 设备驱动程序的设计。
一般而言,固件工程师的要求要高于应用软件工程师的层次,而其中的Linux设备驱动编程又是Linux程序设计中比较复杂的部分,究其原因,主要包括如下几个方面:(1)设备驱动属于Linux内核的部分,编写Linux设备驱动需要有一定的Linux操作系统内核基础;(2)编写Linux设备驱动需要对硬件的原理有相当的了解,大多数情况下我们是针对一个特定的嵌入式硬件平台编写驱动的;(3)Linux设备驱动中广泛涉及到多进程并发的同步、互斥等控制,容易出现bug;(4)由于属于内核的一部分,Linux设备驱动的调试也相当复杂。
目前,市面上的Linux设备驱动程序参考书籍非常稀缺,少有的经典是由Linux社区的三位领导者Jonathan Corbet、Alessandro Rubini、Greg Kroah-Hartman编写的《Linux Device Drivers》(目前该书已经出版到第3版,中文译本由中国电力出版社出版)。
该书将Linux设备驱动编写技术进行了较系统的展现,但是该书所列举实例的背景过于复杂,使得读者需要将过多的精力投放于对例子背景的理解上,很难完全集中精力于Linux驱动程序本身。
往往需要将此书翻来覆去地研读许多遍,才能有较深的体会。
本文将仍然秉承《Linux Device Drivers》一书以实例为主的风格,但是实例的背景将非常简单,以求使读者能将集中精力于Linux设备驱动本身,理解Linux内核模块、Linux设备驱动的结构、Linux 设备驱动中的并发控制等内容。
Linux、Git之⽗LinusTorvalds的别样技术⼈⽣嘉宾|Linus Torvalds 采编|⽊环带你认识⼀个,不⼀样的 Linus Torvalds!1写在前⾯提起 Linus Torvalds ⼤家的第⼀反应是怎样的?是严苛刻薄,还是神级伟⼤,亦或是孤傲清⾼?⼆⼗五年来,Linus Torvalds ⼀直坚持在技术第⼀线,开发了 Linux 和 Git 两个项⽬,并深刻影响了软件⾏业。
如果没有 Linux,就不会有基于 Linux 的安卓系统,那世界是怎样的?如果没有 Git 的诞⽣,就不会基于 Git 的 GitHub,那么开源的兴旺之势将会迟来多久?有⼈问 Linus,你是如何成长为今天的你⾃⼰的?Linus Torvalds 说,我本⼈并不适合回答这个问题,因为这是个渐进不⾃知的过程;应该请⼀个不会天天见到他的⼈以第三⽅视⾓,来谈谈⼀个不敢直视别⼈眼睛的⼗⼆岁书⾍⼩男孩怎样蜕变成今天的样⼦的。
虽然现在,Linus 已经很⼤程度上摆脱了社交恐惧症,⾯对媒体和观众们可以侃侃⽽谈;但是他依然认为⾃⼰不擅长于与⼈打交道。
他认为贡献开源项⽬通过邮件与⼈互动,给⼈缓冲是他更喜欢的交流⽅式。
他不喜欢直⾯很多⼈⼀起⼯作,⽽ Linux 和 Git 两个项⽬则恰恰是他所喜欢的⼯作形式体现。
Linus称开源社区需要有沟通专家,他们温暖⽽友善,但遗憾的是他⾃⼰并不是这样的⼈。
Linus Torvalds 极度热爱技术,但并不是泛 IT 技术的追随者,他从来没有写过 web 程序、不会设置 FTP 服务器的他有着很聚焦的技术关注点。
Linus 的技术兴趣很挑剔,“如果我被困在⼀个孤岛上,唯⼀逃⽣的机会就是写出⼀套漂亮的 UI,那么我死定了。
所以⼈与⼈是不⼀样的,我不是在找借⼝,我只是在解释。
”但是,他并不是⼀根筋的洁癖开源理想者,很早他就思考了商业对开源的作⽤;他很开⼼也很感激商业公司和基⾦会帮他处理所有那些他不愿意处理的事情,并且可以做到完全放权、不管不问。
西安计算机软件行业linux驱动开发工程师岗位介绍JD模板
岗位名称:linux驱动开发工程师
岗位关键词:集成电路,ARM,IIC
职责描述:
1.负责linux驱动开发及back port工作;
2.负责Linux操作系统在申威、龙芯、ARM等平台上的内核bug修复;
3.国产平台linux系统性能优化工作;
4.为公司的售前/售后工程师提供技术支持,解决技术难题。
要求:1.具备3年及以上linux环境开发工作经验;
2.精通c语言编程,并熟练使用gdb调试,掌握常用软件调试方法,能快速定位软件bug;
3.掌握linux内核驱动开发,有内核字符设备、块设备、网络设备驱动开发经验;
4.熟悉常见硬件工作原理iic、串口、can、flash;
5.能熟练阅读芯片手册;
6.能看懂硬件电路图;
任职要求:。
Linux运维工程师快速就业学习路线图描述本路线图主要是让大家快速就业、高薪就业,都是以实战为主,理论为辅,从零开始学习Linux到高级,只要你真正下决心,给你一个Linux学习目标向导,加上你的全力以赴和我的耐心指导,相信你会看到不一样的你。
很多人都说为什么别人工资那么高,别人为什么有那么好的机会,为什么别人的生活那么幸福,其实你有很多机会,只要你能抓住一个机会去行动去付出,就能实现你心中想要的。
为了让全国更多的人快速就业,找到好的工作,提升自己各方面的能力,特此给大家分享最经典最值得学习的Linux学习线路图(初-中-高),我们都知道机会总是喜欢擦肩而过,如果再抱怨没有机会,当机会溜走的时候,恍然大悟曾经的我有没有抓住,感叹时光不再倒流。
学习目标本学习线路是一个系统完善的系列,不管你有没有基础,这些都不是借口,只要你愿意学,我都会耐心指导、给你提升,从对linux懵懵懂懂--->驾车上路--->熟能生巧--->到最后的高级运维,一切以企业运维环境为基础,其他都是虚无。
学习建议很多时候下不了决心是因为还没有让人困窘到走投无路,当你真正下决心去做的时候,世界都会给你让路,学习Linux没有什么特别的诀窍,唯一的诀窍是:跟着目标,大量练习和实践。
这样你会飞快成长,相信我,相信你的选择给你惊喜!Linux运维初级入门课程系列Linux从入门到精通视频课程(完整版)* 1 Linux操作系统入门简介【免费】* 2 Linux操作系统CentOS6.5安装及学习技巧分享【免费】* 3 Linux系统目录及必备命令学习* 4 Linux权限管理及网络设置* 5 Linux初学常见问题答疑【免费】* 6 Linux下NTP及DHCP服务构建* 7 Linux下NFS及Vsftp虚拟用户讲解* 8 构建Linux下Apache主流WEB服务器* 9 Apache构建基于域名的虚拟机主机* 10 实战构建Linux下MySQL数据库* 11 Linux学习技巧及运维技巧* 12 Linux下主流架构LAMP构建Discuz论坛* 13 LAMP深入应用之构建企业Cacti监控平台* 14 Linux下Cacti监控深入配置* 15 构建企业级自动化安装平台Kickstart* 16 构建Linux下Rsync同步服务器* 17 Linux下运维利器之Shell编程* 18 Linux Shell编程必杀技命令* 19 实战编写Shell脚本满足日常运维* 20 Linux下深入编程之函数及数组编程* 21 构建Linux下Nginx主流WEB服务器* 22 企业实战LNAMP高性能架构* 23 构建多实例Tomcat及性能参数优化* 24 实战Nginx均衡Tomcat、Resin实现动静分离* 25 构建Linux企业级监控Nagios* 26 企业实战Nagios案例深入配置* 27 Iptables防火墙企业实战讲解* 28 企业实战构建DNS域名服务器* 29 实战MySQL主从集群及故障切换* 30 构建MySQL+keepalived高可用自动切换* 31 构建企业keepalived+Nginx高可用负载均衡* 32 构建实施企业级LVS+keepalived满足千万PV * 33 构建Linux下高性能Squid缓存服务器* 34 深入讲解Linux下高并发系统内核优化* 35 深入讲解Nginx负载均衡机制及常见问题Linux编程视频课程Shell从入门到精通(完整版)* 1 Linux下Shell编程基础入门【免费】* 2 Shell编程之变量及LAMP导航菜单编写【免费】* 3 Shell编程之IF条件语句各种案例演练* 4 使用if条件语句编写MySQL备份脚本* 5 Shell编程之LAMP一键安装脚本实战* 6 For循环及实战上百台服务器批量管理* 7 While条件语句企业案例列表读取* 8 Shell编程之Case语句及Select综合菜单应用* 9 Shell编程之函数及案例分析* 10 Shell编程之数组案例讲解* 11 Shell编程之SED及GREP正则表达式详解* 12 Shell编程之四剑客综合讲解* 13 Shell编程之阶段总结-实战批量运维部署脚本* 14 全备和增量备份Linux系统脚本编写* 15 Shell编程之系统硬件信息数据库收集* 16 Shell编程之磁盘报警高级脚本* 17 Shell编程之服务监控检查脚本* 18 Shell编程之实战WEB界面展示一* 19 Shell编程之实战WEB界面展示二* 20 Shell编程之学习心得分享及拓展Linux免费入门视频教程-kickstart自动安装篇* 1 初学者如何学好Linux操作系统【免费】* 2 Linux系统安装标准规范【免费】* 3 kickstart自动化安装简介【免费】* 4 Kickstart+PXE+NFS自动化安装部署【免费】* 5 Kickstart多系统安装方法【免费】* 6 Kickstart添加自动化脚本【免费】* 7 Kickstart格式化大于2T的硬盘【免费】Linux运维中高级课程系列Linux运维视频课程技巧篇* 1 Linux运维学习技巧和方法【免费】* 2 Linux密码破解及系统只读修复* 3 企业DELL服务器RAID技术及创建方法* 4 Linux系统安装标准及格式化大于2T硬盘* 5 Linux集群架构图的制作方法* 6 Linux运维文档编写方法* 7 IT运维之ITIL管理分析* 8 Linux完整内核优化参数讲解* 9 Linux运维故障解决经验分享* 10 Linux下TCP三次握手及DDOS攻防* 11 企业级智能DNS、CDN原理及简介* 12 Linux数据中心路由器及交换机组网讲解* 13 Linux技术及职业生涯心得分享Mysql从入门到精通视频课程【加薪必备版】* 1 Mysql/MariaDB数据库入门简介【免费】* 2 MySQL数据库日常操作命令【免费】* 3 MySQL数据库备份脚本编写* 4 MySQL设置UTF-8终极方法及密码破解* 5 Linux下使用MySQL构建WordPress及Discuz论坛* 6 MySQL远程工具管理及导入* 7 使用xtrabackup备份及恢复MySQL数据一* 8 使用xtrabackup备份及恢复MySQL数据二* 9 MySQL数据库主从原理详解* 10 MySQL数据库主从架构配置* 11 模拟MySQL主从故障及数据恢复* 12 使用Binlog日志快速恢复MySQL数据* 13 MySQL引擎MyISAM与InnoDB讲解* 14 MySQL数据库索引及慢查询讲解* 15 MySQL数据库高效优化解析* 16 MySQL高效架构读写分离配置* 17 MySQL+keepalived高可用架构* 18 MySQL+DRBD+keepalived高可用架构Linux免费运维视频课程-如何高效运维* 1 拿什么让运维工作更有"激情"【免费】Linux运维高级课程系列Nginx视频教程高性能WEB服务器视频课程(完整版)* 1 Nginx入门简介【免费】* 2 Nginx工作原理及安装配置【免费】* 3 Nginx常用命令管理及升级* 4 Nginx配置文件精讲一* 5 Nginx配置文件精讲二及多站点配置* 6 企业实战Nginx+Tomcat动静分离架构* 7 企业实战Nginx+PHP(FastCGI)高性能服务器* 8 Nginx与Tomcat/PHP架构优化* 9 Nginx配置优化及深入讲解* 10 Nginx Rewrite规则详解一* 11 Nginx Rewrite规则详解二【即将发布】* 12 构建Nginx均衡LAMP高性能服务器* 13 Nginx日志分析及脚本编写* 14 Nginx日志切割案例讲解* 15 Nginx防盗链配置案例配置* 16 Nginx均衡TCP协议服务器案例* 17 Nginx运维日常故障解决方案【即将发布】* 18 Nginx构建安全站点HTTPS架构* 19 实战构建企业Nginx Cache缓存系统* 20 构建企业级Nginx+Keepalived集群架构* 21 企业Nginx+Keepalived双主架构案例实战Linux面试视频-高薪就业视频必备(精华版)* 1 Linux运维职业目标及人生规划【免费】* 2 Linux面试技巧分析及方法指导* 3 Linux高级运维工程师面试题目汇总一* 4 Linux高级运维工程师面试题目汇总二* 5 Linux运维职场人生经验交流* 6 Linux生涯IT运维经理必备技术及能力Linux视频教程之高级运维高薪企业实战(高级版)* 1 Linux运维形势及运维自动化展望【免费】* 2 ESXI/KVM虚拟化集群简介* 3 构建Linux下主流KVM虚拟化平台* 4 KVM虚拟化企业日常维护及管理* 5 KVM虚拟化自动化维护及管理* 6 Linux下自动化运维企业案例* 7 Puppet自动化运维简介及平台部署* 8 Puppet自动化资源案例实战* 9 Puppet自动化日常管理与配置* 10 Puppet优化及高可用集群部署* 11 Puppet企业实战批量部署案例* 12 SVN+Puppet构建高效自动化运维方案* 13 Zabbix分布式监控平台部署* 14 Zabbix监控平台日常维护与操作* 15 Ansible轻量级批量部署平台* 16 MongoDB简介及企业部署实施* 17 Redis内存数据库简介及安装配置* 18 企业实战构建Redis主从高可用架构* 19 构建Haproxy+Nginx高性能WEB服务器* 20 构建MySQL+DRBD+Keepalived高可用集群* 21 构建企业级MFS分布式文件系统* 22 企业实战构建DNS主从服务器* 23 智能DNS、CDN入门简介及企业应用* 24 Linux企业运维高效技巧心得及分享Python入门视频课程(零基础入门)* 1 Python编程基础入门篇【免费】* 2 Python编程变量及常用算法【免费】* 3 Python编程条件语句学习* 4 Python编程函数及模块实战* 5 Python编程数据结构列表讲解* 6 Python元组及字典案例讲解* 7 实战Python构建用户查询系统* 8 Python基础阶段综合实战脚本* 9 Python编程错误异常处理* 10 Python面向对象编程入门简介* 11 Python面向对象编程类与对象案例* 12 Python面向对象编程类及学习心得* 13 Python标准库扩展学习QQ/电话:400-851-9651 网址:。
Linux学习的路线图2008-03-01 14:17Linux学习的路线图:了解Linux 的基础知识;掌握50个以上的常用命令;掌握.tgz、.rpm等软件包的安装方法;学习添加外设,安装设备驱动程序;熟悉Linux文件系统和目录结构;掌握vi,gcc,gdb等常用工具;理解shell别名、管道、I/O重定向、输入和输出以及shell脚本编程。
随着Linux应用的扩展许多朋友开始接触Linux,根据学习Windwos的经验往往有一些茫然的感觉:不知从何处开始学起。
作为一个Linux系统管理员,我看了许多有关Linux的文档和书籍,并为学习Linux付出了许多艰苦的努力。
当真正获得了一份正式的Linux系统管理工作后,我更加深刻地理解了Linux的灵魂:服务与多用户。
Linux系统知识是非常广博的,但是只要掌握了重点知识,管理它并没有想象中的那么可怕。
在下面我会将作为系统管理员的一些工作心得和总结出来的经验系统地介绍给大家。
一、学习的目的通过Linux的学习掌握UNIX的目的想必不用多说了,在这个网络人才身价倍增的年代,想靠技术吃饭又不想掌握网络和编程技术是不明智的。
当一人第一次听说Linux并跃跃欲试的时候,总会提出几个?,它是什么(What)? 为什么要用它(W hy)? 怎样学习它(How)?做为开放源码运动的主要组成部分,Linux的应用越来越广泛,从我们平时的娱乐、学习,到商业、政府办公,再到大规模计算的应用。
为了满足人们的需求,各种各样的、基于Linux的应用软件层出不穷。
只要具备了LinuX的基本功,并具有了自学的能力之后,都可以通过长期的学习将专项内容予以掌握。
二、从命令开始从基础开始常常有些朋友一接触Linux 就是希望构架网站,根本没有想到要先了解一下Linux 的基础。
这是相当困难的。
虽然Linux桌面应用发展很快,但是命令在Linux中依然有很强的生命力。
Linux 是一个命令行组成的操作系统,精髓在命令行,无论图形界面发展到什么水平这个原理是不会变的,Linux命令有许多强大的功能:从简单的磁盘操作、文件存取、到进行复杂的多媒体图象和流媒体文件的制作。
Linux底层驱动开发从入门到精通的学习路线推荐Linux底层驱动开发是一项涉及操作系统核心的技术,对于想要深入了解Linux系统内部工作原理的开发人员来说,是一门重要的技能。
本文将为你推荐一条学习路线,帮助你从入门到精通掌握Linux底层驱动开发。
一、基础知识学习阶段在开始学习Linux底层驱动开发之前,你需要掌握一些基础知识。
以下是你可以参考的学习路线:1.1 Linux操作系统基础学习Linux操作系统的基础知识是理解和使用Linux底层驱动的前提。
可以选择阅读《鸟哥的Linux私房菜》等入门书籍,了解Linux的基本概念、命令行操作等。
1.2 C语言编程C语言是Linux底层驱动开发的主要语言。
建议学习《C Primer Plus》等经典教材,掌握C语言的基本语法和编程技巧。
1.3 Linux系统编程学习Linux系统编程是理解Linux内核和驱动开发的关键。
推荐学习《Linux系统编程手册》等教材,学习Linux系统调用、进程管理等知识。
1.4 数据结构与算法良好的数据结构和算法基础对于优化和设计高效的驱动程序至关重要。
可以学习《算法导论》等经典教材,掌握数据结构和常用算法的原理和实现。
二、Linux内核了解与分析阶段在掌握了基础知识后,你需要进一步了解Linux内核和驱动的工作原理。
以下是你可以参考的学习路线:2.1 Linux内核源码阅读通过阅读Linux内核源码,你可以深入了解Linux的内核机制和实现细节。
可以选择《深入理解Linux内核》等相关书籍,逐步学习Linux内核代码的组织结构和关键部分。
2.2 设备驱动模型了解Linux内核的设备驱动模型对于编写高效且可维护的驱动程序至关重要。
可以学习Linux设备驱动模型的相关文档和教程,例如Linux Device Drivers (LDD)等。
2.3 内核调试与分析工具掌握一些常用的内核调试和分析工具是进行底层驱动开发的必要技能。
【原创】嵌入式Linux内核驱动开发学习路线图-------作者:尚观嵌入式为什么选择学习嵌入式?嵌入式系统无疑是当前最热门最有发展前途的IT应用领域之一,同时也是当今IT 领域仅存的几个金领职位之一。
当前的中国IT人才面临严重的“后继乏人”,而且这种缺口由于培训缺乏、教育模式等原因造成的,而缺口最大的,就是高级IT人才。
如果你从事的IT培训不专业,面对竞争越来越激烈的职场,基本找不到工作。
据专家预测,嵌入式每年人才缺口在30万左右。
嵌入式行业平均薪资分布嵌入式职业发展讲解视频视频中主要讲解什么样的人适合从事嵌入式行业、嵌入式行业从业人员需要具备哪些基本素质、嵌入式行业的特点以及嵌入式行业的现状与发展。
嵌入式研发方向职业生涯讲解视频(1)嵌入式研发方向职业生涯讲解视频(2)嵌入式研发方向职业生涯讲解视频(3)嵌入式研发方向职业生涯讲解视频(4)嵌入式研发方向职业生涯讲解视频(5)ARM+Linux嵌入式底层内核驱动方向学习总体路线图基础学习Ⅰ---Linux入门目前嵌入式主要开发环境有Linux、Wince等;Linux因其开源、开发操作便利而被广泛采用。
而Linux操作系统也只是一个简单的操作系统,简单的使用对于嵌入式开发人员来说价值并不很高,真正有价值的是掌握Linux的基本服务和Linux的设计理念、思想,这对于嵌入式开发人员的长期发展是很极其重要的。
Linux 系统有很多发行版,RedHat、Ubuntu、Fedora等。
作为嵌入式开发人员,我们没有必要把精力放到使用哪个Linux发行版上,而是尽快把Linux系统尽快安装好。
如果打算坚持长期学习,那么建议您把自己的电脑做成双系统,而不要在虚拟机上安装。
Ubuntu系统下载地址:/?a=index&m=index&c=iframe&url=http%3A%2F%2Fwww.ubuntu.or %2Fdesktop%2Fget-ubuntu%2Fdownload%2FA)经典书籍推荐:B)经典学习视频推荐:1、Linux学习建议2、UNIX like系统的特点3、UNIX原则4、系统结构与终端控制台5、RHEL5 Linux安装6、Linux下寻求帮助7、文件相关命令初步8、系统命令初步9、用户及组管理初步10、文件属性11、文件夹属性及umask12、Linux编辑器及VIM初步13、Linux查找及压缩14、文本处理及正则表达式15、linux下X图形显示体系16、进程控制17、进程优先级前台后台18、变量快捷键19、bash运算符及启动脚20、shell脚本及交互121、shell脚本及交互2本22、shell脚本流程控制23、shell脚本sed&awk24、Linux安装软件基础学习Ⅱ---C语言C语言是嵌入式开发必备的基础知识。
linux驱动开发流程Linux驱动开发流程。
Linux驱动开发是一项复杂而又重要的工作,它涉及到操作系统内核的底层编程和硬件设备的交互。
在进行Linux驱动开发时,需要按照一定的流程来进行,以确保驱动程序的稳定性和可靠性。
下面将介绍一般的Linux驱动开发流程,希望能够对初学者有所帮助。
1. 硬件设备了解。
在进行Linux驱动开发之前,首先需要对要开发的硬件设备有一个全面的了解。
需要了解硬件设备的型号、接口、工作原理等信息,以便于后续的驱动程序编写和调试工作。
2. 硬件设备驱动框架选择。
针对不同的硬件设备,可以选择不同的驱动框架进行开发。
常用的驱动框架包括字符设备驱动、块设备驱动、网络设备驱动等。
根据硬件设备的特点和需求,选择合适的驱动框架进行开发。
3. 编写驱动程序。
在选择好驱动框架之后,就可以开始编写驱动程序了。
驱动程序是连接硬件设备和操作系统内核的桥梁,需要按照一定的规范和接口来进行编写。
在编写驱动程序时,需要考虑到硬件设备的特性和操作系统的要求,确保驱动程序能够正确地控制硬件设备。
4. 调试和测试。
编写完驱动程序后,需要进行调试和测试工作。
通过调试和测试,可以发现驱动程序中的bug和问题,及时进行修复和优化。
调试和测试是保证驱动程序稳定性和可靠性的重要环节,需要认真对待。
5. 集成到内核。
当驱动程序经过调试和测试后,可以将其集成到Linux内核中。
在将驱动程序集成到内核时,需要按照内核的规范和流程来进行,确保驱动程序能够正确地被内核加载和使用。
6. 发布和维护。
最后,当驱动程序集成到内核后,可以进行发布和维护工作。
发布驱动程序时,需要提供清晰的文档和说明,以便其他开发者能够正确地使用和理解驱动程序。
同时,还需要对驱动程序进行定期的维护和更新,以适应不断变化的硬件设备和内核版本。
总结。
通过以上的介绍,我们可以看到Linux驱动开发流程是一个系统而又复杂的过程。
需要对硬件设备有深入的了解,选择合适的驱动框架,编写稳定可靠的驱动程序,并经过严格的调试和测试,最终将其集成到内核并进行发布和维护。
Linux驱动工程师成长之路工作的选择本人此刻还不是什么驱动工程师,连入门都谈不上,但我坚信在未来的3-5年我肯定能成为我想像中的人,因为我马上就要进入这一行工作了。
写下这个日志来记录我是怎么最后成为我想像中的人才的,呵呵。
《Li nux驱动工程师》这个东西是我在大二的时候看到有一篇讲如何学习嵌入式的,点击这里下载PDF,里面讲到嵌入式分为四层:硬件,驱动,系统,应用程序;还说linu x驱动最难然后工资也最高就冲着他这句话我就决定我大学毕业的时候要去做这个lin ux驱动工程师,随后我就先后买了51单片机,ARM7,ARM9还有一大堆的视频教程准备来进行学习。
我还跟我旁边那个哈工大哥们说:“我们学校像我这样的人很少,你们学校呢?”他说:“太少了,不过我们学校都是做这种板子卖的人比较多!”。
行,你们牛!即使是买了这些东西,从大二到现在都快毕业了但感觉还是没有入门。
回想一下我都学过什么啊:1:自己在ARM9上写bootloa der(主要锻炼了三方面的知识:C语言应该写了有近万行的代码,ARM9的外设的基本操作方法如UART,L CD,TOUCH,SD,U SB,ETHERNET...,makefile);2:移植和学习linux驱动。
下面我说一下我学习Lin ux驱动的一个思路这也是我在面试的时候自我介绍中最重要的部分;1:硬件知识学习Linux驱动首先得了解这个驱动对应的硬件的一些基本原理和操作方法比如LCD你得了解它的场同步,行同步,像素时钟,一个像素的表示模式,还有就是这个LCD是怎么把图像显示在屏幕上的。
如果是USB,SD卡就得了解相关协议。
可以通过s pe c(协议)、datashe et来了解,这就是传说中的Linux驱动开发三件宝之二,还有一个就是linux相关源码。
2:了解linu x驱动框架linux下的每一类驱动差不多都是一个比较完善的子系统,比如FLA SH的驱动它就属于MTD子系统从上到下分为四层:设备节点层,设备层,原始设备层,最下面的与具体硬件相关的硬件驱动层,通常要我们自己来实现就是最下面这个与具体硬件相关那部分代码。
以下是凌阳教育的嵌入式linux培训资深讲师-徐老师提供的免费的linux驱动基础开发教程(linux驱动基础开发0- linux驱动基础开发3)理论加实例详解,重点红字标注。
linux初学者必看!一:linux驱动基础开发0--linux 设备驱动概述目前,Linux软件工程师大致可分为两个层次:(1)Linux应用软件工程师(Application Software Engineer):主要利用C库函数和Linux API进行应用软件的编写;从事这方面的开发工作,主要需要学习:符合linux posix标准的API 函数及系统调用,linux的多任务编程技巧:多进程、多线程、进程间通信、多任务之间的同步互斥等,嵌入式数据库的学习,UI编程:QT、miniGUI等。
(2)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内核工作在同一层次,一旦发生问题,很容易造成内核的整体崩溃。
深入浅出Linux设备驱动编程之引言目前,Linux软件工程师大致可分为两个层次:(1)Linux应用软件工程师(Application Software Engineer):主要利用C库函数和Linux API进行应用软件的编写;(2)Linux固件工程师(Firmware Engineer):主要进行Bootloader、Linux的移植及Linux设备驱动程序的设计。
一般而言,固件工程师的要求要高于应用软件工程师的层次,而其中的Linux设备驱动编程又是Linux 程序设计中比较复杂的部分,究其原因,主要包括如下几个方面:(1)设备驱动属于Linux内核的部分,编写Linux设备驱动需要有一定的Linux操作系统内核基础;(2)编写Linux设备驱动需要对硬件的原理有相当的了解,大多数情况下我们是针对一个特定的嵌入式硬件平台编写驱动的;(3)Linux设备驱动中广泛涉及到多进程并发的同步、互斥等控制,容易出现bug;(4)由于属于内核的一部分,Linux设备驱动的调试也相当复杂。
目前,市面上的Linux设备驱动程序参考书籍非常稀缺,少有的经典是由Linux社区的三位领导者Jonathan Corbet、Alessandro Rubini、Greg Kroah-Hartman编写的《Linux Device Drivers》(目前该书已经出版到第3版,中文译本由中国电力出版社出版)。
该书将Linux设备驱动编写技术进行了较系统的展现,但是该书所列举实例的背景过于复杂,使得读者需要将过多的精力投放于对例子背景的理解上,很难完全集中精力于Linux驱动程序本身。
往往需要将此书翻来覆去地研读许多遍,才能有较深的体会。
(《Linux Device Drivers》中英文版封面)本文将仍然秉承《Linux Device Drivers》一书以实例为主的风格,但是实例的背景将非常简单,以求使读者能将集中精力于Linux设备驱动本身,理解Linux内核模块、Linux设备驱动的结构、Linux设备驱动中的并发控制等内容。
本人此刻还不是什么驱动工程师,连入门都谈不上,但我坚信在未来的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真难调。
以前我多少认为做驱动,就是写驱动,现在看来不是,有些驱动芯片厂家会给的,但也不是一拿来就好用。