Device 是如何注册进总线的?------100分问题!!!

eggqq007 2011-10-20 07:13:29
有两个问题


一个driver加入总线的时候会和总线上所有device做匹配,如果匹配成功就执行probe

那那个所谓的device先前是怎么加入总线的?(比如说网卡)


第二个问题是这样的

"device_register" 和 "register_netdev" 都是注册设备的,它们区别是什么????

如果注册网卡的话,为什么一定要用register_netdev?
...全文
167 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
夕阳孤影 2011-10-27
  • 打赏
  • 举报
回复
最近在看PCI总线,刚好明白了楼主的问题。我就拿PCI总线来说,linux系统初始化的时候,会执行一些函数,包括总线的驱动。刚开始内核不知道系统中有总线,执行到总线驱动的初始化函数时,这个函数就去扫描总线,发现一条总线就会创建一条总线,然后扫描这条总线下的设备,发现设备后把这个设备添加到总线上。

所以总线上的设备是在总线初始化的时候由总线scan并添加的,等驱动加载的时候,驱动去匹配总线上的设备并进行绑定。
eggqq007 2011-10-27
  • 打赏
  • 举报
回复
太谢谢各位了~~~~
changing_better 2011-10-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 eggqq007 的回复:]

引用 3 楼 jay8830095 的回复:

第一个问题:对于这种“固定”的设备注册,内核会罗列(当然可以自己添加)所有自己保含的设备,在内核初始化时会注册好,因为你有哪些设备自己是清楚的,不清楚的就是这些设备的驱动是什么。所以在后面总线扫描时会找到这个设备的驱动。
第二个问题:使用这个函数的原因是register_netdev,不仅完成device_register设备的注册,还有完成……
[/Quote]
”固定的设备“指的是系统会有一部分网络的资源,这部分可以事先定义好的,例如名称之类的。这样就可以找到相关的驱动程序,如果你想知道网卡本身的信息多点,那么可以通过驱动程序中读取一些信息!
所以设备的信息源有三个地方:
1:是操作系统定义的
2:系统管理员定义
3:通过驱动程序读取设备的信息。
这三部分共同组成了设备的信息!
woshi_ziyu 2011-10-24
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lq651659889 的回复:]

好像是设备的相关资源都定义在board_info中,然后bus从这个结构中读取设备,在一个个注册。
[/Quote]
+++
lq651659889 2011-10-24
  • 打赏
  • 举报
回复
好像是设备的相关资源都定义在board_info中,然后bus从这个结构中读取设备,在一个个注册。
changing_better 2011-10-21
  • 打赏
  • 举报
回复
第一个问题:对于这种“固定”的设备注册,内核会罗列(当然可以自己添加)所有自己保含的设备,在内核初始化时会注册好,因为你有哪些设备自己是清楚的,不清楚的就是这些设备的驱动是什么。所以在后面总线扫描时会找到这个设备的驱动。
第二个问题:使用这个函数的原因是register_netdev,不仅完成device_register设备的注册,还有完成其他的功能。(这个其他功能就是和网络有关系的),所以内核在处理有“个性”的设备注册时,会再自己生成个注册函数,其中功能包括了大家通用的device_register,还有一部分自己的功能。其实在其他地方,例如SPI设备的注册上也可以看到!
eggqq007 2011-10-21
  • 打赏
  • 举报
回复
......................................看来我已经老了。。。。
xg1410 2011-10-21
  • 打赏
  • 举报
回复
哎,我看了哈的,现在只要不是一两句话就能让别人明白的,一般情况大伙都懒得回复。
codesnail 2011-10-21
  • 打赏
  • 举报
回复
我承认我是来蹭分的。。。
eggqq007 2011-10-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jay8830095 的回复:]

第一个问题:对于这种“固定”的设备注册,内核会罗列(当然可以自己添加)所有自己保含的设备,在内核初始化时会注册好,因为你有哪些设备自己是清楚的,不清楚的就是这些设备的驱动是什么。所以在后面总线扫描时会找到这个设备的驱动。
第二个问题:使用这个函数的原因是register_netdev,不仅完成device_register设备的注册,还有完成其他的功能。(这个其他功能就是和网络有关系的),所以……
[/Quote]
。。。。。谢谢你。。能给我更为详细一点的解答么?
eggqq007 2011-10-21
  • 打赏
  • 举报
回复
谢谢楼上的。。。但我还是有点不太明白

第一个问题,你说内核会罗列这些设备,但是问题是没有驱动的情况下,内核是怎样发现设备的?怎么读取设备的名字,然后使用device_register添加如总线? 就比如一个网卡,在还没有加载驱动的时候是怎样读取这个网卡的基本信息的????


第二个问题。。如果register_netdev包含有device_register的话将会形成一个死循环。

因为register_netdev这个函数是在驱动的probe()函数里面调用的,
如果按你说的执行了register_netdev后将会执行device_register(),最后将会调用总线的match()函数对比匹配设备和驱动,当发现驱动和设备一致后将会再一次调用驱动的probe()

如此则进入了一个死循环,这是我个人的理解。。不知道是否正确~~~~~~~~~~~

21,595

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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