最近这三周时间一直因为工作的需要在研究SPDK移植到RISCV平台上,在编译通过的时候,也顺带把SPDK的代码粗粗过了一遍,顺便做了一点笔记。
SPDK (Storage Performance Development Kit)其实就是在用户空间,采用轮询的方式无锁的NVMe的驱动,提供从用户空间应用程序到SSD的零拷贝。
整体的代码结构框图,大家可以从网上搜搜,有很多的文章讲这部分,笔者这里从代码细节的角度来逐个分析它的一些功能。
- SPDK系统的建立,通过如下函数的调用,SPDK主要做了如下几个步骤:
- 为每个logical-core建立一个对应的reactor的线程,其线程的入口函数为eal_thread_loop()
- 同时将reactor_run()注册到每cpu的变量lcore_config[].f中
- 当前线程分别通过pipe发送消息给其他logic-core上运行thread,此时由于其他logic-core上的线程会等待各自pipe上的消息,当前core上发送的pipe消息一旦被对端的线程所受到,则分别注册reactor run函数就可以分别运行在各自的线程中了
2. 以下函数调用栈是整个SPDK架构的关键所在。
- 在reactor的run函数中是个死循环
- 它分别运行在各自的logic-core的线程上
- 每个线程上的reactor可以互相通过ring-buffer进行通信,收到消息的一方&