阿呆实战NVMe之七

 

 

提要

 

本系列文章,旨在带你开发一个NVMe SSD控制器的前端协议逻辑,只不过是在QEMU虚拟机环境中。前面我们介绍了QEMU中PCI设备的初始化代码,还有NVMe设备的主要描述类NVMEState的每个变量。本文来看看NVMe设备的初始化,不过从本文开始,阿呆将少贴一些代码,关于编程技巧方面的就不多写了,毕竟无关宏旨,我们重点还是关注NVMe协议的实现。

 

话说最近几十年来,很多聪明的科学家分析了许许多多的宇宙观测数据,最后得出一个惊人的结论:我们的宇宙是由一个致密炽热的奇点于137亿年前一次大爆炸后膨胀形成的。爆炸之初,物[……]

阅读全文

阿呆实战NVMe之六

 

上文中我们提到NVMe设备其实是个PCI设备,里面用了bar0和MMIO,但是不了解PCI的人肯定对这两个概念有所疑惑。阿呆本想写一些,不过发现网上有篇文章讲的很透彻,所以就不班门弄斧了,友情转载过来。

 

PCI设备(PCI device)都有一个配置空间,大小为256字节,实际上是一组连续的寄存器,位于设备上。其中头部64字节是PCI标准规定的,格式如下:

 
 


 
 

剩余的部分是PCI设备自定义的。

PCI配置空间头部有6个BAR(Base Address Registers),BAR记录了设备所需要的地址空间的类型(memory space或者I/O space),基址以及其[……]

阅读全文

阿呆实战NVMe虚拟机之四

蝶恋花 【宋】欧阳修

 

庭院深深深几许?杨柳堆烟,帘幕无重数。玉勒雕鞍游冶处,楼高不见章台路。

雨横风狂三月暮,门掩黄昏,无计留春住。泪眼问花花不语,乱红飞过秋千去。

 

看完前面一篇,我相信你的心情就跟欧阳修这首《蝶恋花》中说的一样,感到:”庭院深深深几许?杨柳堆烟,帘幕无重数。”杨柳依依,一重又一重堵在前面,像一层层帘幕一样,我们翻了这么多层代码,根本看不到NVMe初始化在哪里( ▼-▼ )

 

 

再探DeviceInfo

 

读者君,还记得NVMe设备的注册函数吗?我们再来过一遍,

 

首先有一个s[……]

阅读全文

阿呆实战NVMe之三

 

有人说阿呆你搞个虚拟的东西来玩NVMe,看起来是很爽,代码随便写,然并卵有个什么鸟用呢?其实在实际产品研发中还是有点用的,QEMU最大的好处是可以用GDB Debug。一般实体机如果发生了Panic,只能通过Linux Kernel Panic Dump的方式查看堆栈,找原因,有些藏得比较深的问题比较难发现。而QEMU虚拟机在出错的时候会停下来,就能直接查看出错时各个变量的现场值,找到Root Cause。你如果开发了Linux NVMe驱动,可以用QEMU Debug,也能做一些简单的测试。

 

我们上回说到,蛋蛋定义了QEMU的一套顶层架构,这样后来的人加新的硬件进来,就可以直接套[……]

阅读全文