Eject U盘底层解析
1、插上U 盘
OS 会发inquiry 获取U 盘的基本信息,其中包括RMB, U盘告诉OS 是否可移除。
这里U 盘会将RMB 置1。
之后,OS 会发送SCSI PREVENT ALLOW MEDIUM REMOVAL
将设置成 Volume removal shall be prevented。
目的是告诉U盘, 我不同意remove 你就不可以remove。这里有人可能要奇怪了,U盘怎么会自己去remove 呢? 其实,正常情况下会有两个对象对U盘进行操作,一个是OS另一个是driver,这里PREVENT ALLOW MEDIUM REMOVAL
SCSI 是由OS 发下来的, 而不是由U盘的driver 发下来的,这个SCSI是OS为了防止driver 自行remove U盘而设计的。
格式如下:
需要关注的是PREVENT
的值, 它决定是否允许 remove U盘。
2、 Eject U盘
这个过程实际上分为两步:
1) OS发送SCSI PREVENT ALLOW MEDIUM REMOVAL
将设置成 Volume removal shall be allowed。
2) U盘driver 发送SCSI START STOP UNIT
来移除U盘。
START STOP UNIT command 的格式如下:
IMMED: 表示是否立即返回device 的状态。
0 :表示在设备mount / demount 完成之前不返回device 状态。
1 :表示立即返回 device 的状态。
POWER CONDITION: 配置device 进入不同的power 状态。
具体如下:
NO_FLUSH: 表示是否将cache的内容填写到medium 中。
0: 表示会将C ache 的内容写入medium 中。
1: 表示不会将Cache的内容写入medium 中,快速进入规定的power condition。
LOEJ:表示LOAD OR EJECT。这个bit 和START bit 是组合使用的。
1) LOEJ = 0 :
忽略LOAD /EJECT 操作。
2)LOEJ = 1, START = 0 :
表示 DEVICE 去要去做 UNLOAD medium 的操作。
对于U 盘来说,就是将自己的POWER 断电,将自己的状态清除。
3)LOEJ = 1, START = 1 :
表示 DEVICE 去要去做 LOAD medium 的操作。
对于U 盘来说,就是将自己的POWER 开电, 重新初始化。
需要注意的是:如果POWER Condition 是被设置了, 则LOEJ 会被忽略。
START 此时是作为POWER Condition 切换使用。
0 :表示不切换
1: 表示切换