四、virtio_blk输入输出包格式介绍
上面对于模块间的数据流程有个基本的介绍,现在列出virtio_blk控制器向远端发送和接收的存储包的格式。由于存储IO操作有个特点,就是每一个读或者写的请求,必定有一个对应的返回通知,用来表示此请求是否操作成功,并且也携带所读回来的数据信息等。请求命令数据等组成的包为存储请求包,返回通知组成的包为存储完成包。
如图4所示,为virtio_blk控制器输出的存储请求包的格式。如图5所示为virtio_blk控制器接收到的远端返回的存储完成包的格式。此格式地址是从右上角为起点,从右到左递增,一直到左下角为止,每一行为512bit对齐,主要是为了在FPGA内部处理方便,因此对于需要补齐512bit的位宽的那一行,则用rsv和padding填充。这里对包格式中的有关信息做一个简单的说明。
(1)virtio_net_head:预留的96bit空间,此部分为存储包经过virtio_net_blk模块传输时(图1所示),由virtio_net_blk来填充的,其主要为了virtio_net_blk和SOC之间的交互。
(2)PF+VF+qid:32bit位宽,此部分是指明该存储包是属于host侧的哪个PF或者VF中的哪个queue的。相当于是此存储包的身份标签。
(3)Rsv:保留位,无实际作用。
(4)Information:存储包携带的一些指示信息,比如包含指明此包携带了多少个只写host的描述符,此包对应的index值和包长信息等。
(5)desc_0~desc_n:只写host的描述符,具体个数由information里面的信息指定。
(6)Padding:填充无效bit,主要是为了补齐512bit的数据位宽。
(7)Type:指明此存储包是读磁盘操作还是写磁盘操作等。
(8)Sector:指明读写磁盘的扇区的起始位置。
(9)write_data:写磁盘的数据,大小为512字节的整数倍。放置于存储包的末尾。
(10)read_data:读到磁盘的数据,大小为512字节的整数倍。
(11)Status:状态指示信号,指明此次操作是否成功。
图 4 virtio_blk控制器输出的存储请求包格式
图 5 virtio_blk控制器接收远端返回的的存储完成包格式