当前位置: 技术问答>linux和unix
设备驱动程序是按照什么顺序执行的
来源: 互联网 发布时间:2016-10-16
本文导语: 学习写驱动有段时间了,仿照着别人的,也写了几个简单的驱动程序,一直没弄清楚,驱动是怎么执行的 在insmod后首先应该是到xxx_init()函数里去注册设备号,设备注册后接下来是执行哪个函数? 有没有高手给讲解下...
学习写驱动有段时间了,仿照着别人的,也写了几个简单的驱动程序,一直没弄清楚,驱动是怎么执行的
在insmod后首先应该是到xxx_init()函数里去注册设备号,设备注册后接下来是执行哪个函数?
有没有高手给讲解下,这个顺序是怎么样的啊?
在insmod后首先应该是到xxx_init()函数里去注册设备号,设备注册后接下来是执行哪个函数?
有没有高手给讲解下,这个顺序是怎么样的啊?
|
驱动程序的初始化完成两方便动作
一是与具体设备的关联,表现在注册设备号
二是与具体设备上的操作所对应的回调函数的关联,表现在注册file_operation上。
这两部就可以把对某个设备的某种动作(read/write/ioctl)对应到具体的执行函数上,驱动程序的任务就完成了。
一是与具体设备的关联,表现在注册设备号
二是与具体设备上的操作所对应的回调函数的关联,表现在注册file_operation上。
这两部就可以把对某个设备的某种动作(read/write/ioctl)对应到具体的执行函数上,驱动程序的任务就完成了。
|
注册各种接口而已,注册之后一般不动,按照需要 被 调用。
驱动只做机制,怎么运行,何时运行是别人做的,比如键盘驱动,只在有键盘中断的时候处理一下
驱动只做机制,怎么运行,何时运行是别人做的,比如键盘驱动,只在有键盘中断的时候处理一下
|
这个注册的struct file_operations 结构就是在__init的时候调用 register_chrdev()函数来注册的
|
呵呵,init初始化设备手,驱动程序暂时不执行了。
1. 对于字符设备,块设备,通过标准的文件系统调用来访问这些设备,例如用fopen() API 来打开一个设备,FILE fp=fopen("/dev/mtdblock1", "r_"); /* 打开/dev/mtdblock1这个块设备,以便读和写 */.
2. 对于网络设备,用socket系统调用,send即把数据写入到网络设备里,recv即把设备里的数据读出来。
因此,驱动程序在完成对设备的初始化后,一般需要用户态的程序(最常见的方式),或者内核态的一些模块/内核线程来访问。
1. 对于字符设备,块设备,通过标准的文件系统调用来访问这些设备,例如用fopen() API 来打开一个设备,FILE fp=fopen("/dev/mtdblock1", "r_"); /* 打开/dev/mtdblock1这个块设备,以便读和写 */.
2. 对于网络设备,用socket系统调用,send即把数据写入到网络设备里,recv即把设备里的数据读出来。
因此,驱动程序在完成对设备的初始化后,一般需要用户态的程序(最常见的方式),或者内核态的一些模块/内核线程来访问。
|
字符设备的驱动在注册时会注册一个struct file_operations结构体,里同会注册一些读、写、或者是ioctl等函数供你的应用层调用,至于什么时候用,用哪个,就由应用来决定的。
|
驱动 init 完成以后,基本就不干活了,
被动的由应用程序去调用,或者发生中断的时候处理数据,或者有内核线程的话,会自己干些活。。
被动的由应用程序去调用,或者发生中断的时候处理数据,或者有内核线程的话,会自己干些活。。
|
驱动就是一些函数,用哪个就调哪个。
|
驱动程序是等着别人来调用的,注册成功之后,就基本不做事情了,如果上层过来一个请求,比如read请求,则就会调用驱动程序中的read。有点类似基于事件。。
|
驱动是底层的,对应用层是透明的,只提供接口。 相当于库函数吧。
|
驱动可能会不定时启动一些线程等待请求的发生
如果与io口关联 申请了中断号
那么发生中断 就会进入相关数据处理 如果此时用户进行交互可以得到数据 如果无交互 那么驱动可能继续
去处理中断
具体跟实现有关
如果与io口关联 申请了中断号
那么发生中断 就会进入相关数据处理 如果此时用户进行交互可以得到数据 如果无交互 那么驱动可能继续
去处理中断
具体跟实现有关
|
驱动的机制类似于回调函数。init就是注册,不过同时会做一些申请资源、检查设备状态的事情。
linux的驱动机制感觉挺简单的,但具体到某一类型的驱动,linux为了提供一个统一的接口,其中的关系还是挺复杂的。
linux的驱动,不同的内核版本,其差异还是挺大的。
这是我的一点理解。
linux的驱动机制感觉挺简单的,但具体到某一类型的驱动,linux为了提供一个统一的接口,其中的关系还是挺复杂的。
linux的驱动,不同的内核版本,其差异还是挺大的。
这是我的一点理解。
|
按照xxx_init()函数里面的调用顺序执行啊。