设备驱动程序是按照什么顺序执行的

yel617 2010-05-27 02:06:57
学习写驱动有段时间了,仿照着别人的,也写了几个简单的驱动程序,一直没弄清楚,驱动是怎么执行的
在insmod后首先应该是到xxx_init()函数里去注册设备号,设备注册后接下来是执行哪个函数?
有没有高手给讲解下,这个顺序是怎么样的啊?
...全文
477 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
sandyzy66 2010-11-11
  • 打赏
  • 举报
回复
一个系统调用read把CPU从用户态转到核心态,经过虚拟文件系统VFS传入到设备相关的驱动程序中file_operations的真正实现函数read,这个系统调用可能引发内核中很多管理模块的执行,假如驱动中发现设备没有可用的数据时对于阻塞型的调用,驱动程序会把与其相关联的用户执行线程挂起休眠,从而让出了CPU实现了进程调度器的调度。
glacierful 2010-06-07
  • 打赏
  • 举报
回复
驱动的机制类似于回调函数。init就是注册,不过同时会做一些申请资源、检查设备状态的事情。
linux的驱动机制感觉挺简单的,但具体到某一类型的驱动,linux为了提供一个统一的接口,其中的关系还是挺复杂的。
linux的驱动,不同的内核版本,其差异还是挺大的。
这是我的一点理解。
Wenxy1 2010-06-07
  • 打赏
  • 举报
回复
呵呵,init初始化设备手,驱动程序暂时不执行了。
1. 对于字符设备,块设备,通过标准的文件系统调用来访问这些设备,例如用fopen() API 来打开一个设备,FILE fp=fopen("/dev/mtdblock1", "r_"); /* 打开/dev/mtdblock1这个块设备,以便读和写 */.

2. 对于网络设备,用socket系统调用,send即把数据写入到网络设备里,recv即把设备里的数据读出来。


因此,驱动程序在完成对设备的初始化后,一般需要用户态的程序(最常见的方式),或者内核态的一些模块/内核线程来访问。
yel617 2010-06-06
  • 打赏
  • 举报
回复
xxx_init()函数里好像主要就是注册,没有什么其他的操作
Apple_Demo 2010-06-06
  • 打赏
  • 举报
回复
按照xxx_init()函数里面的调用顺序执行啊。
Tony2251 2010-06-05
  • 打赏
  • 举报
回复
mark,学习一下。
帅得不敢出门 2010-06-05
  • 打赏
  • 举报
回复
驱动可能会不定时启动一些线程等待请求的发生
如果与io口关联 申请了中断号
那么发生中断 就会进入相关数据处理 如果此时用户进行交互可以得到数据 如果无交互 那么驱动可能继续
去处理中断
具体跟实现有关
yel617 2010-06-04
  • 打赏
  • 举报
回复
顶起来,看看更多人的看法
hzcpig 2010-06-04
  • 打赏
  • 举报
回复
驱动程序的初始化完成两方便动作

一是与具体设备的关联,表现在注册设备号

二是与具体设备上的操作所对应的回调函数的关联,表现在注册file_operation上。

这两部就可以把对某个设备的某种动作(read/write/ioctl)对应到具体的执行函数上,驱动程序的任务就完成了。
yel617 2010-06-04
  • 打赏
  • 举报
回复
驱动程序注册的时候除了注册设备号外,还注册了哪些东西啊?
hallowwar 2010-06-04
  • 打赏
  • 举报
回复
驱动是底层的,对应用层是透明的,只提供接口。 相当于库函数吧。
gtj8521 2010-05-28
  • 打赏
  • 举报
回复
这个注册的struct file_operations 结构就是在__init的时候调用 register_chrdev()函数来注册的
lisan04 2010-05-28
  • 打赏
  • 举报
回复
驱动程序是等着别人来调用的,注册成功之后,就基本不做事情了,如果上层过来一个请求,比如read请求,则就会调用驱动程序中的read。有点类似基于事件。。
linux_man1987 2010-05-28
  • 打赏
  • 举报
回复
我也想知道
yel617 2010-05-28
  • 打赏
  • 举报
回复
init()函数完成对驱动程序的初始化,注册设备号
struct file_operations结构体 是连接设备编号与设备操作的
一开始执行init()函数 那struct file_operations结构体 是什么时候注册的?
2楼说是“字符设备的驱动在注册时会注册一个struct file_operations结构体”,不是很解
lkncjy 2010-05-27
  • 打赏
  • 举报
回复
驱动就是一些函数,用哪个就调哪个。
pottichu 2010-05-27
  • 打赏
  • 举报
回复
驱动 init 完成以后,基本就不干活了,
被动的由应用程序去调用,或者发生中断的时候处理数据,或者有内核线程的话,会自己干些活。。
gtj8521 2010-05-27
  • 打赏
  • 举报
回复
字符设备的驱动在注册时会注册一个struct file_operations结构体,里同会注册一些读、写、或者是ioctl等函数供你的应用层调用,至于什么时候用,用哪个,就由应用来决定的。
chenee543216 2010-05-27
  • 打赏
  • 举报
回复
注册各种接口而已,注册之后一般不动,按照需要 被 调用。

驱动只做机制,怎么运行,何时运行是别人做的,比如键盘驱动,只在有键盘中断的时候处理一下

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧