typedef

1. 四个用途 用途一: 定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如: char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针, 和一个字符变量; 以下则可行: typedef char* PCHAR; // 一般用大写 PCHAR pa, pb; // 可行,同时声明了两个指向字符变量的指针 虽然: char *pa, *pb; 也可行,但相对来说没有用typedef的形式直观,尤其在需要大量指针的地方,typedef的方式更省事。 用途二: 用在旧的C的代码中(具体多旧没有查),帮助struct。以前的代码中,声明s 阅读更多…

DPDK收发包全景分析

DPDK收发包是基础核心模块,从网卡收到包到驱动把包拷贝到系统内存中,再到系统对这块数据包的内存管理,由于在处理过程中实现了零拷贝,数据包从接收到发送始终只有一份,对这个报文的管理在前面的mempool内存池中有过介绍。这篇主要介绍收发包的过程。 一、收发包分解 收发包过程大致可以分为2个部分 1.收发包的配置和初始化,主要是配置收发队列等。 2.数据包的获取和发送,主要是从队列中获取到数据包或者把数据包放到队列中。 二、收发包的配置和初始化 收发包的配置 收发包的配置最主要的工作就是配置网卡的收发队列,设置DMA拷贝数据包的地址等,配置好地址后,网卡收到数据包后会通过DMA控制器直接把数据包 阅读更多…

DPDK设备驱动的匹配和初始化

DPDK使用了UIO(用户空间I/O)的机制,跳过内核态的网卡驱动,转而使用用户态的收发包驱动,从驱动到内存和数据包,继而到数据包的处理,这是一个完整的收发包流程。这篇主要介绍设备驱动的初始化,和收发包的处理。所选代码以DPDK-17.02版本为依据。 数据包的驱动初始化是在rte_eal_init()进行的,总体上分为2个阶段进行。 1.第一阶段是rte_eal_pci_init(),主要是获取系统中的设备PCI。 2.第二阶段是rte_eal_pci_probe(),这个阶段做的事比较多,匹配对应的设备驱动,分配设备,并对设备进行初始化。 我们就按照这个顺序进行介绍。 先看rte_eal_ 阅读更多…

mempool内存池

DPDK提供了内存池机制,使得内存的管理的使用更加简单安全。在设计大的数据结构时,都可以使用mempool分配内存,同时,mempool也提供了内存的获取和释放等操作接口。对于数据包mempool甚至提供了更加详细的接口-rte_pktmbuf_pool_create(),接下来重点分析通用的内存池相关内容。使用DPDK-17.02版本。 一. mempool的创建 内存池的创建使用的接口是rte_mempool_create()。在仔细分析代码之前,先说明一下mempool的设计思路:在DPDK-17.02版本中(和2.1等先前版本在初始化略有差异),总体来说,mempool的组织是通过3个 阅读更多…

sse inrtinsics备忘

最近工作中开始使用SIMD加速一些处理过程,做个备忘。

将16个8bit,组装成一个128bit数。 _mm_set_epi8,_mm_setr_epi8的区别在于每一个8bit在内存中的先后顺序。

此外还有:_mm_set_epi16,_mm_setr_epi16;_mm_set_epi32,_mm_setr_epi32。

_mm_shuffle系列函数我觉得是最厉害的,_mm_shuffle_e 阅读更多…

QoS/ToS/CoS/DSCP 介绍

由于最近要用到tos,ip precedence和dscp,找了一些资料,现在明白了tos,ip precedence和dscp这三者的关系。网上流传的版本众多,其实都是正确的,只是分别被不同的标准定义,因而让人莫名其妙。IP Precedence 和 ToS都位于IP头中,共占一个字节,8bits, 关于这几个字节的作用被不同的标准定义过,分别是RFC791,RFC1122,RFC1349; RFC1349废除了之前两个RFC的定义,现在大多设备都使用RFC1349中的定义,所以对于tos,有如下版本,分别说明如下: 下面是RFC1349中的原话: In the past there has 阅读更多…

x86-64栈帧

转载:https://www.cnblogs.com/debuggger/articles/4783278.html 概要 说到x86-64,总不免要说说AMD的牛逼,x86-64是x86系列中集大成者,继承了向后兼容的优良传统,最早由AMD公司提出,代号AMD64;正是由于能向后兼容,AMD公司打了一场漂亮翻身战。导致Intel不得不转而生产兼容AMD64的CPU。这是IT行业以弱胜强的经典战役。不过,大家为了名称延续性,更习惯称这种系统结构为x86-64 X86-64在向后兼容的同时,更主要的是注入了全新的特性,特别的:x86-64有两种工作模式,32位OS既可以跑在传统模式中,把CPU当 阅读更多…

Linux文件预读readahead

缓存 缓存是用来减少高速设备访问低速设备所需平均时间的组件,文件读写涉及到计算机内存和磁盘,内存操作速度远远大于磁盘,如果每次调用read,write都去直接操作磁盘,一方面速度会被限制,一方面也会降低磁盘使用寿命,因此不管是对磁盘的读操作还是写操作,操作系统都会将数据缓存起来。 Page Cache 页缓存(Page Cache)是位于内存和文件之间的缓冲区,它实际上也是一块内存区域,所有的文件IO(包括网络文件)都是直接和页缓存交互,操作系统通过一系列的数据结构,比如inode, address_space, struct page,实现将一个文件映射到页的级别,这些具体数据结构及之间的关 阅读更多…

lieechpi-zero 串口

 

golang实现感知器