如何学习驱动开发-极全网
返回
顶部

修改密码

首页 > 文章 > 体育 > 正文
如何学习驱动开发

+1

-1

收藏

+1

-1

点赞0

评论0

标题:如何学习驱动开发
详情介绍-作者:xiaowei-来源: 极全网 -如有问题点击:在线客服帮助

1.如何学习linux驱动开发


展开全部
1.那么究竟什么是驱动程序,它有什么用呢:
l驱动是硬件设备与应用程序之间的一个中间软件层
l它使得某个特定硬件能够响应一个定义良好的内部编程接口,同时完全隐蔽了设备的工作细节
l用户通过一组与具体设备无关的标准化的调用来完成相应的操作
l驱动程序的任务就是把这些标准化的系统调用映射到具体设备对于实际硬件的特定操作上
l驱动程序是内核的一部分,可以使用中断、DMA等操作
l驱动程序在用户态和内核态之间传递数据
2.Linux驱动的基本框架

3.Linux下设备驱动程序的一般可以分为以下三类
1)字符设备
a)所有能够象字节流一样访问的设备都通过字符设备来实现
b)它们被映射为文件系统中的节点,通常在/dev/目录下面
c)一般要包含openreadwriteclose等系统调用的实现
2)块设备
d)通常是指诸如磁盘、内存、Flash等可以容纳文件系统的存储设备。
e)块设备也是通过文件系统来访问,与字符设备的区别是:内核管理数据的方式不同
f)它允许象字符设备一样以字节流的方式来访问,也可一次传递任意多的字节。
3)网络接口设备
g)通常它指的是硬件设备,但有时也可能是一个软件设备(如回环接口loopback),它们由内核中网络子系统驱动,负责发送和接收数据包。
h)它们的数据传送往往不是面向流的,因此很难将它们映射到一个文件系统的节点上。

2.开始学驱动开发,怎么入门


写在开始之前:应该学习哪种语言,我觉得应该根据你的工作需要或者说你的发展方向而定。基本上两大类吧:C/C++和Java。比如,如果你要做企业级应用的你应该学习Java和C#;如果你想做嵌入式,那么应该学好C语言;其他情况下,在你不知道要做什么之前你可以选择学习C/C++。学会这两大类中的一类,对于你学习其他语言都将是比较轻松,包括脚本语言,动态语言……
1、我的入门是从学习C语言开始的(其实课程是C++),这是我们学校的公共课,我上课比较认真(虽然老师讲得很差,而且一段时间后,我就发现自己的基础掌握比她好,当然理解深度没她好),因此,我认为对于完全没有基础的人而言,听别人讲比较容易入门。当时的教材是学校自己编的,挺烂的。
建议一(以C/C++为例),对于刚想进入编程的人(就是从来都没有接触过编程的人),最好是听课的方式(自己看的话估计要很慢,而且很痛苦),可以找视频或者培训等。C语言推荐入门教材:谭浩强的C语言,最新版是第三版,不过第二版应该也可以了(蓝色的)。说明一下:坚决不同意直接看K&R的《TheCprogramminglanguage》,这本书绝对不是初学者可以看懂的,里面讲语法的并不多,语法都是合在程序里面讲。不过这本书非常好,入门以后一定要看的一本书。
当然可以从C++直接入门,C++之父强烈推荐从C++直接入手。C++推荐入门教材:钱能的C++(红色的,清华大学出版),这本书第一版不是ISOC++,不过比较经典,作者现在也出了第二版了,第二版好像不是太好。国外的最好的入门教材据说是:《AccleratedC++》作者是Koenig和Moo夫妇,非常厉害。他们的著作还有《c陷阱与缺陷》《c++沉思录》。《AccleratedC++》这本入门的书我没有看过,我觉得还是先找本国内的书好好看,看的差不多了,国外的经典书籍随便看就会觉得很有味道,否则你可能会很受打击。
入门的书至少要看两三遍(要彻底理解哦):)。如果是C++,我建议后面类的部分至少要理解三到五遍。说明一下,c++模板的部分可以先不用看,如果有兴趣的话,等把c++学的差不多了,我觉得可以把模板、STL、泛型编程结合起来学习,这个又是一个很大的工作量了,又得下很大的功夫。所以说,C++博大精深啊。

3.arm嵌入式、linux驱动开发应该怎么学?


准备工作:1买一块ARM9的板子,推荐mini2440,先根据实际的板子对板子有一个熟悉,搞嵌入式的,就是要掌握好可裁剪性,对硬件的理解才能在这行混的好,不然只学习软件编程,什么时候才能做到项目经理啊!所以熟悉板子,学习硬件很重要,也是你比那些只会编程的人的优势,这优势关系到你以后升职,扯远了。。。。
2学习好linux,推荐《鸟哥的私房菜》入门用,我入门也是用它的,很好用
学习过程:1准备工作做好了以后,下一个嵌入式的学习视频,根据视频上的程序先跑跑,从helloworld跑起,不要因为简单就不跑,先跑书本上的给你的程序,先不要想着编程,跑完每个程序,然后自己再小改改程序,看能不能实现你自己的想法,这些都做好了,一个视频系列基本看完,进入下一步
2开始看一方面你感兴趣的编程方面,你喜欢驱动开发,那你可以先做一个方面的驱动开发,网卡驱动啊,tcp/ip啊,nfs文件共享啊,各种学,那时候你已经进入合格的进入了嵌入式工程师的队伍了

4.如何学习Android驱动开发


一、Android驱动的基础知识
1.Android驱动是基于Linux驱动,强烈推荐阅读LinuxDeviceDriver3rd版,这本书讲了Linux下设备驱动的基础知识,要求反复细读。
2.能读懂和编写一些C程序。
3.能懂Java基础,因为Framework层的代码与驱动代码联系比较紧密,稍懂一些Java代码,会发现对整个驱动框架的了解更加熟悉。
二、Android/Linux相关驱动框架知识
1.需要Android/Linux相关的知识。
2.需要对Android各模块驱动框架的了解。
3.需要基本的Android调试能力。
三、相关的硬件知识和通信知识
1.Android驱动平时的工作就是调试各种外围设备,是直接跟硬件打交道,需要看得懂电路原理图,了解基本的显示原理和基本的摄像头成像原理等。
2.做Android手机,需要了解基本的通信相关知识,射频原理和基本的Modem相关知识,只有懂相关的硬件知识和通讯设备相关的基础知识,才可以写出更好的Android驱动程序。
四、热爱驱动开发和不断学习
做Android驱动开发需要的是不断的学习,时刻保持着一股激情,不断的学习才能更好的完成日常的驱动开发任务,并能保持对开发的敏锐感觉。就如乔布斯所说的:Stayhungry,Stayfoolish.

5.如何正确入门Windows系统驱动开发领域


[序言]
很多人都对驱动开发有兴趣,但往往找不到正确的学习方式.当然这跟驱动开发的本土化资料少有关系.大多学的驱动开发资料都以英文为主,这样让很多驱动初学者很头疼.本人从事驱动开发时间不长也不短,大概也就3~4年时间.大多数人都认为会驱动开发的都是牛人,高手之类的.其实高手,牛人不是这样定义的.我们在学习驱动开发之前,一定要明白一个道理:术业有专攻,不要盲目跟风.
[本内容适用环境及工具]
1>Windows系统下
2>VS2003版本以上
3>Windows驱动开发包(DDK(老版本)WDK(新版本))
4>有能力着可以安装VMWare
[本内容适用群体]
1>具有C/C++语言基础的人
2>具有80x86汇编基础的人
3>具备高中以上文化水平的逻辑思维
[具备Windows系统理论书籍]
1>Windows核心编程
2>Win32多线程程序设计
3>深入解析Windows操作系统
4>Windows操作系统原理
FAQ1:为什么需要[具备Windows系统理论书籍]这4本书?
答:驱动是Windows系统的一个重要的组成部分,深入Windows系统核心的一个体系,就因为驱动跟系统内核联系得十分紧密,所以涉及了不少系统的基础理论以及原理.因此在学习驱动开发之前必须先明白Windows系统的基础开发理论,Windows系统的运作原理,Windows系统的架构体系.那么我提供的上面4本书是目前市面上我认为最经典最全面的书籍了.
[具备Windows驱动开发书籍]
1>Windows驱动开发技术详解
2>Windows设备驱动程序WDF开发
FAQ2:为什么需要[具备Windows驱动开发书籍]这2本书?
答:假设你对Windows系统的基础理论扎实了,也看完了所说的[Windows系统理论书籍]这4本书,而且你还从事开发过Windows程序或者大程序的经验者.那么你进入Windows驱动开发的时候,需要一本经典的驱动入门开发书籍即可正确入门.现在我提供了[Windows驱动开发书籍]这2本书完完全全针对Windows驱动开发入门而编写的书籍.当然我首要推荐<Windows驱动开发详解>这本书.本书的内容在目前来说,针对驱动开发的讲解时非常到位了.包含了驱动开发理论配置驱动体系等等......是一本不可多得的好书.那么第2本,其实有点滥竽充数,但是他里面有少少涉及到WDF这个最新的驱动开发理论的讲解,大家也就凑合着吧.
[具备Windows调试基础理论书籍]
1>软件调试
2>Windows用户态程序高效排错
FAQ3:为什么需要[具备Windows调试基础理论书籍]这2本书?
答:在开发驱动的情况下,你少不了要调试驱动程序.那么如何调试驱动程序呢?Windows已为你考虑到这个问题了并开发了一套强有力的调试工具:Windbg.如何学习这个工具的调试呢?那么现在市面上只有这2本书针对Windbg讲解得还比较到位,至少针对调试命令的使用,已经用中文讲解了,大家可以通过2本书先大概了解Windbg的调试命令,然后再进一步进行GOOGLE搜索并深入学习.
[具备汇编基础理论书籍]
1>汇编语言作者:王爽
2>80x86汇编语言程序设计教程[绿皮版或者黑皮版]
FAQ4:为什么需要[具备汇编基础理论书籍]这2本书?
答:由于在Windows环境下开发驱动,从而有个弊端,就是Windows的WDK,DDK文档少得可怜,很多说明多是模糊的.因此导致我们开发的驱动极其不稳定,这时就需要逆向Windows驱动的机制来加深理解.在一个由于驱动的不稳定性,会导致系统蓝屏,有时错误并不会直接定位到你的代码,这时就需要汇编来分析错误的缘由.就如我前面介绍的[具备Windows调试基础理论书籍]基本是用汇编语言来阐述调试技术.
[驱动开发扩展书籍]
1>寒江独钓-Windows内核安全编程
2>Windows内核原理与实现
3>RootkitWindows内核安全防范
4>Windows内核情景分析
FAQ5:为什么需要[驱动开发扩展书籍]这4本书?
答:熟话说:学无止境,驱动开发领域是一个很庞大的体系,这归根于驱动框架多样化而决定的.驱动包含了:文件驱动,磁盘驱动,显卡驱动,网络驱动,等等不同的种类,每一种类就是一个领域,你决定你的能力需要扩展到多方面,那么你可以考虑先我这里提供的这4本书来学习,通过阅读这3本书,你会发现驱动可以做很多你意想不到的事情.本人从事开发驱动将近4年,也仅仅涉及文件驱动,磁盘驱动以及一些小型驱动而已.这些的学习我也仅仅是根据需求来进行选择性学习.每个人都有自己的能力极限,大家要量力而行.
[推荐正确学习方式]
1>认真阅读我提供的参考书籍
2>多使用Google来解决你遇到的问题
3>多尝试用驱动写你自己喜欢的功能
4>提升你英文阅读能力,因为大部分有价值的资料来自于国外
5>不要急于求成,不要浮躁,不要把驱动开发技术当做一种炫耀

6.Android 驱动开发应该如何入门和学习成长?


一.认识android的架构
Android其本质就是在标准的Linux系统上增加了Java虚拟机Dalvik,并在Dalvik虚拟机上搭建了一个JAVA的applicationframework,所有的应用程序都是基于JAVA的applicationframework之上。
android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和linux核心层。
二.搭建环境
搭建开发环境
对国内的开发者来说最痛苦的是无法去访问android开发网站。为了更好的认识世界,对程序员来说,会翻墙也是的一门技术,带你去领略墙外的世界,好了,不废话了,国内开发者访问(androiddevtools)上面已经有了所有你要的资源,同时可以下载到我们的主角framework
但是这样的搭建只能去阅读源代码,我们无法去更进一步去实现自己的rom,我们看到锤子的系统在早期的开放rom是自己从新实现了framework的代码,现在看起来他成功了,所以我们还要去搭建android系统的源码编译环境。
搭建源码编译环境
三.开始主题
在一开始写c程序的时候都有一个运行的入口,比如
#include<iostream>
#include<cmath>
#include<algorithm>
usingnamespacestd;
//这里的main就是应用的入口
intmain(intargc,constchar*argv[]){
return0;
}
在计算机网络原理中我们用socket实现一个服务器端,不断的接听客户端的访问,而且他的代码是这样实现的:
#include<winsock2.h>
#pragmacomment(lib,"WS2_32.lib")
#include<stdio.h>
voidmain()
{
WORDwVersionRequested;//版本号
WSADATAwsaData;
interr;
wVersionRequested=MAKEWORD(2,2);//2.2版本的套接字
//加载套接字库,如果失败返回
err=WSAStartup(wVersionRequested,&wsaData);
if(err!=0)
{
return;
}
//判断高低字节是不是2,如果不是2.2的版本则退出
if(LOBYTE(wsaData.wVersion)!=2||
HIBYTE(wsaData.wVersion)!=2)
{
return;
}
//创建流式套接字,基于TCP(SOCK_STREAM)
SOCKETsocSrv=socket(AF_INET,SOCK_STREAM,0);
//Socket地址结构体的创建
SOCKADDR_INaddrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//转换Unsignedlong型为网络字节序格
addrSrv.sin_family=AF_INET;//指定地址簇
addrSrv.sin_port=htons(6000);
//指定端口号,除sin_family参数外,其它参数都是网络字节序,因此需要转换
//将套接字绑定到一个端口号和本地地址上
bind(socSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//必须用sizeof,strlen不行
listen(socSrv,5);
SOCKADDR_INaddrClient;//字义用来接收客户端Socket的结构体
intlen=sizeof(SOCKADDR);//初始化参数,这个参数必须进行初始化,sizeof
//循环等待接受客户端发送请求
while(1)
{
//等待客户请求到来;当请求到来后,接受连接请求,
//返回一个新的对应于此次连接的套接字(accept)。
//此时程序在此发生阻塞
SOCKETsockConn=accept(socSrv,(SOCKADDR*)&addrClient,&len);
charsendBuf[100];
sprintf(sendBuf,"Welcome%stoJoyChou",
inet_ntoa(addrClient.sin_addr));//格式化输出
//用返回的套接字和客户端进行通信
send(sockConn,sendBuf,strlen(sendBuf)+1,0);//多发送一个字节
//接收数据
charrecvBuf[100];
recv(sockConn,recvBuf,100,0);
printf("%sn",recvBuf);
closesocket(sockConn);
}
}
他采用了一个while死循环去监听客户端的请求。
先上源代码
publicfinalclassActivityThread{
publicstaticvoidmain(String[]args){
SamplingProfilerIntegration.start();
CloseGuard.setEnabled(false);
Environment.initForCurrentUser();
EventLogger.setReporter(newEventLoggingReporter());
Security.addProvider(newAndroidKeyStoreProvider());
finalFileconfigDir=Environment.getUserConfigDirectory(UserHandle.myUserId());
TrustedCertificateStore.setDefaultUserDirectory(configDir);
Process.setArgV0("<pre-initialized>");
Looper.prepareMainLooper();
//从中可以看到为app开辟了一个线程进入了looper之中
ActivityThreadthread=newActivityThread();
thread.attach(false);
if(sMainThreadHandler==null){
sMainThreadHandler=thread.getHandler();
}
AsyncTask.init();
if(false){
Looper.myLooper().setMessageLogging(new
LogPrinter(Log.DEBUG,"ActivityThread"));
}
Looper.loop();
thrownewRuntimeException("Mainthreadloopunexpectedlyexited");
}
}
看到源码失望了,没有一个while循环啊,其实用了他方法实现
//用一个looper的机制循环监听响应
Looper.prepareMainLooper();
Looper.loop();
进一步深入代码
publicstaticvoidloop(){
finalLooperme=myLooper();
if(me==null){
thrownewRuntimeException("NoLooper;Looper.prepare()wasntcalledonthisthread.");
}
finalMessageQueuequeue=me.mQueue;
Binder.clearCallingIdentity();
finallongident=Binder.clearCallingIdentity();
//在这里看到了一个循环监听消息
for(;;){
Messagemsg=queue.next();//mightblock
if(msg==null){
//Nomessageindicatesthatthemessagequeueisquitting.
return;
}
Printerlogging=me.mLogging;
if(logging!=null){
logging.println(">>>>>Dispatchingto"+msg.target+""+
msg.callback+":"+msg.what);
}
msg.target.dispatchMessage(msg);
if(logging!=null){
logging.println("<<<<<Finishedto"+msg.target+""+msg.callback);
}
//Makesurethatduringthecourseofdispatchingthe
//identityofthethreadwasntcorrupted.
finallongnewIdent=Binder.clearCallingIdentity();
if(ident!=newIdent){
Log.wtf(TAG,"Threadidentitychangedfrom0x"
+Long.toHexString(ident)+"to0x"
+Long.toHexString(newIdent)+"whiledispatchingto"
+msg.target.getClass().getName()+""
+msg.callback+"what="+msg.what);
}
msg.recycleUnchecked();
}
}


版权声明:本文内容由极全网实名注册用户自发贡献,版权归原作者所有,极全网-官网不拥有其著作权,亦不承担相应法律责任。具体规则请查看《极全网用户服务协议》和《极全网知识产权保护指引》。如果您发现极全网中有涉嫌抄袭的内容,点击进入填写侵权投诉表单进行举报,一经查实,极全网将立刻删除涉嫌侵权内容。

扫一扫在手机打开

评论
已有0条评论
0/150
提交
热门评论
相关推荐
换一批
热点排行