现在进入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做了些什么的更多相关文章

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

    这一篇我会介绍一些dreamvc的核心类Dispatcher都做了些什么,首先我们先来看一看init方法,这是在DispatcherServlet和DispatcherFilter里面都会调用到的一个 ...

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

    转自:http://biancheng.dnbcw.info/oracle/309191.html Rollback后undo到底做了些什么? 从概念上讲,undo正好与redo相对.当你对数据执行修 ...

  3. 从架构演进的角度聊聊Spring Cloud都做了些什么?

    Spring Cloud作为一套微服务治理的框架,几乎考虑到了微服务治理的方方面面,之前也写过一些关于Spring Cloud文章,主要偏重各组件的使用,本次分享主要解答这两个问题:Spring Cl ...

  4. 从架构演进的角度聊聊Spring Cloud都做了些什么

    1.从架构演进的角度聊聊Spring Cloud都做了些什么?2.中小型互联网公司微服务实践-经验和教训3.Spring Cloud在国内中小型公司能用起来吗?

  5. iOS 中push和pop到底系统做了些什么事

    iOS中的push和pop是一个很常用的视图切换方法,他们是成对出现的, 简而言之,push就是压栈,pop就是出栈! [self.navigationController pushViewContr ...

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

    [dotnet跨平台]"dotnet restore"和"dotnet run"都做了些什么? 前言: 关于dotnet跨平台的相关内容.能够參考:跨平台.NE ...

  7. [转帖]支撑双11每秒17.5万单事务 阿里巴巴对JVM都做了些什么?

    支撑双11每秒17.5万单事务 阿里巴巴对JVM都做了些什么? https://mp.weixin.qq.com/s?__biz=MzA3OTg5NjcyMg==&mid=2661671930 ...

  8. new做了些什么?

    new做了些什么? function People(name, age){ this.name = name; this.age = age; }; var xiaoming = new People ...

  9. new一个对象的时候,实际做了些什么

    当我们说new一个对象的时候,实际做了些什么, 可以参考下图理解

随机推荐

  1. 用MS自带的VS构建joint语句

    在其中一个表上,右键,选择"New Query",弹出"Add Table"对话框,将待joint的两个表Add,并选择相应字段,则会自动构建joint语句,其 ...

  2. 安装VMware vCenter过程设置数据库方法

    VMware vCenter自带免费版的SQL Server 2005 Express,但此免费版数据库适合于小于5台ESX主机的小型部署.如果规模较大可以单独安装数据库系统进行配置,这里选择我独立安 ...

  3. 武汉科技大学ACM :1005: 一二三

    Problem Description 你弟弟刚刚学会写英语的一(one).二(two)和三(three).他在纸上写了好些一二三,可惜有些字母写错了.已知每个单词最多有一个字母写错了(单词长度肯定不 ...

  4. 高放的c++学习笔记之重载运算与类型转换

    ▲基本概念 (1)重载运算符是具有特殊名字的函数,它们的名字又operator和其后要定义的运算符号共同构成.. (2)对于一个运算符号来说它或者是类的成员,或者至少含有一个类类型的参数. (3)我们 ...

  5. 2013中国大数据技术大会——BDTC2013

    阿里飞天平台总架构师唐洪分享了飞天开放平台. 飞天平台特点:同时支持在线和离线应用:安全控制:分布式部署,监控和诊断:无单点故障,可用性99.9%:数据3副本,数据可靠性“10个9”. 阿里飞天平台总 ...

  6. 怎么用visual studio2010编写c++程序

    如何通过visual studio 2010编写一个简单的c++程序,随小编不一起看看如何编写. 首先打开visual studio 2010 点击软件左上角“文件-新建-项目”,选择“win32-w ...

  7. 存储过程中update,然后用sql%判断update是否成功的存储过程

    --更新用户状态 PROCEDURE P_UPDATE_USER_STATUS ( v_SrcID IN NUMERIC, v_DstID IN NUMERIC, v_DstType IN NUMER ...

  8. TableView_图片异步加载 KVO

    TableView 异步下载图片 ImageDownloader.h #pragma mark - 声明block //1,声明block typedef void(^Result) (UIImage ...

  9. 3个QT新闻网,2个发烧友网站

    http://planet.qt.io/ http://blog.basyskom.com/2015/introducing-qtopcua/ http://www.qtworldsummit.com ...

  10. HttpClient 发送 HTTP、HTTPS 请求的简单封装

    import org.apache.commons.io.IOUtils; import org.apache.http.HttpEntity; import org.apache.http.Http ...