磁盘接口技术
- 用于ATA指令系统的IDE接口
- 用于ATA指令系统的SATA接口
- 用于SCSI指令系统的并行SCSI接口
- 用于SCSI指令系统的串行SCSI接口
- 用于SCSI指令系统的IBM专用串行SCSI接口
- 用于SCSI指令系统并承载FabreChannel协议的串行FC接口
scsi和ata是目前现行的两大主机和外设通信的协议规范,它们有各自的物理接口定义。对于ata协议对应就是ide接口,scsi协议对应的是scsi接口。scsi接口可以有8个到16个scsi设备接入到一个scsi通道上,一般接入的机器必须拥有scsi控制卡。scsi控制卡上一个相当于cpu的芯片,它对scsi设备进行控制,能处理大部分的工作,减少cpu的负担。
scsi协议
对于一个完整的数据传输协议,必然是能够跨越osi7层协议。
- 链路层,scsi协议中利用crc校验码来检验每个指令和数据帧的完整性。
- 网络层,一条scsi总线上最多允许接入16个设备,其中scsi控制器占用一个节点,scsi id恒为7,在这16个id中,7具有最高的优先级,当7需要发起传输,其他id需要让出总线的使用权。有总线的地方就会涉及到总线仲裁。一般普通主板不会有scsi控制器,要想接入scsi磁盘,需要加入scsi卡,scsi卡一边接入主机pci总线,另一端用一个scsi控制器接入scsi总线,卡上有主机的cpu,通过执行rom中的代码控制整个scsi卡的工作,scsi卡将scsi总线上的所有设备经过pci总线传递给内存中的scsi卡的驱动程序,这样cpu就会知道scsi总线上的所有设备。当scsi卡不止一个scsi控制器,则是一个多通道的scsi卡。
scsi寻址机制和几个阶段
(1) 空闲阶段
总线一开始处于一种空闲状态,没有节点发起通信,总线空闲时,bsy和sel这两条控制信号线的状态都是false。
(2) 仲裁阶段
节点通过8条或者16条数据总线上提升主机对应的那条线的电位申请总线的使用权,提升主机id对应线路电位同时提升bsy电位,但多个节点发起仲裁,其根据总线上的信号情况,如果非高优先级则撤销自身信号,如果某节点仲裁获胜,则获取总线的使用权,然后将sel信号线提升电位。scsi总线的寻址方式按控制器-通道-scsi id-lun id来寻址。
(3) 选择阶段
仲裁阶段完成后,获胜节点会将bsy和sel信号线置位,然后将8到16条数据总线上对应主机id的线路和目标id线路电位提升,这样目的节点可以感知到自己线路有信号,做好接受准备。
(一般从总线上一个硬盘复制数据到另外一个硬盘的过程是cpu将数据发送给控制器,控制器再复制到内存,经过cpu运算后再次发送给控制器,控制器再写入另外一块硬盘。因为对于硬盘而已,本身没有文件这个概念,所以必须返回到操作系统层面才可以感知)
scsi传输层
scsi传输层是提供端到端的保障机制,这个是保障通信双方。
发送方获取总线仲裁后,会发送一个scsi command写的命令帧,其中包含了lun以及lba地址段,接收端接受后,就知道对方准备发送数据,接收方准备好后,向发起方发送一个xfer_rdy帧,表示准备好,随机可以发送。
发送方收到xfer_RDY帧后,立即发送数据,每发送一帧,接收方就回应一个xfer_rdy,最后接收方发送一个resonse帧表示这条scsi命令执行完毕。
磁盘控制器
磁盘的接口包括物理接口,就是磁盘要接入磁盘控制器所需要的接口,除了物理接口规范外,还定义一套指令系统,指令集定义怎么向磁盘发送数据和读取数据以及控制其他行为,比如SCSI和ATA指令。指令的内容是由运行在操作系统内核的驱动程序生产,而物理的连接则是磁盘控制器负责的,磁盘控制器负责底层总线初始化,仲裁等过程以及指令传输过程,指令传输状态机,重传,ack确认等,将这些太过底层的机制过滤后,向驱动程序提供一个简洁的接口。
磁盘驱动器
磁盘控制器和磁盘驱动器是两个不同的东西,对于cpu而言,其操作控制器就可以,cpu通过运行磁盘控制器的驱动程序,生产指令发送给磁盘控制器,磁盘控制器收到这些cdb后,会做一定程度的翻译映射工作,生成最底层磁盘可接受的纯scsi指令,然后通过底层的物理操作,总线仲裁,编码,再在线缆上将指令传递给对应的磁盘。
磁盘控制器的驱动程序
机器刚通电,还没有载入操作系统,那么操作系统是如何载入呢,所以在系统bios中存放初始化系统所需要的基本代码,bios初始化中有一步就是去执行磁盘控制器的ooptional rom,该rom包含了该控制器最原始,可在主bios下执行的驱动程序,主bios去载入并执行rom,从而加载了驱动程序,并可以与控制器交互。最后bios通过驱动程序使得cpu可以发送对应的读指令,提取磁盘0磁道第一个扇区的代码并载入到内存中,从而加载os。