皮皮网
皮皮网

【溪谷 源码】【以太币 区块链 源码】【cms源码文件目录结构】nvme源码教学

来源:手游平台app源码 发表时间:2024-12-28 14:34:25

1.SPDK/NVMe存储技术分析之理解SGL
2.总结uboot的源码重要概念,不知道的教学看过来
3.PostgreSQL14基于源码安装和入门教程
4.二十年重回首——CIH病毒源码分析
5.速存,详细罗列香橙派AIpro外设接口样例大全(附源码)
6.用户态NVMe运维利器 -- SPDK NVMe 字符设备

nvme源码教学

SPDK/NVMe存储技术分析之理解SGL

       在NVMe over PCIe环境中,源码I/O命令支持SGL(Scatter Gather List 分散聚合表)和PRP(Physical Region Page 物理(内存)区域页),教学管理命令仅支持PRP。源码与此相对,教学溪谷 源码在NVMe over Fabrics环境中,源码无论是教学管理命令还是I/O命令都只支持SGL。NVMe over Fabrics网络既支持FC网络,源码又支持RDMA网络。教学在RDMA编程中,源码SGL是教学最基本的数据组织形式。SGL是源码由一个或多个SGE(Scatter/Gather Element)构成的数组。

       SGL的教学每一个SGE就是一个Data Segment(数据段)。在数据传输过程中,源码发送/接收使用的Verbs API为ibv_post_send(),该函数将以 wr 开头的工作请求 (WR) 链表发送到队列对 qp 的发送队列。在调用此函数之前,必须填充好数据结构wr。wr是一个链表,包含了一个sg_list(i.e. SGL),其长度为num_sge。

       一个SGL被至少一个MR(内存区域)保护,多个MR存在于同一个PD(物理地址域)中。一个SGL数组包含多个SGE,SGE的长度不一。在内存中,这些buffer并不连续,而是Scatter(分散)在各个地方。RDMA硬件读取到SGL后,进行Gather(聚合)操作,从而在RDMA硬件的Wire上看到的是连续的数据段。通过使用SGL,可以将分散在内存中的多个数据段(不连续)交给RDMA硬件去聚合成连续的数据段。

       在理解SGL的原理和实现后,可以参考相关学习资源,如Dpdk/网络协议栈/vpp/OvS/DDos/NFV/虚拟化/高性能专家,获取更多DPDK学习资料。以太币 区块链 源码另外,推荐观看视频,如dpdk网卡数据的抓取(一)/协议栈/源码/netmap/柔性数组/udp协议/虚拟化/ICMP/NFV/网卡 dpdk为你的网络定义新功能(一)/NFV/协议栈/虚拟化/源码/网卡/ovs/vpp,以加深对SGL的实践理解。最后,提供一段代码示例,展示如何为调用ibv_post_send()准备SGL和WR。

总结uboot的重要概念,不知道的看过来

       本篇内容不讲解uboot源码,只总结面试中高频问到的重要知识点。内容适用于嵌入式新人了解uboot,对老手有复习和查漏补缺的作用。

       1、PC机启动:上电后,BIOS程序初始化DDR内存和硬盘,从硬盘读取OS镜像到DDR,跳转执行OS。

       2、嵌入式Linux系统启动:上电后执行uboot,初始化DDR、Flash,将OS从Flash读到DDR,启动OS。

       3、uboot定义与作用:uboot属于bootloader,作为单线程裸机程序,主要作用是初始化硬件、内存、flash等,引导内核启动。

       4、uboot启动阶段(不同平台差异):MTK平台:boot rom -> preloader -> lk -> kernel;RK平台:bootrom -> spl(miniloader) -> uboot -> trust -> kernel;NXP平台:bootrom -> bl2 -> ATF -> uboot -> kernel。

       5、uboot支持多种启动方式:SPI Flash/eMMC/Nvme/SD/Hard Disk/U-Disk/net。启动方式不同,固件存放位置也不同。

       6、cms源码文件目录结构掌握uboot的关键点:命令和环境变量。uboot启动后大部分工作在shell中完成,命令用于操作,环境变量如bootcmd和bootargs,用于设置启动参数。

       7、bootargs参数详解:root用于指定rootfs位置,console用于设置控制台,mem用于指定内核使用内存大小,ramdisk_size用于设置ramdisk大小,initrd用于指定initrd参数,init用于指定启动脚本,mtdparts用于设置分区。

       8、常用bootargs组合:文件系统为ramdisk、jffs2类型、nfs等不同情况下的bootargs设置示例。

       总结,了解uboot是嵌入式开发的基础,掌握其启动过程和关键参数,对提高开发效率和解决问题有重要作用。

PostgreSQL基于源码安装和入门教程

       PostgreSQL 源码安装入门教程

       本文将引导您在openEuler . LTS-SP3系统上基于源码安装并配置PostgreSQL ,包括操作系统环境设置、网络配置、软件包安装、用户和数据盘创建,以及数据库的初始化、启动和管理。

       1.1 操作系统环境

       安装openEuler后,确保系统安装了bc命令(若缺失,后续会安装)。

       1.2 网络配置

       通过Nmcli配置网络,首先检查并设置网络接口ens的IP地址,无论是自动获取还是静态配置。

       1.3 更新系统与工具安装

       更新软件包并安装bc、vim、tmux和tar等工具,指标源码饱和度以支持后续操作。

       1.4 用户与数据盘创建

       创建postgres用户和用户组,以及可能的专用数据盘,如NVMe SSD,用于提高性能。

       2. 安装与配置

       2.1 下载与解压

       以root权限下载并解压PostgreSQL 的源代码压缩包。

       2.2 安装与初始化

       按照指导进行编译和安装,初始化数据库并设置启动参数。

       2.3 启动与管理

       启动数据库,登录并创建必要用户、数据库和表空间。

       3. 开机自动启动

       3.1 init.d环境

       使用start-scripts中的脚本配置init.d,确保PostgreSQL在系统启动时自动运行。

       3.2 systemd环境

       为PostgreSQL创建systemd服务文件,确保启动和管理的自动化。

       4. psql操作示例

       展示如何使用psql进行数据库操作,包括创建数据库、模式、表和数据插入等。

       5. 远程连接

       讲解如何配置防火墙以允许远程连接。

       通过以上步骤,您将掌握PostgreSQL 的源码安装和基本管理,准备好进行数据管理和应用程序开发。

二十年重回首——CIH病毒源码分析

       CIH病毒源码分析

       随着双十一的临近,我在考虑为自己的电脑添置一块NVME协议的固态硬盘。然而,我发现自己老款主板并不支持NVME协议。在探索解决方案时,我偶然回想起了CIH病毒,一款曾引起巨大破坏的古老病毒。出于好奇,我决定深入分析CIH源码,回顾那段历史,并分享分析过程与心得。

       CIH源码在GitHub上能找到,版本1.4。源码的高仿花瓣网源码编写者习惯良好,代码中包含了功能更新的时间和具体细节。时间线如下:

       1.0版于年4月日完成,基本功能实现,代码长度字节。

       1.1版于5月日完成,增加了操作系统判断,若为WinNT则不执行病毒,长度字节。

       1.2版于5月日,加入删除BIOS和破坏硬盘功能,长度字节。

       1.3版于5月日,修复了感染WinZIP自解压文件的错误,长度字节。

       1.4版于5月日,彻底修复错误,长度字节。

       CIH病毒于年7月日在美国大面积传播,8月日全球蔓延,引发公众恐慌。最终,病毒作者陈盈豪公开道歉,提供了解毒程序和防毒软件,病毒逐渐被控制。

       源码的第一部分是PE文件头,用于符合PE文件格式,确保Windows识别和执行。接下来,病毒开始运行,通过修改SEH(Structured Exception Handling)来识别操作系统类型。如果为WinNT或之后版本,病毒将自行产生异常并停止运行。

       病毒通过修改中断描述符表,获得Ring0权限。然而,在WinNT操作系统中,这种方法已失效。因此,修改SEH的目的是判断当前操作系统,以避免在非Win9x系统上感染。

       病毒在Win9x系统中,通过修改中断描述符表,将异常处理函数指向病毒自定义的MyExceptionHook。病毒利用此函数安装系统调用钩子,当执行文件操作时,会运行到病毒代码中。

       病毒在MyExceptionHook中,通过dr0寄存器记录病毒安装状态,分配系统内存,并将病毒代码复制到内存中。之后,病毒安装钩子,当有文件读写调用时,会执行病毒代码。

       当系统调用参数为关闭文件时,病毒进行时间判断,直到每月日,统一开始破坏BIOS和硬盘。破坏BIOS的方法包括映射BIOS内容、设置BIOS可写性。硬盘破坏则通过VXD驱动调用命令。

       综上所述,CIH病毒利用了Win9x系统的漏洞,通过修改SEH和中断描述符表进入内核,安装系统调用钩子,感染文件并在特定时间执行破坏操作。然而,其在WinNT及后续系统上的感染能力已失效。尽管如此,CIH病毒的源码和分析过程对了解历史和安全漏洞仍具有重要价值。

速存,详细罗列香橙派AIpro外设接口样例大全(附源码)

       华为云社区分享了关于香橙派AIpro外设接口的详细指南,包括样例源码,旨在帮助开发者充分利用其丰富的功能。AIpro板搭载升腾AI处理器,支持8TOPS INT8计算,适用于多种数据分析和推理计算场景,如教育、机器人和无人机等。

       AIpro板提供了众多接口,如两个HDMI输出、GPIO、Type-C电源接口、SATA/NVMe SSD M.2插槽、TF插槽、千兆网口、USB3.0和Type-C接口,以及两个MIPI摄像头、MIPI屏和预留的电池接口。以下是部分接口的使用示例:

       通过MIPI接口,可以播放音频到耳机。只需插入耳机并进入音频测试程序,通过命令播放*.pcm文件。

       USB接口可用于录音和播放音频,准备好录音功能的耳机后,通过arecord命令录制,aplay命令播放。

       MIPI摄像头可用于拍摄,通过IMX摄像头连接后,运行样例程序即可拍照。

       USB接口的摄像头支持获取图像,通过v4l2-ctl查看设备节点,然后使用内置样例代码拍照并查看结果。

       通过HDMI接口,可以显示图像,连接显示器后,执行特定脚本进行图像显示。

       MIPI接口也能显示图像,但目前仅限于显示一张,使用LCD屏幕配合特定脚本操作。

       想要了解更多样例源码和接口详解,可访问升腾社区文档中心和香橙派AIpro学习资源一站式导航。提升你的AIpro开发经验,探索更多可能!

用户态NVMe运维利器 -- SPDK NVMe 字符设备

       刘孝冬 Intel 高级软件工程师 专注于开源存储SPDK及ISA-L软件的开发。

       随着数据中心规模的不断扩大与延展,硬件设备的运行维护已成为信息技术企业与部门普遍重视的一环。随之而来,是庞大的IT运维工作量。实现硬件设备的可维护,需要灵活高效的监控与管理工具。

       在Linux中,有诸多监控与管理工具助力设备运维,如hdparm、ethtool、SmartCTL等;也有很多简单易用的系统工具,如lspci、lsblk、iostat。对于目前部署量越来越大的NVMe设备,最通用有效的工具莫过于Nvme-cli。

       通过Nvme-cli,使用者可以获取NVMe设备记录的各种LOG;查询当前设备状态;获取设备本身以及内部Namespace的配置信息;设置设备的各项功能;以及对设备做重启与格式化。

       Nvme-cli在监控管理NVMe设备的主要过程,即是组织相关命令信息,通过对NVMe设备文件(/dev/nvmeX,/dev/nvmeXnY)发起IOCTL系统调用,将命令传入内核继而发送请求到NVMe设备上;待NVMe设备响应命令请求,发回响应后,再提取有效响应信息出来。因此,Nvme-cli众多命令的普遍格式是:

       SPDK是一组用于编写高性能、可扩展的用户模式存储应用程序的工具和库。其基础是处在用户空间,轮询模式、异步、无锁的NVMe驱动程序。这为从用户空间应用程序直接访问NvmeSSD提供了零拷贝、高度并行的访问。在此基础上,SPDK还提供了完整的块堆栈作为用户空间库,该库能够执行与操作系统中块存储软件栈相同的许多操作,以及最上层的NVMe-oF、iSCSI和Vhost-user应用服务。

       伴随着SPDK日益广泛的应用,NVMe设备的监控管理成为一个必要的需求。即处在用户空间应用程序的NVMe设备,如何能被用户监控管理。尤其是要便捷、容易通用,那就要求Linux下常用的工具也能被SPDK所支持,尤其是Nvme-cli。

       之前,SPDK社区在Nvme-cli源码基础上,加入对特定于SPDK下NVMe设备的修改(github.com/spdk/nvme-cli...),使得Nvme-cli用在该类设备上。但该实现方式如同在Nvme-cli进程内启动了一个SPDK实例(如图1所示),难以被合并到Nvme-cli的主分支上。

       用户自己编译与使用的过程略显繁琐(spdk.io/doc/nvme-cli.html...):

       由于类似SPDK版的Nvme-cli使用上的诸多不便,社区在寻找更佳的实现方式,来支持Linux上相关工具。

       在SPDK v. Release (spdk.io/release//...)中增加的一个新功能叫做NVMe字符设备 (NVMe character device)。它基于CUSE实现,可以在Linux内核中为NvmeController和Nvme Namespace创建对应字符设备节点(即 /dev/spdk/nvmeX,/dev/spdk/nvmeXnY)。Nvme-cli等工具可以无修改,直接使用这些模拟出的字符设备来监控管理SPDK下的NVMe设备。

       由于此功能目前被认为是实验性的功能,所以需要在configure的时候,显式指定使能nvme-cuse,即在编译SPDK NVMe 驱动时,加入基于CUSE字符设备的支持。

       SPDK为NVMe字符设备功能加入了两个RPC命令bdev_nvme_cuse_register与bdev_nvme_cuse_unregister。它们分别用于指定为某NVMe设备创建CUSE字符设备,和注销CUSE字符设备。当使用bdev_nvme_cuse_register RPC命令后,SPDK会通过CUSE在路径/dev/spdk下,为NVMe controller创建 /dev/spdk/nvmeX,并为其下Namespace创建 /dev/spdk/nvmeXnY,如图2。

       之后,可见路径/dev/spdk下出现SPDK创建的NVMe字符设备:

       nvme-cli使用指定的SPDK NVMe字符设备。目前,大多数的nvme-cli命令可以通过这种方式执行。

       nvme /dev/spdk/nvme0 []

       SPDK社区期望能够无缝地将当前流行的监控管理工具应用在SPDK下的NVMe设备上。当前实现的SPDK NVMe字符设备朝着这个目标迈进了一大步——诸多采用对NVMe字符设备路径文件发起IOCTL调用的工具和命令可以直接运行操作。

       但它的依旧存在诸多局限性:

       通过CUSE创建的NVMeNamespace路径文件属性是字符设备。但从常理上,其文件属性应该为块设备,例如Linux内核驱动创建的NVMeNamespace路径文件属性是块设备。虽然与IO命令不同,监控与管理操作不需要区分设备类型,但在Nvme-cli中如果操作设备指定的是NVMeNamespace文件,代码是存在多处诸如S_ISBLK这样的设备类型检查。

       以下两图分别是SPDK通过CUSE创建的NVMe设备文件,和内核驱动创建的NVMe设备文件,对比可见NVMeNamespace路径文件属性的不同。

       /proc/diskstats信息的缺失。诸多性能监控工具采用定期查看/proc/diskstats文件来获取存储设备的IO流量和负载情况。SPDK目前还未实现一个通用的信息注入方法,来将SPDK块设备或NVMe设备的相关信息实时写入/proc/diskstats。

       SPDK当前的获取设备IO流量和负载信息的方法,是通过SPDK RPC 方法bdev_get_iostat。

       /sys/block/目录下相关文件的缺失。部分工具,如lsblk,是需要通过筛选读取/sys/block/目录下设备文件,来获取相关信息;对/sys/block/目录下设备相关的某些文件,写入内容,来操作设备。SPDK目前也没有实现简洁有效的方法,模拟导出自己的/sys/block/文件。

相关栏目:探索