- 博客(79)
- 资源 (111)
- 问答 (7)
- 收藏
- 关注
原创 FPGA SATA高速存储设计
今天来讲一篇如何在fpga上实现sata ip,然后利用sata ip实现读写sata 盘的目的,如果需要再速度和容量上增加,那么仅仅需要增加sata ip个数就能够实现增加sata盘,如果仅仅实现data的读写整体来说sata ip设计比较简单,下面从sata 协议角度来聊聊sata ip应该如何实现。下图就是在FPGA上实现3张SATA SSD硬盘组成RAID0的结构图。
2024-06-26 19:47:59 1991 5
原创 FPGA NVME高速存储设计
690T高速存储硬件设计框图如下,switch下面挂载6张ssd,一路x8 到fpga host,1路x8到fpga ep,pcie端采用nvme ip实现ssd盘的读写,40Gbps以太网数据,以及多通道的srio和GTX数据,整个架构中最核心的就是nvme ip,nvme ip扮演了大脑的角色,负责枚举ssd,分配地址,以及nvme协议处理等。关于nvme ip资源消耗情况,目前整个高速存储使用的资源如下,其实代码中有个细节可以优化很多bram接口,因为前期设计考虑冗余了,导致资源消耗过多。
2024-06-22 17:59:15 990
原创 zynq多host高速存储方案设计
前面文章讲解了《zynq高速存储方案》,那种方案是针对单个pcie host设计的方案,当项目需求记录速度很高,并且没有国产化要求时,可以考虑使用Zynq UltraScale+ 系列的ZU11EG芯片,该芯片成本低,且支持4个PCIe硬核,可以将该4个pcie都配置成host模式,在每个host下挂载pcie 3.0 x4的SSD固态硬盘,这样每个pcie host能够跑的速率就是ssd盘能够支持的最大速率,如果选择三星的SSD盘,那么PCIe3.0 x4读写速率能够到3GB/s,那么4个...
2024-04-28 18:42:59 1534
原创 zynq nvme高速存储之ext4文件系统
前面文章分析了高速存储的各种方案,目前主流的三种存储方案是,pcie + switch高速存储方案,zynq高速存储方案,fpga高速存储方案。虽然三种高速存储方案都可以实现高速存储,但是fpga高速存储方案是最烂的,fpga存储方案在速度上没有前两种高,对于Error Handler上处理也不友好,同时fpga高速存储方案不支持标准的EXT4文件,不能够支持NFS文件系统等,所以有读者向我咨询高速存储方案,我会毫不犹豫的推荐前面两种。对于pcie + switch高速存储方案硬件框图如下。
2024-04-20 21:00:21 1286
原创 ftp/nfs卸载自定义文件系统数据
在存储领域对于数据卸载有很多种方式,比如通过高速GTX接口流模式卸载,或者通过网络卸载数据,通过网络卸载数据可以开发上位机定制化卸载数据,但是开发上位机软件比较麻烦,已经需要安装软件,软件容易出现BUG等诸多问题,这篇文章分享通过自定义文件系统管理数据,并且通过windos自带的nfs客户端卸载存储办卡中的数据,windos端通过nfs映射磁盘到共享文件夹,用户看到的储存办卡存储空间就像看电脑本地磁盘一样方便,这种方式安全可靠,不需要专门定制客户端,并且具有通用性,并且客户是最喜欢这种方式卸...
2022-03-05 21:33:03 1689
原创 PCIe+Switch高速存储方案设计
上篇文章分享了《zynq高速存储方案》,zynq存储方案实现了1.2GB/s的存储速率,这篇文章分享pcie+switch常规方案,这种方案在存储领域很常见,目前作者实现switch方案存储速度有5GB/s和6.5GB/s,以及没有国产化要求并且不使用switch方案储存速率5GB/s。具体速度多少根实际的SSD盘数和switch选择都有很大关系,高速存储在设计存储方案时会有很多考虑,比如是否全国产化,速度指标,SSD盘容量,数据是否需要备份,硬件成本,开发难度系数等诸多因素,只有结合实际项...
2022-02-19 17:07:52 10789 16
原创 linux系统raid0测试实验
本篇文章介绍嵌入式平台linux系统中raid0如何使用,并了解raid0磁盘阵列的工作原理,在后面文章中介绍pcie+switch存储方案raid0阵列的实现。在linux系统中raid0配置使用的mdadm命令,在嵌入式平台中,mdadm命令一般默认是没有的,需要手动安装mdadm命令。本次编写块设备驱动用两片内存模拟磁盘做raid0,在块设备中提供读写内存接口,打印内存接口,方便跟踪mdadm命令工作原理。安装mdadm命令下载mdadm.tar.gz tar –xzvf m...
2022-01-13 15:30:06 1463 1
原创 全网最全PCIe枚举算法分析(以ZYNQ平台实例讲解)
本篇文章分析PCIe上电是如何枚举的,BAR空间访问在以前文章已经讲解,可以参考《从cpu角度理解PCIe》和《从cpu角度理解PCIe续集》。本文篇幅较长,读者需要耐心阅读。PCIe上电枚举算法主要是分配总线号和分配BAR空间,分配的总线号用于访问配置空间,BAR空间用于与PCIe设备进行数据交互。PCIe协议包括物理层,链路层和事务层,本次分析从事务层开始着手,事务层数据交互的单元是TLP包,TLP有公共的头部和载荷数据,载荷数据最大为4KB,根据公共头部TLP可以分...
2021-12-31 17:34:43 4117 4
原创 zynq srio枚举id方案设计
常见的SRIO枚举分配ID操作在Powerc平台比较常见,本文使用zynq7045实现SRIO枚举功能,PL端有SRIO IP,只需要将AXI维护端口挂到AXI-GP接口上,PS软件就可以通过AXI总线访问SRIO IP实现枚举自动分配ID功能。本次测试硬件拓扑图如下图所示。srio交换芯片采用的时1848交换芯片,SRIO1和SRIO2本次实验室环回到ZYNQ的SRIOIP上,也可以直接将端口引到外部让用户使用,本次方便实验分析和抓信号,SRIO三个x4的IP都是...
2021-12-30 16:32:43 2088 5
原创 zynq实现二层网络加密转发
二层网络加密转发是加密端将所有二层网络数据实现加密,然后发送出去,接收端接收到数据后解密,然后以二层报文发送出去。常规的网络加密仅仅局限于网络应用数据加密,对底层的ARP(IP地址到MAC地址的解析,可通过ARP广播包寻找MAC地址),ICMP(ping命令),IP(TCP和UDP的下一层)包通通实现加密传输。
2021-11-23 16:50:32 3064
原创 linux内核零拷贝技术
1. 设计思想零拷贝技术主要用于磁盘数据通过网络进行交互,常见用法卸载磁盘文件从网络发送出去。常规的卸载文件方法流程如下所示。从上图可以看出软件流程一共复制了4次数据,内核态到用户态切换4次。读操作(复制两次,上下文切换两次):1.用户进程通过 read() 函数向内核(kernel)发起系统调用,上下文从用户态(user space)切换为内核态(kernel space)2.CPU利用DMA控制器将数据从主存或硬盘拷贝到内核空间(kernel space)的读缓冲区(read buffer)
2021-11-19 17:48:49 3916
原创 zynq/nvme/ext4/fpga高速存储设计
1.概述很久没有写文章了,有空余时间还是分享一点技术干货。今天写一下zynq+nvme高速存储设计思想,zynq处理器是将ARM和FPGA集成在一起的处理器,区别于以前ARM+FPGA的板间架构,采用AXI内部总线实现ARM和FPGA内部的通讯,支持低速AXI-GP接口(类型Local Bus),高速AXI-HP接口,ARM端简称PS,FPGA端简称PL。如果数据过PS端,那么数据会经过HP接口,软件上的数据解析和拷贝,这样存储速率大约为130MB/s,速率比较慢,所以就引入了本文方案,控制走PS,数据P
2021-11-15 11:48:08 12248 11
原创 解读gcc和g++编译器分别对c与c++文件影响
概述为什么需要解读gcc/g++编译器对c/c++文件的影响呢?由于系统内核一般是使用C语言来编写的,系统内核中用C语言实现了很多库。而上层应用程序有可能是用C++来开发,如果在内核库函数头文件中不用extern“C”来声明库函数的话,在编写C++应用程序时,包含库头文件,在C++文件链接时就会以C++标准来链接库的函数名,而在库文件实现时是用C来实现的,二者函数名不同,在链接时就会出现找不到函...
2018-12-19 15:17:09 7782 4
原创 从cpu角度理解PCIe续集
概述上篇文章剩下两个问题,上电扫描PCIe树和存储地址到PCIe地址的映射,本篇文章将对这两个问题做出解答。本文可能会针对某一款芯片做出详细流程解答,读者可以只关注整个流程,具体映射机制和寄存器参考芯片datasheet。上篇文章已经了解到如何访问配置空间,前256Bytes可以通过寄存器方式访问,后面的256B~4k必须通过映射才能访问,映射无非就是把配置空间映射到存储地址空间,或者把PCIe...
2018-11-07 13:06:41 5632 3
原创 从cpu角度理解PCIe
概述为什么需要写这篇文章,当我阅读《深入浅出SSD》这篇书籍中PCIe章节时发现,本书籍的侧重点是放在PCIe控制器和PCIe协议上,从CPU角度理解PCIe知识偏少,本文对下面几个知识点做出一些补充。CPU访问外设寄存器与内存编址方式; CPU如何访问PCIe配置空间; CPU能够通过寄存器访问配置空间,为什么还需要映射PCIe配置空间; 如何扫描PCIe树并且为PCIe分配ID;...
2018-10-24 10:34:53 13310 2
原创 浅谈CPU寻址内存机制
本文讲解的内容是Processor如何访问内存,TLB Cache和MMU的在Processor中扮演的角色。涉及的硬件平台是Xilinx Zynq-7000,dual-core ARM® Cortex-A9 MPCore,架构是armv7,下面分别对TLB、MMU、Processor如何访问cache和主存深入分析。在早期计算机系统中,程序员都是直接访问物理地址进行编程,当程序出现错误时,整...
2018-10-07 10:49:57 6532
原创 Cache地址映射
理解Cache地址映射之前补充一些基础知识,Cache的地址映射和MMU(内存管理单元)和TLB Cache(转译查找缓存)中的映射是有区别的。Cache、TLB Cache、MMU在CPU中结构如图1所示,图1展现的是Cortex A9 Processor内部结构,采用的指令和数据总线分开的哈佛结构。CPU访问内部存储和外部存储,以及各种外设空间在硬件层面上看都是物理地址(硬件总线),然后为...
2018-09-01 15:17:35 22738 1
原创 几行C代码剖析Cache参数
Cache的容量一般都很小,即使是最大的三级 Cache(L3)也只有20MB ~30MB。cache加快了CPU对内存的读写速率,CPU第一次执行需要将数据时候需要从主存-->L3 Cache--->L2 Cache -->L1 Cache传递到CPU的计算单元。cache分成多个组,每个组分成多个行,linesize是cache的基本单位,从主存向cache迁移数据都是按照l...
2018-08-20 16:31:34 2334
原创 深入浅出cache写策略
随着计算机行业的飞速发展,CPU的速度和内存的大小都发生了翻天覆地的变化,在处理器速度不断增加的形势下,处理器处理数据的能力也得到大大提升。数据是存储在内存中的,内存吞吐率虽然得到很大的提升,但是相对于处理器来讲,仍然非常慢。处理器要从内存中直接读取数据都要花大概几百个时钟周期,在这几百个时钟周期内,处理器除了等待什么也不能做。在这种环境下,才提出了Cache的概念。计算机中常见的存储介质如图1所...
2018-08-20 16:25:47 13584
原创 CPU性能发展所遇到的瓶颈
通常一个处理器通常包含多个核心(Core),集成 Cache 子系统,内存子系统通过内部或外部总线与其通信。在经典CPU中一般有两个常用的组件:北桥(North Bridge)和南桥(SouthBridge)。它们是处理器和内存以及其他外设沟通的渠道。图1给出了处理器、内存、南北桥以及其他总线之间的关系。 从图一可以看到:1)处理器访问内存需要通过北桥。2)处理器访问所有的外设...
2018-08-13 14:15:17 9190
原创 华容道穷举算法实现
1、广度优先的树型结构由于整个棋局的可行解可以描述成一个树型结构,并且为了得到最少移动步数需要采用广度优先的搜索算法,因此考虑将链表与树型结构整合起来,便于进行广度搜索。如图,当我们试图搜索第三步可行解时,只需要顺着第二步的链表依次搜索便可以实现了。2、堆栈结构输出最少步数由于在树型结构设计上,每个子节点都保留了一个对父节点的引用。所以一旦找到最优解,我们就需要从最底层向上追溯所有移动步骤(如下图...
2018-07-03 15:09:27 5104 2
原创 zynq qemu模拟器环境搭建
qemu是硬件模拟器,方便有些同学没得开发板想验证一些driver是否在指定板卡上可以测试,qemu就实现了该功能,选择qemu模拟器最好是选择cpu厂商指定qemu源码,这样测试结果更加逼真。方法二:通过peatalinux工具和xsa硬件描述文件生成zImage和dts,rootfs文件等,这种方法比较常见,因为xsa文件通过vivado生成,在有真实的硬件环境,开发流程可以保持一致。通过petalinux编译生成的zImage,dtb和rootfs后,就可以启动qemu。2. 准备内核和dtb文件。
2024-06-16 15:49:29 1271
原创 ubuntu22.04 修改内核源码教程
sudo make menuconfig ##什么都不用做 就保存。sudo make -jn #n就是上面查找的CPU核数量。到此为止就编译完成了,然后重启电脑就要可以看到修改的源码已经生效。2. 去ubuntu官网下载对应版本内核源码。将下图箭头部分配置成空,不然编译会报错。1. 确认当前内核版本。修改源码后开始编译代码。
2024-04-28 18:45:02 1120
原创 高效无锁环形队列
在linux零拷贝技术中提到高效无锁环形队列,这篇文章分享这个知识点,这个知识点不是很复杂。环形队列多用于多线程之间数据异步传输,提高数据处理性能。下面介绍常规环形队列和高效无锁队列两种处理方式。常规环形队列如下图所示,队列头代表写指针,队列尾代表读指针,通过判断读写的位置判断队列是否为空,是否满,通过线程锁来保证读写指针在使用时只被一个线程使用,从而保证数据不会出错。(出错原因,当一个线程在对读写指针修改时,调度器将该线程切换出去访问另外一个线程,如果该线程正好也会对读写指针进行修改,那么就会导致读写指
2021-11-22 17:42:41 2286
转载 以太网PHY寄存器分析
以太网PHY寄存器分析 11、以太网PHY标准寄存器分析 21.1 Control Register 21.2 Status register 51.3 PHY Identifier Register &...
2020-07-17 10:04:39 8080 6
转载 SerDes知识详解
一、SERDES的作用1.1并行总线接口 在SerDes流行之前,芯片之间的互联通过系统同步或者源同步的并行接口传输数据,图1.1演示了系统和源同步并行接口。 随着接口频率的提高,在系统同步接口方式中,有几个因素限制了有效数据窗口宽度的继续增加。a)、时钟到达两个芯片的传播延时不相等(clock skew)b)、并行数据各个bit的传播延时不相等(data skew)c)...
2020-07-16 17:58:40 9123
转载 PRBS介绍
转自:http://blog.sina.com.cn/s/blog_9fa828d10102y3dp.html之前一直在讲高速串行的协议,MAC,PHY,PMD层,PMA层吗,PCS层。。。看大家回答的数量也不是很多,弱弱的问一句大家都消化了吗?的确,讲到各个层的功能,数据在芯片内部如何去运作协调这方面的确有点高深。其实坦白说哈,作为...
2020-07-16 17:56:07 10737 1
转载 PCIe Switch高级功能及应用
PCI-E Switch芯片,估计不少人已经听说过这个东西了。但是估计多数人对其基本功能知之甚少。PCI-E Switch作为最先进的生产力,已经被广泛应用在了传统存储系统,以及少量品牌/型号的服务器平台。 笔者作为拥有全球最领先PCI-E Switch产品的PMC-Sierra公司的系统架构师,想在这里为大家普及一下PCI-E Swi...
2020-07-16 17:53:39 10506
转载 MAC/PHY与MII(GMII/SGMII/RGMII)
MAC(Media Access Control)即媒体访问控制子层协议。该部分有两个概念:MAC可以是一个硬件控制器 及 MAC通信以协议。该协议位于OSI七层协议中数据链路层的下半部分,主要负责控制与连接物理层的物理介质。MAC硬件大约就是下面的样子:在发送数据的时候,MAC协议可以事先判断是否可以发送数据,如果可以发送将给数据加上一些控制信息,最终将数据以及控制信息以规定的格式发送到物理层;在接收数据的时候,MAC协议首先判断输入的信息并是否发生传输错误,如果没有错误,...
2020-06-28 19:22:23 3762 1
转载 SMI(MDC/MDIO)总线接口介绍
1. MDIO接口SMI:串行管理接口(Serial Management Interface),也被称作MII管理接口(MII Management Interface),包括MDC和MDIO两条信号线。MDIO是一个PHY的管理接口,用来读/写PHY的寄存器,以控制PHY的行为或获取PHY的状态,MDC为MDIO提供时钟。MDIO原本是为MII总线接口定义的,MII用于连接MAC和PHY,包含两种信号接口:1. ...
2020-06-28 19:17:53 10002
转载 高速硬件接口
DLM: dual-lane modules, 是双差分收和发对接口,共有4对差分总线,收和发各两对, 可以复用的总线: sgmii, qsgmii, rxaui,pcie,sata.QLM: quad-lane modules, 是4差分收和发对接口,共有8对差分总线,收和发各4对, 可以复用的总线: sgmii, xaui, dxaui,rxaui, KR,XFI,pcie,ILA,ILK,XLAUI .SGMII:1.25Gbps波特率/差分对, 1Gbps数据速度, 1G以太的内部总线,..
2020-06-24 17:26:14 2101
转载 交换机的工作原理
原文链接:链接一、交换机的工作原理 当交换机收到数据时,它会检查它的目的MAC地址,然后把数据从目的主机所在的接口转发出去。交换机之所以能实现这一功能,是因为交换机内部有一个MAC地址表,MAC地址表记录了网络中所有MAC地址与该交换机各端口的对应信息。某一数据...
2020-06-01 16:43:06 3485
转载 路由器和交换机的区别?
(1)外形上交换机通常端口比较多,路由器端口少体积小,(路由器一般都集成了交换机的功能,LAN口就是作为交换机的端口来使,WAN用于连接外网的端口。(2)工作层次不同交换机在数据链路层(实现数据帧的转发),而路由器在网络层(肩负着网络互连的作用)。(3)数据的转发对象不同交换机是根据MAC地址转发数据帧,而路由器是根据IP地址来转发数据报。IP地址决定最终数据要到达某一台主机,而MAC地址是决定下一跳将要交给哪一台设备(一般是交换机或者路由器),IP地址是软件实现的,可以描述
2020-06-01 16:16:14 873
原创 qmake 添加额外参数 分开编译
qmake添加传参,生成不同的Makefile,可用于不同场景。使用方法如下:传一个参数:arm-qmake "TARGET = ax03" ax03.pro传两个参数:arm-qmake "TARGET=xinetd" "DEFINES +=GUARD" ax03.pro这样很方便时候嵌入式开发,arm-qmake是自定义嵌入式qmake的软链接,为了区分x86的qma...
2019-07-11 11:30:46 1903
原创 spi ioctl无效参数解决
方法一:struct spi_ioc_transfer tr; /* 这种写法一定要赋初值 */ memset(&tr,0,sizeof(struct spi_ioc_transfer)); tr.tx_buf = (unsigned long)tx; tr.rx_buf = (unsigned long)rx; tr.len = sizeo...
2019-05-24 15:14:26 6297 2
原创 linux环境代码不能发送UDP广播包
执行该命令:route add -net 255.255.255.255 netmask 255.255.255.255 dev eth0 metric 1eth0是网络设备名称
2019-05-24 13:57:53 2246 4
原创 linux内核max函数实现
Linux内核函数中的max函数编写得非常优秀,让我忍不住要拿出来分析一番。传统定义max函数是#define max(X,Y) ((X) > (Y) ? (X) : (Y))。是不是觉得这样定义已经perfect了,那先看下面这个例子。int x = 1, y = 2;printf("max=%d/n", max(x++, y++));printf("x = %d, y = %...
2019-04-14 20:19:28 2624
原创 container_of实现原理详解
container_of在内核函数中经常使用,该函数的功能是根据一个结构体成员的指针,返回这个成员指针所在的结构体的首指针。举例说明如下:struct std{int a;short b;char c;int d;};Stuctstd test;Int *p = &test.d;container_of(p, Stuctst...
2019-04-14 20:14:06 2106
原创 i2c总线驱动详解
I2c总线应用也是很广泛的,i2c总线经常挂载eeprom、温度传感器、湿度传感器等设备。I2c总线下可以挂载多个设备,识别设备采用一个地址,这个地址在一条i2c总线是独一无二的。I2c总线驱动与spi总线驱动框架是一致的,都是采用控制器、core、设备三层驱动。下面开始讲解i2c总线驱动流程。强烈建议读者看完本篇文章。首先看一下设备树文件,本次示例程序是一个i2c控制器下挂在eeprom设备...
2019-04-14 20:08:23 3120
原创 spi总线之flash设备驱动
这篇文章分析挂在spi总线下的flash设备驱动程序,设备树信息如下所示。Spi设备驱动程序如下:看到没有,spi_driver驱动结构与platform_driver结构基本一致。我们来看看spi总线的匹配方式如何。Spi核心层定义与注册如下所示。注册方式与platform总线完全一致,看到初始化驱动的入口函数了吗,这也是在前文提到过的,是module_init的一种...
2019-04-14 19:37:58 2013
chrome_xp_49.0.2623.112_setup.rar
2016-12-26
F:\python\tesseract-ocr-w64-setup-v5.0.0-alpha.20191010.zip
2019-10-12
UltraVNC_1_2_16_X64_Setup.zip
2018-12-19
sqlitedbms-0.5.1.tar.gz
2017-09-11
sqlite3.tar.gz
2017-09-11
exfat文件系统windows不能识别
2024-07-31
windos驱动问题
2023-02-15
Python3处理验证码教程
2017-02-06
Linux系统账户密码怎么修改
2016-08-09
pyhon提取url路径转换
2016-07-06
有线网卡和无线网卡不能ping通
2016-04-24
Linux中shell脚本问题
2016-03-09
Linux驱动之USB鼠标调用
2016-03-02
TA创建的收藏夹 TA关注的收藏夹
TA关注的人