- 博客(27)
- 资源 (8)
- 收藏
- 关注
原创 dlopen Linux 动态库失败原因与解决办法总结
1、dlopen 动态库失败原因,我碰到主要是以下几点(碰到新问题之后再完善,先打个点) ①动态库位置没有放对地方,dlopen 时候找不到你想操作的动态库 解决办法:放到指定目录。 ②头文件没有包全,有不能识别的函数或者标识符 解决办法:加一条打印信息,程序运行到这里,会输出不能识别标识符。if((handle = dlopen(myso, RTLD_NOW)) == NULL) {
2015-08-27 22:10:15 43398
原创 dpdk l2fwd 应用流程分析
intMAIN(int argc, char **argv){ struct lcore_queue_conf *qconf; struct rte_eth_dev_info dev_info; int ret; uint8_t nb_ports; uint8_t nb_ports_available; uint8_t portid, last_
2015-08-23 16:11:37 7926
原创 Linux 如何生成静态库和动态库
1、引言1、linux下的库 静态库和共享库(动态库),二者的不同点在于代码被载入的时刻不同。 静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。 共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。2、库存在的意义 库是别人写好的现有的,成熟的,可以复用的代码,你可以使用但要记得遵守许可协议。 现实中每个程序都要依赖很多基础的底层库,不可能
2015-08-20 23:02:41 3592
原创 算法学习之排序算法(五)(快速排序)
1、算法思想设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。一趟快速排序的算法是: 1)设置两个变量i、j,排序开始的时候:i=0,j=N-1; 2)
2015-08-19 21:47:56 933
原创 Linux 网卡驱动学习(九)(层二转发)
1、mac 地址表的自学习过程端口1上的A计算机要与端口2上的B计算机通信时,A发到交换机上,交换机收到信息后,交换机先记录发端口1所对应的a的mac地址并记录在自己的mac表中,然后再查收方B的mac是否在表中,若在mac地址表中,直接转发给B所对应的端口2转发下去,如果不在mac表中,则向所有端口广播出去,当B收到后会回应交换机转到A,在回应这个过程中,交换机就会把B的mac地址记录在mac表中
2015-08-19 21:30:48 1657
原创 Linux 网卡驱动学习(八)(基于 MAC 地址转发数据)
1、构建MAC地址表交换机技术在转发数据前必须知道它的每一个端口所连接的主机的MAC地址,构建出一个MAC地址表。当交换机从某个端口收到数据帧后,读取数据帧中封装的目的地MAC地址信息,然后查阅事先构建的MAC地址表,找出和目的地地址相对应的端口,从该端口把数据转发出去,其他端口则不受影响,这样避免了与其它端口上的数据发生碰撞。因此构建MAC地址表是交换机的首要工作。下面举例说明交换机建立地址表的过
2015-08-17 22:17:51 3685
原创 Linux 网卡驱动学习(七)(MAC 与 IP)
IP 地址是服务商给你的,MAC地址是你的网卡物理地址。1、MAC 地址在OSI(Open System Interconnection,开放系统互连)7层网络协议(物理层,数据链路层,网络层,传输层,会话层,表示层,应用层)参考模型中,第二层为数据链路层(Data Link)。它包含两个子层,上一层是逻辑链路控制(LLC:Logical Link Control),下一层即是我们前面所提到的MAC
2015-08-17 22:02:55 3896 1
原创 算法学习之排序算法(四)(希尔排序)
希尔排序的基本思想是把记录按步长 gap 分组,对每组记录采用直接插入排序方法进行排序。随着步长逐渐减小,所分成的组包含的记录越来越多,当步长的值减小到 1 时,整个数据合成为一组,构成一组有序记录,则完成排序。
2015-08-15 19:14:12 1021
原创 算法学习之排序算法(三)(选择排序法)
选择排序工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。选择排序是和冒泡排序差不多的一种排序。和冒泡排序交换相连数据不一样的是,选择排序只有在确定了最小的数据之后,。
2015-08-13 21:55:38 903
原创 算法学习之排序算法(二)(直接插入排序法)
1、插入法排序原理直接插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。
2015-08-12 21:34:58 959
原创 算法学习之排序算法(一)(冒泡法)
冒泡排序的内容并不复杂。假设有n个数据需要排序,那么我们需要确定n个从大到小的数据,每一次都挑选第n大的数据是多少,并且放大相应的位置。直到所有的数据都排列整齐了,那么我们的排序就结束了。 1、冒泡代码void bubble_sort(int array[], int length){ int inner = 0, outer = 0; int median = 0; if
2015-08-12 21:25:46 1082
原创 void* 指针有什么用
void*其实可以理解为一个context,利用它可以很好的实现C语言面向对象编程。我觉得使用void*,不是为了看起来合适,而是一个约定,使用C/C++编程的人员看到void*,习惯性的就会认为——这是个私有数据,只有定义的一方才有权解释;这也是我们在回调函数中传递void*作为userdata的基础共识。void*指针其实可以用作泛型,你想象一下你在C中要交换两个变量,如果
2015-08-11 22:02:12 4047
原创 Linux 网卡驱动学习(六)(应用层、tcp 层、ip 层、设备层和驱动层作用解析)
本文将介绍网络连接建立的过程、收发包流程,以及其中应用层、tcp层、ip层、设备层和驱动层各层发挥的作用。
2015-08-11 21:56:10 4150
转载 error while loading shared libraries: xxx.so.x"错误的原因和解决办法
一般我们在Linux下执行某些外部程序的时候可能会提示找不到共享库的错误, 比如:tmux: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory原因一般有两个, 一个是操作系统里确实没有包含该共享库(lib*.so.*文件)
2015-08-10 21:29:04 2069
原创 Linux 网卡驱动学习(五)(收发包具体过程)
函数接口设备初始化函数网络设备驱动在 Linux 内核中是以内核模块的形式存在的,对应于模块的初始化,需要提供一个初始化函数来初始化网络设备的硬件寄存器、配置 DMA 以及初始化相关内核变量等。设备初始化函数在内核模块被加载时调用,它的函数形式如下: static int __init xx_init (void) { …… } module_init(xx_
2015-08-08 22:05:15 9019
原创 代码从记事本拷贝到 source insight 工程出现中文乱码解决办法
1、代码从记事本拷贝到source insight 工程,此时出现乱码,解决办法,将输入法切换到中午输入法即可。2、source insight 阅读VC++源码,注释为乱码解决方案1、options->preferences->Syntax Formatting->Styles; 2、在Style Name 选择 Comment,再对其Font Name 选择Pick,然后再选择“新宋体”。3、
2015-08-08 18:37:25 3671
原创 DPDK 的 uio 以及 PMD 机制的实现
本文主要分析uio和PMD的实现main函数中首先调用了rte_eal_init初始化eal环境,其中主要是hugepage的初始化;ret = rte_eal_init(argc, argv);if (ret 0) rte_exit(EXIT_FAILURE, "Invalid EAL arguments\n");接着创建了mbuf po
2015-08-04 21:52:22 15126
转载 DPDK 中断机制 eal_intr_handle_interrupts
DPDK通过在线程中使用epoll模型,监听UIO设备的事件,来模拟操作系统的中断处理。 一、中断初始化在rte_eal_intr_init()函数中初始化中断。具体如下:1、首先初始化intr_sources链表。所有UIO设备的中断都挂在这个链表上,中断处理线程通过遍历这个链表,来执行设备的中断。2、创建intr_pipe管道,用于epoll模型的消息通
2015-08-04 21:38:45 2170
转载 DPDK 内存管理(三)(rte_malloc 内存管理)
rte_malloc()为程序运行过程中分配内存,模拟从堆中动态分配内存空间。1 void *2 rte_malloc(const char *type, size_t size, unsigned align)3 {4 return rte_malloc_socket(type, size, align, SOCKET_ID_ANY);5 }rte_mallo
2015-08-04 21:33:00 4527 1
转载 DPDK 内存管理(二)(rte_mempool 内存管理)
DPDK以两种方式对外提供内存管理方法,一个是rte_mempool,主要用于网卡数据包的收发;一个是rte_malloc,主要为应用程序提供内存使用接口。本文讨论rte_mempool。rte_mempool由函数rte_mempool_create()负责创建,从rte_config.mem_config->free_memseg[]中取出合适大小的内存,放到rte_config.mem_co
2015-08-04 21:31:38 6748
转载 DPDK 内存管理(一)(内存初始化)
1 前言 DPDK通过使用hugetlbfs,减少CPU TLB表的Miss次数,提高性能。2 初始化DPDK的内存初始化工作,主要是将hugetlbfs的配置的大内存页,根据其映射的物理地址是否连续、属于哪个Socket等,有效的组织起来,为后续管理提供便利。2.1 eal_hugepage_info_init()eal_hugepage_info_ini
2015-08-04 21:30:15 6028
转载 DPDK 收发包处理流程(二)(网卡初始化)
三、PCI驱动注册调用rte_eal_init()--->rte_eal_dev_init()函数,遍历dev_driver_list链表,执行网卡驱动对应的init的回调函数,注册PCI驱动。/* Once the vdevs are initalized, start calling all the pdev drivers */ TAILQ_FOREA
2015-08-04 21:25:11 11460 1
转载 DPDK 收发包处理流程(一)(网卡驱动注册)
本文基于DPDK-1.8.0分析。网卡驱动模型一般包含三层,即,PCI总线设备、网卡设备以及网卡设备的私有数据结构,即将设备的共性一层层的抽象,PCI总线设备包含网卡设备,网卡设备又包含其私有数据结构。在DPDK中,首先会注册设备驱动,然后查找当前系统有哪些PCI设备,并通过PCI_ID为PCI设备找到对应的驱动,最后调用驱动初始化设备。一、网卡驱动注册以e1000网卡驱动
2015-08-04 21:23:15 5879
原创 GNU C - 一个别致的 HelloWorld 程序 (__attribute__机制)
对[ __attribute__ ] 很感兴趣,下面来看一个不一样的HelloWorld程序:12345678910111213141516171819#include #include
2015-08-03 21:31:52 1028
原创 __attribute__((constructor))
gcc为函数提供了几种类型的属性,其中包含:构造函数(constructors)和析构函数(destructors)。 程序员应当使用类似下面的方式来指定这些属性:__attribute__((constructor)) // 在main函数被调用之前调用__attribute__((destructor)) // 在main函数被调用之后调#include<stdio.h> __attrib
2015-08-03 21:31:06 6106
原创 dlopen 方式调用 Linux 的动态链接库
在dlopen()函数以指定模式打开指定的动态链接库文件,并返回一个句柄给 dlsym()的调用进程。使用 dlclose()来卸载打开的库。/*功能:打开一个动态链接库,并返回动态链接库的句柄包含头文件:#include 函数定义:*/void * dlopen( const char * pathname, int mode);/*函数描述:mode是打开方式,其值有多
2015-08-02 09:49:22 3090
原创 Linux 下动态链接库 *.so(生成、调用)
【摘要】动态库*.so在linux下用c和c++编程时经常会碰到,最近在网站找了几篇文章介绍动态库的编译和链接,这里做个笔记。1、动态库的编译下面通过一个例子来介绍如何生成一个动态库。这里有一个头文件:so_test.h,三个.c文件:test_a.c、test_b.c、test_c.c,我们将这几个文件编译成一个动态库:libtest.so。//so_test.h:#include "stdio
2015-08-02 09:34:12 3174
GP接口函数描述和入参解析
2022-05-04
Linux 设备模型之kobject
2015-06-08
字符设备LED驱动程序
2015-04-14
Windows下基于socket多线程并发通信的实现
2015-04-07
采温显示存储报警模块
2013-04-02
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人