Day 6 USB 可插拔

1 什么是可插拔?

热插拔(hot-plugging或Hot Swap)即带电插拔,热插拔功能就是允许用户在不关闭系统,不切断电源的情况下取出和更换损坏的硬盘、电源或板卡等部件,从而提高了系统对灾难的及时恢复能力、扩展性和灵活性等,例如一些面向高端应用的磁盘镜像系统都可以提供磁盘的热插拔功能。具体用学术的说法就是:热替换(Hot replacement)、热添加(hot expansion)和热升级(hot upgrade)

以上来百度百科

2 可插拔的好处?

对用户来说,可插拔的最大好处就是,安装外设再也不用重启电脑了,,,,
对系统来说,实现了动态扩充,动态增加功能的好处

3 可插拔架构实现的关键

  1. 设备检测机制
  2. 状态可控
  3. 设备自我解释

不好理解是不,举个栗子
北影旁边有个看门大爷,负责管理后台演出人员,每天8点,大爷都会点一点人数,把姓名,特长,座位记到一个小本子上,然后给一个小板凳,让他们坐着,等导演召唤

导演需要人时,大爷就翻一翻本子,说:A,53号那个,过来,导演叫你呢

大爷年老眼花,所以日子一长,就出问题了
有一天,大爷没注意到一个人走了,然后导演找不到人演戏,就罢工不干了
有一天,后台溜进来一个新人,大爷看到他,他也没凳子坐,就一直捣乱;直到第二天大爷重新点人数时,才发现他,给了一个凳子,安抚好
有一天,后台两人打架,一把火把后台烧了。。。

(这就是原来的电脑不可插拔机制,硬件损坏蓝屏,必须重启安装驱动,硬件冲突蓝屏)

怎么解决呢?

导演找了两个年轻人,一个保安来辅助大爷,一个看前门,一个看后门;一个年轻人看管前门,另外一个看管后门,保安负责看场子
大爷再也不用在早8点一个一个点名了,只需要坐在座位上记录就好了
每当有人从前门进来时,年轻人都会问一遍基本信息,然后安排一个座位,然后大声喊:大爷,新来了一个人,叫XXX,演爱情剧的,我安排到2号座位了啊
大爷就记下了
每当有人要从后门离场时,另外一个人,就会把座位收了,然后大声喊:大爷,那个XXX的,有事走了,我把2号座位收了啊
大爷然后找到本子的那一页,画一个叉号
半小时后,保安说,8号的那个SB,闹事了,本来谈好的300工资,非要800,我把他赶出去了
大爷说,好,然后找到8号的那页,又画了一个叉号

管理有序,来了再多人也不会乱

关键点在于

  1. 改进了流程,从每天检查一次,改为随时检查更新记录,进一个检查一个
    从而杜绝了,有记录找不到人的情况(DM/DP设备检测机制)
  2. 增加了两个看门人,保证了能及时监测到人员进出,根据人数及时调整记录(动态更新机制)
  3. 增加了保安,降低了闹事,砸场子的可能(限制设备最大电流,最大带宽)

从技术层面来说

一个设备的关键信息有

  1. 设备文字性信息(演员叫什么,家在哪里,毕业哪个学校)
  2. 设备功能和资源要求(演员能演什么)
  3. 设备系统地址(座位号)
  4. 设备数据协议和行为规范(导演与演员的语言交流)

操作系统在开机自检后,将硬件信息保存到注册表中,然后提供一个设备查询接口供驱动软件来使用。也就是说系统在开机后,就已经记录了当前系统中所有设备的文字性描述信息,功能和基本资源需求,设备地址!并且这个更新记录过程只发生在开机阶段,所以要添加设备,就只有重启系统了

如果我们把这个查找过程推迟一步呢?
那就变成了:只有当设备插入,拔出时,系统才会更新这个设备记录表,匹配对应的设备驱动

这样就把记录更新触发条件从<上电启动>变成了<设备插拔>,从而实现了热插拔效果

所以,从本质上来说,热插拔就是延迟管理,事件触发的技术

这种延迟绑定技术,在计算机技术中大量存在,比较典型的例子是动态链接技术,将函数,变量地址绑定过程,从编译阶段延迟到了运行阶段,进行达到了解耦,动态升级,共用基础设备的效果

稍微讲一下动态链接的过程吧
在程序运行之前,系统先调用Dynamic Link Loader,递归下降找到程序中用到的所有dll库,然后加载到内存中,如果内存中已经有了dll,则忽略;完成这一步后,loader把dll的内存地址记录下来,然后释放控制权,接着构建程序运行环境,比如初始化堆栈,内存,分配变量空间啥的,然后开始运行程序;当程序遇到未绑定的变量或者函数地址时,会跳转到PLT,然后PLT跳转到GOT,GOT里面默认就是Loader的入口地址,所以Loader再次接管控制权,到dll中的符号表中,找对应的符号,找到后,则用这个新地址更新PLT和GOT,接下来就是被调用的函数接管控制权;
当第二次调用时,因为GOT,PLT表里面已经包含了有效地址,所以就无需loader介入,直接查表,跳转就好了

再次回到热插拔的话题

总结起来,就是

  1. 改变了触发设备更新的条件,每次插拔都会更新,相当于两次完整的重启过程(一次注册更新,一次注销更新)
  2. 延时了设备数据获取的阶段,每次检测到设备插入时,都必须重新获取所有设备信息,从而保证设备状态的可控性

当然,在硬件层面,也要做很多额外的工作,比如增加电源缓冲,提高数据传输速率,增加ESD保护

4 USB协议中,插入USB设备后,PC为什么会要求USB设备重启?

熟悉USB协议的朋友,都会知道PC在检测到设备插入时,都会要求USB设备重启,为什么这样要求呢?

热插拔带来的另外一个问题:怎么维护设备的操作状态,并保证设备始终处于可控状态

可控是指设备具有确定性,在特定环境下,对特定的输入,设备要做出完全一致的,可重复的特定输出

原来的设备状态信息,由操作系统内部来维护,比如上电后,会请求外设复位,然后进行初始化,从而进入确定的状态,等待系统命令。

但对于可插拔设备呢,在插入后,设备默认地址为0,同时系统会要求设备进行复位,从而让设备清除旧状态信息,进入确定的可控状态。

so bad,还是没引入状态机的理论

每日推荐

  1. [QP量子架构]http://www.state-machine.com/index.html
    状态机编程的经典书籍

2015-12-12

-----分割线-----
注意事项

  1. 本订阅号(微信搜 McuProgramming )主要发布一些嵌入式相关的知识和技巧,涉及到软件,硬件,射频,协议栈等;如果您有感兴趣的领域,请通过回复订阅号告诉我

  2. 本订阅号主要是简单文字为主,内含少量代码段,但绝不会发布大量的代码。
    因为根据自己的体会,在手机微信端看代码的体验非常糟糕,一方面屏幕比较小,显示效果不好;另一方面,玩手机时,精力不会集中,更不会有大量时间。
    cedar-renjun.github.io 个人博客会发一些技术细节的东西,感兴趣的,可以深入研究这里的博文

  3. 微信的编辑功能比较弱,不能贴链接,代码啥的,,,所有文章均发表在个人博客,可以通过点击原文来查看,原文有代码语法高亮,显示图片,带链接等效果