- 博客(40)
- 收藏
- 关注
原创 基于GPUDirect RDMA的GPU和FPGA通信
FPGA和GPU作为数据处理加速平台,在某些应用方面能够很好的替代CPU的计算工作。传统的CPU、FPGA和GPU之间的通信如下图所示: FPGA和GPU都作为PCIE设备,通过PCIE总线与CPU进行通信。如果FPGA和GPU直接需要有数据的交互,传统的方式就是FPGA通过DMA把数据先传输到主机RAM,然后GPU再通过DMA从主机RAM读取数据。这样一个流...
2019-01-29 17:14:53 8946 6
原创 solarflare网卡自环测试
对于一块单独的solarflare网卡进行性能测试,如何进行?solarflare x2万兆光网卡上面有两个port,通过光纤直连这两个port进行测试。如果不做任何其他的设置,直接一个port Ip作为client地址,另一个port作为server地址,这样测试的结果是不准确的。你可以尝试把光驱从光模块上拔掉,会发现数据发送接收不受影响。这是如何实现的?环回接口允许在同一台主机上的客户...
2019-01-10 18:46:19 6803
原创 通过pid查找进程task_struct结构体
如何通过进程id查找进程的描述符task_struct?在实际的工作中,我的驱动中需要通过读取写进内存中的进程id值查找对应的进程是否还在运行,或者是已经退出。通过阅读内核代码,内核中已有相应的API函数来供我们使用。下面是我在使用过程中的一些笔记总结。 linux系统上运行的进程可能成百上千的,或者更多,如何能够快速的通过pid值反向的查找task_struct,内核的方法是通过H...
2018-04-12 20:23:58 6215
原创 Mcelog笔记
最近测试过程中panic并报如下错误:Kernel panic - not syncing: Timeout synchronizing machine check over CPUs经查找Linux内核代码是与mce相关的错误导致的系统panic。 收集mce的log信息,需要安装mcelog工具。Mcelog能够记录和统计运行在x86架构下的Linux OS的一些machine ...
2018-03-18 22:04:23 9940 6
原创 调度器分析
Linux中有两种调度器,一个是主调度器,一个是周期性调度器。主调度器函数就是schedule函数,当进程打算睡眠或者其他原因放弃CPU时,就会直接调用此函数。周期性调度器就是schedule_tick函数,它在时钟中断中调用,以固定的频率运行。周期性调度器 内核会按照频率HZ自动调用schedule_tick函数。周期性调度器不负责进程的切换,只是更新调度相关的信息,...
2018-03-11 17:15:22 722
原创 QEMU+GDB调试内核
用GDB来调试用户态程序是一个方便快捷的定位问题的方法,极大的缩短了调试程序和定位问题的时间。而对于内核或者驱动ko的调试或者我们想了解内核运行的某些过程,我们也可以借助于gdb工具。 GDB+QEMU的方式是一种比较常见的调试内核和驱动的方法,这里写的是我在安装和使用GDB+QEMU时碰到的一些问题的笔记总结。环境准备QEMU安装Qemu的安装比较简单,可以选择下载源码进行编译;也...
2018-03-07 22:25:45 10767
原创 Lwip拥塞控制
什么样的情况出现说明网络出现了拥塞?出现发送数据报文超时和收到3个重复的ACK。这两种情况都说明数据报文段有丢失的情况,我们假定由于报文损坏引起的丢失概率是很低的,因此出现报文丢失,就说明源主机和目的主机之间出现了拥塞。 TCP是一个可靠的协议,在发送数据后会启动一个超时重传定时器,如果超过RTO时间还未收到ACK,就会重传数据。重传会加重网络的负载,会导致更多的丢包和延迟,...
2018-03-06 20:32:43 2809
原创 sched_setscheduler分析
之前在chinaunix上看到有人问了下面这个问题:#define _GNU_SOURCE#include <sched.h>int main(){ int prio = 99; sched_setscheduler(0, SCHED_FIFO, (struct sched_param*)&prio); while(1); ...
2018-03-01 21:37:05 3951
原创 频繁分配释放内存的性能问题
在调优程序的过程中发现对于分辨率大小不同的两个图库,程序总的运行性能数据(如FPGA kernel利用率及每张图处理的latency)差别很大,使用/usr/bin/time –v分析程序发现测试两个图库时,报的minor falut(次缺页错误)不是一个数量级别的。 linux系统下面缺页异常主要分为四种情况。minor falut属于请求调页的一种。当malloc函数调用时,并未实际分...
2018-02-22 17:59:43 4757 1
原创 wait_event_interruptible_timeout函数分析
在intel F10A进行DMA读写操作时,会首先调用queue_work函数将当前work压入工作队列中,然后调用wait_event_interruptible_timeout函数等待DMA读/写操作的完成,在调试的过程中偶尔会出现超时返回的情况。 下面结合Linux 3.9.6源码分析下wait_event_interruptible_timeout函数的实现,看看为什么会出现超时返回...
2018-02-13 16:08:37 4975
原创 Lwip ARP分析(2)
查询ARP缓存Lwip中查询ARP缓存的函数etharp_query声明如下:err_t etharp_query(struct netif *netif,const ip4_addr_t *ipaddr,struct pbuf *q)
2016-12-13 21:54:08 1218
原创 Lwip ARP分析(1)
ARP全称是Address Resolution Protocol,地址解析协议。它是将32bit的IP地址解析成48bit的MAC地址。当一台机器向另外一台机器发生数据时,需要知道对端网卡的硬件地址(48 bit的MAC地址),才能将数据在硬件之间进行交互。ARP核心数据结构ARP缓存表是保证ARP高效运行的关键,ARP缓存表是由一个个的缓存表项组成的。ARP表项的数
2016-12-12 19:39:22 4399
原创 Lwip pbuf分析
在BSD中用mbuf结构体来管理网络上来的各种数据包,同样lwip中也有一个类似的结构体pbuf用来管理数据包。Pbuf结构体定义如下:struct pbuf { struct pbuf *next;
2016-12-06 21:53:32 15245 6
原创 Lwip内存管理
Lwip的动态内存管理机制有三种:◆glibc的内存分配策略◆内存堆(HEAP)分配策略◆内存池(POLL)分配策略Lwip的内存堆分配策略和glibc的内存分配策略只能从其中选择一种。/** * MEM_LIBC_MALLOC==1: Use malloc/free/realloc provided by your C-library
2016-12-04 20:19:29 3612
原创 RT throttling分析
Linux上调度策略为SCHED_FIFO的实时进程是根据优先级抢占运行的。当没有更高优先级的实时进程抢占,而此进程又由于bug等原因长时间运行,不调度其它进程,系统就会出现无响应。这里要分析的RT throttling就是针对此种情况的,它通过限制每个单位时间内分配给实时进程的CPU运行时间,来防止上述情况的出现。标准的设置是1s的时间内,实时进程的运行时间是950ms,其余
2016-11-26 22:25:19 11359
原创 C语言指针和指针的指针的一个问题
关于指针和指针的指针问题,下面结合一个程序来看看。 1 #include 2 int main(void) 3 { 4 5 int i = 5, j = 6, k = 7; 6 int *p1 = &i; 7 int *p2 = &j; 8 int **pp;
2016-11-16 20:24:23 604
原创 Softlockup分析
在Linux环境机器上面进行测试的时候,经常会报softlockup的问题,而导致系统panic。Softlockup是内核中进行死锁检查的一种机制,在2.6.X内核中是在softlockup.c的文件中实现,在新的3.X内核中是在watchdog.c文件中实现的。Softlockup是用来检测内核长时间不发生调度的情况,它的工作原理是在内核中启动一个优先级为MAX_RT_PRIO
2016-11-08 20:35:32 6862
原创 IO复用之select分析笔记
对于一次IO访问,例如read操作,数据会先被拷贝到操作系统内核缓存区,然后才从操作系统内核缓存区拷贝到应用程序的地址空间。它会经历两个阶段:1) 等待数据准备2) 将数据拷贝到用户进程中正是因为如此,Linux下面有5种IO模式◆阻塞型IO◆非阻塞型IO◆IO多路复用◆信号驱动◆异步IO使用场景IO复用是为了解决大量客户端访问问题而提出来的
2016-11-01 21:31:36 577
原创 igb uio小结
前两天对DPDK的igb_uio相关的代码做了下分析,先把这期间碰到的一些问题和代码分析记下来,作为一个小总结。Igb_uio代码相关的可以分为三个部分:igb_uio内核驱动,内核uio框架,uio用户态部分。Igb_uio内核驱动Igb_uio驱动主要做的就是注册一个pci设备。但是igbuio_pci_driver对应的保存pci设备信息的id_table指针为空
2016-10-27 20:41:39 14303
原创 update-grub脚本分析
假如/boot目录下面有多个内核(例如kernel1、kernel2、kernel3等),你现在运行的内核版本是kernel1,运行update-grub命令之后,你会发现grub.cfg文件的默认启动项被更改为启动kernel3了,这样如果你重启系统,系统就会切换到运行内核kernel3上面。我发现这种现象是在修改了/boot/default/grub文件中的选项之后,运行update-
2016-10-24 19:36:41 13789 1
原创 NUMA架构下的CPU拓扑
目前多核已经越来越普遍的使用,Linux对NUMA架构的支持也越来越完善。对于内存管理、多处理的负载均衡调度等进行了大量的优化工作。NUMA相关的几个概念有node、socket、core和thread。Socket是一个物理上的概念,指的是主板上的cpu插槽。Node是一个逻辑上的概念,对应于socket。Core就是一个物理cpu,一个独立的硬件执行单元。Thread就是超线程的概
2016-10-21 16:16:48 12655 2
原创 tcpdump+wireshark分析数据笔记(2)
TCP建立连接图1中编号为3、4、5的是TCP建立连接的包,是TCP建立的三次握手的过程。PC2作为server端,启动监听程序,监听端口65044,一开始处于LISTEN状态。图1客户端发送SYN图4 三次握手之第一次握手TCP连接的建立需要三次的握手,图4是三次握手的第一次握手。PC1作为client端,发送一个SYN段指明打算连接的服务器端PC2。
2015-10-24 09:24:53 1136
原创 tcpdump+wireshark分析数据笔记(1)
测试环境:两台pc机器PC1:上面装有FPGA单板,单板上有TOE模块,模块的MAC地址为55:55:aa:aa:00:24,IP地址为67.153.0.0PC2:上面安装有solarflare SFN7122F万兆网卡。两台pc的连接方式:PC1àDMAàFPGA(TOE)à光纤àSNF7122FàPC2àsocket程序àPC2à SFN7122Fà光纤àFPGA(TOE)
2015-09-25 10:45:42 1260
原创 DMA32映射问题
最近在调试PCIe的行情加速卡的驱动,其中使用DMA在CPU和FPGA间传输数据。最开始使用的是低16M的DMA ZONE的内存,用slab分配器的kmalloc分配获取。但由于最新的需求,需要使用的内存远远超过16M,这样再使用DMA ZONE区域的内存就不够了,那就只能使用DMA32区域的内存来进行DMA传输了。在我使用的调试机器上,DMA32区域的内存情况如下:由上图可知
2015-08-11 19:28:27 3160 2
原创 调度时机分析之被动调度(之内核态抢占调度)
之前写的两个博客中讲了调度时机的用户态抢占调度部分,分别讲了系统调用返回和中断处理返回这两个点的用户态抢占的一些情况。这篇博客会写内核抢占调度的部分。-------------------------------------------------------------------------------------------------------------------------
2015-08-05 22:25:59 1646
原创 edge中断分析
目前正在调试msix中断,在测试过程中发现会概率性的丢失中断。Msix中断默认是edge触发的中断,edge触发的中断是在中断对应pin发生电平信号跳变的时候,会发出一个中断请求。因为跳变是一瞬间的,不会像level触发中断那样一直保持电平不变,这样就可能会漏掉某一个跳变的瞬间,表现就是丢失了一个中断。 内核中处理edge触发中断的函数为handle_edge_irq,此函数有do_IRQ
2015-07-19 10:57:01 3102
原创 调度时机分析之被动调度(之中断处理返回)
之前一篇博客中是关于被动调度的系统调用返回部分,这篇博客将接着写被动调度的中断返回部分。 分析基于内核版本2.6.12.6Linux进程的调度主要分为主动调度和被动调度两大类。整个linux运行过程中,被动调度分为用户态抢占调度和内核态抢占调度。用户态抢占调度发生在当系统调用、中断处理、异常处理等返回用户态时,或者进程的时间片用完时。这篇博客就是写用户态抢占调度的中断处理返
2015-07-16 22:26:24 3665
原创 调度时机分析之被动调度(之系统调用返回)
分析基于内核版本2.6.12.6 在什么情况下,会触发调度?Linux进程的调度主要分为主动调度和被动调度两大类。◆主动调度主动调度就是进程自己缺少相应的所申请的资源,显示调用schedule,让出处理器。◆被动调度在整个linux运行过程中,被动调度又可细分为两种:●用户态抢占调度●内核态抢占调度 下面就结合内核代码分析上述各种调度时机的详细情况。
2015-07-13 20:07:04 4796
原创 gdb调试--堆栈相关
用GDB调试程序最常用的莫过于使用bt命令查看发生问题时的调用栈了。显示的堆栈信息依次是从最底层到最上层的一个被调用关系。那这些堆栈信息是如何而来的?函数在调用的时候会自动的将一些信息压栈。以x86架构下为情况说明,首先压入的是参数,在有多个多个参数的情况下,从右往左依次压入;然后是调用函数的返回地址;接着是压调用函数的栈帧的帧指针ebp(或者rsp);再下来就是被调用函数的局部变量了。
2015-07-07 21:38:07 1842
原创 gdb调试--汇编指令处断点
GDB中断点使用都很简单,如果我们要断点在函数main开始,直接b main就行。 图1 如上图所示停留在断点1,main函数开始处。汇编看到是在第四条汇编指令,那前3条指令都做了些什么?第一条指令是将rbp寄存器压栈,rbp寄存器保存的是栈帧的底部,这里是将调用main函数的函数(这里main是被调用函数)的栈帧底部压栈。第二条汇编指令是将rsp寄存器的值存入rbp
2015-07-04 00:11:00 14143
原创 中断类型标志
在调用request_irq函数申请一个IRQ时,会传入相应的中断类型标志。对于这些标志新旧版本的内核实现是不完全相同的。 IRQF_DISABLED3.16.7-ct7版本内核中此标志是没有地方用到的。此标志表示中断在处理的时候是关中断的,不能被另外的中断所打断。(http://lwn.net/Articles/380931/)这篇文章里有讲到此标志在新内核中被废弃的原因。之前老
2015-07-02 22:16:10 2630
原创 中断初始化
下面的分析是基于3.6.10内核版本。中断描述符硬中断产生之后通过门描述符来寻找中断处理程序的入口。中断描述符表的每个表项由8字节组成,叫做一个门描述符。主要包括三种门描述符:陷阱门、中断门和系统门。这里看下中断门描述符的结构:中断门描述主要包括中断如理程序所在的段选择符和段内偏移及一些标志位。低4字节的bit16~bit31为段选择符,bit0~15为段内偏移量的低16位,高
2015-06-22 15:05:49 4392
原创 持续集成CI之Jenkins使用指南
安装在debian下jenkins的安装方法如下:wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | apt-key add -sh -c 'echo deb http://pkg.jenkins-ci.org/debian binary/ > /etc/apt/sources.list.
2015-06-21 23:22:10 1888
原创 msix中断分析
此文档是基于linux-3.6.10内核代码对msix中断相关进行分析。PCIe设备可以使用msix报文向处理器提交中断,下面首先看下PCIe设备中的MSXI Capability结构。此结构在PCIe设备配置空间偏移0x68的位置处。字段含义Capability IDCapability结构的ID号Next Cap Ptr下一个Capability结构的位置Message Control当前PC...
2015-06-19 23:18:01 15568
原创 串口UART
如何查看Linux系统下串口信息?从上面的信息可知串口设备为16550A,占用的io口为0x3f8。下面看下UART占用的端口的范围。看到serial占用的io口范围为0x03f8~0x03ff,共8个port。 UART 16550A驱动代码8250_core.c文件中实现,初始化函数serial8250_init。从struct uart_driver类型的
2015-06-16 22:16:57 1747
原创 持续集成CI
持续集成(CI)正是针对软件质量问题的一个开发实践。团队开发人员经常集成他们的工作,每次集成都通过自动化的构建(包括编译、部署和测试)来验证,从而能够尽快的发现问题、解决问题。Jenkins是一种开源的持续集成的工具,它具有容易安装、配置,集成RSS/Email实时通知机制,支持分布式构建,丰富的插件支持等特性。CI的目标CI的核心价值在于它的任何一个环节都是自动完成的,无需人工的
2015-06-14 10:41:23 2496
原创 中断下半部分析之Tasklet
上一个博客写了中断下半部的软中断softirq部分的一些学习笔记,这批博客接着写tasklet微任务部分。仅仅是平时看代码中的一些笔记,记下了怕忘了。Tasklet是中断下半部的一种,它工作在中断上下文。同一个tasklet对象同一时刻只能在一个cpu上运行。Tasklet的数据结构为struct tasklet_struct {
2015-06-13 16:05:37 846
原创 中断下半部分析之软中断softirq
中断下半部分为三种:软中断、tasklet和工作队列。软中断softirq软中断softirq是用于不紧急的延期操作,是tasklet的基础。网卡接收数据的过程中,首先网卡发起中断告诉cpu取数据,然后内核从网卡读取数据存入缓存中,再由内核解析数据并将数据送到应用层。上面的整个过程如果都由中断处理程序来处理,耗时太长,会丢失新来的中断。因此解析数据这些不紧急的部分就放到软中断中执行
2015-06-13 13:10:03 1708
原创 上下文切换
进程调度是linux系统中再常见不过的事情,对于进程的调度,这里不管什么调度策略什么的,直接来看看进程的切换做了些什么事情。这里从内核的上下文切换函数context_switch开始分析。static inline task_t * context_switch(runqueue_t * rq, task_t *prev, task_t *next) {
2015-06-11 21:01:16 1536
原创 core文件分析
刚开通博客,想写博客很久了,今天终于开通了。先把之前写的学习笔记贴上来吧。在程序运行出现segmentfault后,我们会通过gdb来调试core文件定位问题,下面我们来分析下core文件是什么?首先需要明确的一点就是core文件也是ELF格式的,ELF的格式如下: ELF文件参与程序的链接和运行,从链接的角度看有上面左边所示的Linking View,从程序运行的
2015-06-10 19:52:00 3752 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人