自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(15)
  • 收藏
  • 关注

原创 NVMe协议解读

说到NVMe协议解读,蛋蛋读NVMe系列那绝对是经典中的经典,个人在学习NVMe过程中也看了好几遍,如果有想学习NVMe协议的同学强烈建议去看看。而写这篇文章的目的仅仅只是为自己记录而已。首先看一下NVMe的定义,官方网站为https://nvmexpress.org/官方对NVMe的解释是:NVM Express®(NVMe®is a specification defining how host software communicates with non-volatile memory a...

2021-05-18 09:13:43 9295

原创 性能优化之读写锁

数据在缓存中,为了保证数据的一致性,最普遍的就是对数据加锁,而本次采用的是读写锁。读写锁也是非常常用的一种锁,目的就是可以同时支持多人读取,而只支持一个人写,这也可以看到写锁的优先级比读锁高,因此加解锁的规则很简单,首先是加读锁,如果数据没有被加写锁,则读锁加成功,否则加失败;然后是加写锁,如果数据已经被加锁,不管是读锁还是写锁,都需要等锁释放才能去加。因为写优先级高,因此可以一直存在加不到读锁的情况,但如果因为调度等关系,导致写锁加不到,从而导致加写锁饿死,这是一个很严重的问题,因此可以增

2021-02-07 18:46:46 555

原创 性能优化之跳跃的链表

最近刚做了一个利用缓存优化性能的需求,在实现过程中使用了跳表这个数据结构,好吧,其实最开始想着要不趁此机会实际操刀一下听起来就高大上的红黑树,但因为各种原因,本次没做成,只能期待下次机会了。先初步科普一下跳表数据结构跳表(跳跃表 SkipList)本质是一个有序的链表,链表和数组相比,查找会慢很多,因为只能遍历,无法和数组一样通过数组下标直接跳到后面的节点,跳表就是为了让链表查找跳跃而诞生的。...

2021-02-07 18:46:28 484

原创 NVMe-MI协议解读

NVMe-MI协议解读众所周知,在一个存储系统中,将设备管理与业务分离是一个良好的设计,比如在Nvme协议中就有一个Admin命令集,与IO命令分开。为了能够更规范合理得对NVMe SSD进行管理,NVMe-MI协议应运而生。Nvme-MI(Management Interface),定义了一套完整的NVMe SSD管理方式,独立于NVMe协议且为NVMe服务。目前支持NVMe-MI协议的SSD比较少,支持产品见https://www.iol.unh.edu/registry/nvme-mi。在20

2020-11-26 20:12:46 6955 1

原创 PCIe总结--结语

PCIe相关的写到这也告一段落了,更多细节的东西不是不可以写,只是很多都是书上的内容,翻译一遍没意义,而且很多东西不是理论上说说就知道的,还是要实际经历过才印象深刻,了解PCIe最重要的还是看PCIe协议,里面很多话要一字一字解读,不然可能就因为漏过一个词让你怎么都想不明白到底怎么回事。有条件的话抓一下PCIe Trace看看,受益匪浅,对PCIe的理解会更上一层楼的。...

2020-04-05 17:01:39 303

原创 PCIe总结--设备资源

上篇文章说到枚举过程中的资源分配,这篇文章具体说下。 首先要知道需要分配哪些资源,主要就2个:总线(bus)资源和内存(memory)资源。总线资源: Bus资源就是给设备分配唯一的ID,其中bus号为8个bit,所以bus范围为0-255,device是5个bit,所以范围是0-31,function是3个bit,所以范围是0-7,每个设备...

2020-04-05 17:01:12 1917

原创 PCIe总结--内核设备扫描

前面讲完后,知道一个PCIe设备大概是怎么回事了,这篇文章讲下在OS下是如何扫描接入并使用这个PCIe设备的。以Linux系统为例。 在主机上电的时候,看系统开机日志,我们可以看到很多pci的打印,这些打印其实就是内核在枚举系统PCIe设备,枚举采用的是深度优先算法,即从根端口开始,把这个根端口下的所有PCIe设备枚举完成后再枚举下一个根端口。枚举过程中前提是设备...

2020-04-05 17:00:24 1935

原创 PCIe总结--配置空间

如果系统里有一个PCIe设备了,我们想对这个PCIe设备的PCIe层进行控制,最常见的方式就是配置这个设备PCIe配置空间的寄存器了。 每个PCIe设备有4K大小的配置空间,前256字节是兼容PCI,所有PCIe设备一致,协议定义了的寄存器内容,后面的就是各个厂商自定义空间。 在linux下对配置空间进行寄存器读写的命令是setpci,具体用法可...

2020-04-05 16:59:32 1473

原创 PCIe总结--PCIe设备

对PCIe协议有个初步了解后,我们现在再来看一下系统上的PCIe总线,在linux下用lspci –t这个命令可以看到一些树结构,上面有一些数字,数字通过一些-连起来,还有[],这个就是这个计算机的PCIe总线topo图。 在一个三世同堂的家里面,每个成员的身份都是唯一的,同样在PCIe总线上,每个PCIe设备也应该有个唯一标识,这个唯一标识就是一个编号,或者说I...

2020-04-05 16:58:22 3893 1

原创 PCIe总结--3层协议层补充

本来这章应该对3层协议详细介绍,但那种烂大街的介绍多如牛毛,也就不详细说了,想了解的可以去看协议,看书,或者搜网上那个扫盲贴,写的也比较详细,因此本章就零零散散写一些自己认为有必要的。数据链路层: 上章说了,数据链路层是为了保证两个设备TLP数据的可靠性,而且数据封包是从上往下的,所有传输层封装完成后,到数据链路层又封装了一个数据链路层的header,而且还计...

2020-04-05 16:57:08 1052

原创 PCIe总结--概览

我是谁这个问题一直是困扰所有人的问题,要是想明白了,那你就了不起了,同理要是能把PCIe是什么弄的很清楚了,那你就很懂PCIe了。所以这个系列就是把我知道的PCIe娓娓道来,所有的官方定义自己查阅文档。 PCIe的祖宗18代就不介绍了,在一台计算机上,依靠PCIe总线把所有PCIe设备连接起来,互相通信,合作构建一个完整的系统,为实现计算机的价值做出重大的贡献。为...

2020-04-05 16:56:00 703

原创 PCIe总结--反省

自从开篇到现在快2年了,一直没写的借口很多,工作太忙,后面工作又和PCIe扯上关系了,网上有个PCIe扫盲帖写的很全,也不错。现在为什么又突然想提笔了呢,一是为了分享,更重要的是为了自己,记录一下自己技术上的征程。技术文章发到公司公众号不但也算是分享,还可以有几百的稿费,但还是想发到自己的个人博客,因为这纯粹是我个人的财富,所以不会写的很详细,一些需要找资料截图的也不会去找,更别说...

2020-04-05 16:54:41 473

原创 PCIe总结--开篇

有段时间没做PCIe相关的东西了,估计以后也不会再做了,趁着还有点印象,把自己学到的,对PCIe的理解做一个系统的总结。目前没有很明确的规划怎么写,跟着自己的思路来写,想到什么就写什么,都是自己的理解,如果有理解错误的,以PCIe协议为准。 PCIe最主要的参考资料当然是PCIe协议了,可以自己去网上下载,当前应该是PCIe4.0了,接下来的文章以PCIe3.0为准,...

2020-04-05 16:53:41 1280

原创 对于环境变量的理解

        我们经常能听到环境变量这个名词,那环境变量到底是什么呢?以下是我的个人理解。        记得第一次接触到环境变量这个名词应该是在大学学java,安装jdk的时候吧。环境变量就是一连串路径,在这些路径下的存放了一些可执行程序,可以理解为这些路径下的可执行程序就是系统应用了,可以直接执行,不用到绝对路径下去执行。譬如我们可以直接执行ls,而不用./usr/bin/ls这样执行。...

2018-06-03 10:18:07 634

原创 LD_PRELOAD理解

        这几天看到一个很有趣的变量LD_PRELOAD。这个词首先从字面意思来理解,LD和动态库有关,PRELOAD表示预加载,结合起来就是预先加载的动态库。那这个到底是什么,用来干什么的呢?        LD_PRELOAD是一个环境变量,用来加载动态库时寻找所需符号的路径,而且是优先级最高的寻找路径。换句话说,如我们代码需要加载动态库里面函数,众所周知,系统一般会去LD_LIBRAR...

2018-06-03 10:08:33 2604

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除