关于driver_register做了些什么

现在进入driver_register()函数去看看。在driver_register() 中,调用了driver_find(drv->name, drv->bus)函数,这里是干啥呢?这里是先去驱动打算挂牌的地方先查找一下,这个驱动是否已经挂牌(注册)过了。在哪里查找呢?代码中写得很清楚,去bus->p->drivers_kset中查找,看到这里,我决定这里不要再继续展开细细的分析,否则永远都无法把内核看明白,有时候必须对细节很了解,有时候只要明白他的工作原理就可以,不必太细碎。简单的看,drivers_kset就是一个klist链表,链表的节点都是内核对象,也就是kobject。kset中的kobject可以是不同“类型”的(different “type”),kset只是把一类需要用进行相同处理的kobject放在一起。driver_find函数其实也不干活,它是调用kset_find_obj函数去遍历链表根据drv->name去寻找,我不管找的过程,反正如果找到了driver_find()就返回指向已经注册的驱动的指针,如果没找到就返回NULL。
回到driver_register() ,如果驱动已经注册过了,那就退出好了。如果没有注册,接下来调用bus_add_driver(struct device_driver *drv) 函数注册驱动。这个函数有点长,主要作用就是把drv放到drv->bus->p->klist_drivers链表的尾部。到此就完成注册工作。
阅读了一些老手的笔记,看了一点内核代码,看了LDD,再加上自己的猜测,现在对驱动的工作机制有了一点认识。
内核在维护两条链表,一个用来记录devices,一个用来记录drivers。系统接电开机后,总线就扫一遍有哪些设备接到计算机上了,每个设备都对应一个设备对象,然后就把设备对象填入到记录devices的链表中。接着系统继续启动,到了加载驱动的过程,把驱动对象都填入到记录drivers的链表中。每加载一个驱动,就去遍历一次devices链表,看看有没有自己要服务的设备,如果有,就把该设备对象的驱动指针指向自己,同时把该设备对象加入到驱动程序维护的设备链表中,该设备链表记录了这个驱动能够服务的设备。这是在开机之前硬件就和计算机连接好的工作方式,但是现在更实用的是另外一种工作方式,就是热插拔。
热插拔意味着设备和驱动没有谁先谁后进入系统,因为都有可能。所以工作方式就是一旦有一个设备插入,总线把对应的设备对象加入到记录devices的链表后就去查找那条记录drivers链表,看看有没有能够驱动这个设备的驱动,如果有驱动对象和设备对象就互相指向,这样驱动就能为该设备服务。如果没有找到驱动呢?很简单,设备不工作呗。这个设备就只好等待自己需要的驱动被加载,驱动会去找他。反过来说,驱动可能在设备插入之前被加载,同样的,驱动没有在记录devices的链表上找到她要服务的设备,驱动也就只好等待设备被插入的时候来找她。

所以,之前所想的driver_register()函数会调用drv->probe的想法是错的,仅仅只是注册而已,只有当有设备插入时才会调用drv->probe,它专门是用来插入设备后对设备的操作的,而不是在没有设备插入时一个人在YY

关于driver_register做了些什么,布布扣,bubuko.com

时间: 2024-08-23 11:41:34

关于driver_register做了些什么的相关文章

一张图告诉你广电总局这些年都做了些什么~

广电总局,那些年的禁令!国家新闻出版广电总局是国务院直属机构,我们最熟悉的莫过于电影开场时必然会出现的金色龙形长城标志.那么,一张图,让你看清广电总局这些年做了什么事…… 一张图告诉你广电总局这些年都做了些什么-,布布扣,bubuko.com

【dotnet跨平台】"dotnet restore"和"dotnet run"都做了些什么?

[dotnet跨平台]"dotnet restore"和"dotnet run"都做了些什么? 前言: 关于dotnet跨平台的相关内容.能够參考:跨平台.NET Core--微软开源方向 当中..net core基础库叫CoreFX:https://github.com/dotnet/corefx,.net core执行时叫CoreCLR:https://github.com/dotnet/coreCLR, asp.net core各组件库:https://git

转Rollback后undo到底做了些什么?

转自:http://biancheng.dnbcw.info/oracle/309191.html Rollback后undo到底做了些什么? 从概念上讲,undo正好与redo相对.当你对数据执行修改时,数据库会生成undo信息,这样万一你执行的事务或语句由于某种原因失败了,或者如果你用一条rollback语句请求回滚,就可以利用这些undo信息将数据还原到修改前的样子.Redo用于在失败时还原事务(即恢复事务),undo则用于取消一条语句或者一组语句的作用.与redo不同,undo在数据库内

电脑在开机的时候都做了些什么

首先嘛,开机对于大家来说也就是捅一下开机按钮,然后电脑开始嗡嗡叫,各种风扇转起来,显示器上显示了一个LOGO,最后就看到了Win7的启动动画.这个过程中,电脑详细都做了些什么呢?我在这里详细的说一说我的了解.(注意这只是我的了解,我还是很严谨的哦) 1.开机之后,主板的芯片组会给CPU发送一个RESET信号,CPU会挂起,并不马上执行指令(CS:EIP=0xFFFF:0x0000) 这个时候CPU完成初始化,内部恢复到初始状态. 等芯片组检测到电源已经稳定供电了,芯片组就撤去RESET信号,CP

dreamvc框架(三),dispartcher做了些什么

这一篇我会介绍一些dreamvc的核心类Dispatcher都做了些什么,首先我们先来看一看init方法,这是在DispatcherServlet和DispatcherFilter里面都会调用到的一个方法 void init(FixableConfig config)throws ServletException{ this.servletContext=config.getServletContext(); try { initProxy(config); log.info("init con

new做了些什么?

new做了些什么? function People(name, age){ this.name = name; this.age = age; }; var xiaoming = new People(); 要创建 People 的新实例,必须使用 new 操作符.以这种方式调用构造函数实际上会经历以下 4 个步骤: 创建一个新对象: 将this 就指向了这个新对象:(同时还继承了该函数的原型) -- 将新对象 __ proto __ 指向 构造函数 prototype: 执行构造函数中的代码(

282 继承模式:原型链继承 : 得到方法,借用构造函数 : 得到属性,组合,new一个对象背后做了些什么

1.原型链继承 : 得到方法 function Parent(){} Parent.prototype.test = function(){}; function Child(){} Child.prototype = new Parent(); // 子类型的原型指向父类型实例 Child.prototype.constructor = Child var child = new Child(); //有test() <!DOCTYPE html> <html lang="e

转:黑客讲故事:攻下隔壁女生路由器后,我都做了些什么

路由器被蹭网后,我有被黑的风险吗?  Evi1m0,来自知道创宇,邪红色信息安全组织创始人 其实这个问题可以理解为:蹭网之后,能做些什么? 不少人的八卦心窥探欲还是很强烈的,强烈到让人恐惧.所以很多人喜欢看一些八卦文章,比如:如何优雅的窥探别人? 通常这样的文章很容易火起来,因为不少人都喜欢看而且百看不厌. 最近路由安全沸沸扬扬,可以翻阅我微信公众号历史文章查看关于路由安全的文章以及央视当时的采访.鉴于天时地利人和,最后我成功的在现实生活中上演了这样一场精彩好戏,为了满足众人的欲望,我就写成故事

disaster&mdash;&mdash;我都做了些什么啊!

当我意识到自己犯了错误的时候,为时已晚了. 首先,当业务需求和流程还没有明确的时候,不应该将技术的摊子迅速铺开.而且, 由于新项目的摊子迅速铺开,原有项目被迫严重延迟.这里面有业务的误导,但更多的是自己的误判. 其次,架构要为业务服务,而不能盲目听从技术的"欲望".接第一点来说,以目前已知的业务需求,技术方面的摊子完全没有必要铺这么大.这完全是自己出于对架构的追求而造成的问题. 而且这个问题由来已久了.以前同事就点过我有过度设计的毛病.现在变本加厉了. 第三,没有成本意识.同样接第一点