自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(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接口函数描述和入参解析

GP接口函数描述和入参解析(持续完善中)。 目前已经涵盖:安全存储相关API,基础API和key相关的API正在完善,后续会补录上去,有需要的同学可以通过CSDN 私信我,单独发你。 函数分析:主要基于optee-os GP相关接口做分析的。

2022-05-04

TCG_TSS_Overview_Common_Structures_v0.9_r03_published

TPM-TSS协议栈

2022-03-20

Linux 设备模型之kobject

kobject_init用来初始化kobject结构,kobject_add用来把kobj加入到设备模型之中。 在实作中,我们先对obj1进行初始化和添加的动作,调用参数里,parent被赋为NULL,表示obj1没有父对象,反映到sysfs里, my_kobj1的目录会出现在/sys下,obj2的父对象设定为obj1,那么my_kobj2的目录会出现在/sys/my_kobj1下面。 前面提到,kobject也提供了引用计数的功能,虽然本质上是利用kref,但也提供了另外的接口供用户使用。 kobject_init_and_add和kobject_init这两个函数被调用后,kobj的引用计数会初始化为1, 所以在module_exit时要记得用kobject_put来释放引用计数。

2015-06-08

Linux下安装神器

Linux下的安装windows exe的神器。

2015-05-22

字符设备LED驱动程序

 所有的驱动程序都应该对应一个具体的设备,这个LED驱动当然设备应该是LED。但是linux将它分成了一类叫做混杂设备。这类设备共享一个主设备号,但次设备号不同所有混杂设备形成一个链表,要访问一个设备时根据次设备号来查找相应的miscdevice。linux中用struct miscdevice来描述一个混杂设备:

2015-04-14

Windows下基于socket多线程并发通信的实现

本文介绍了在Windows 操作系统下基于TCP/IP 协议Socket 套接口的通信机制以及多线程编程知识与技巧,并给出多线程方式实现多用户与服务端(C/S)并发通信模型的详细算法,最后展现了用C++编写的多用户与服务器通信的应用实例并附有程序。 关键词:Windows;套接字;多线程;并发服务器; Socket 是建立在传输层协议(主要是TCP 和UDP)上的一种套接字规范,最初由美国加州Berkley 大学提出,为UNIX 系统开发的网络通信接口,它定义了两台计算机之间通信的规范,socket 屏蔽了底层通信软件和具体操作系统的差异,使得任何两台安装了TCP 协议软件和实现了Socket 规范的计算机之间的通信成为可能,Socket 接口是TCP/IP 网络最为通用的应用接口,也是在Internet 上进行网络程序应用开发最通用的API[1],本文介绍了Socket通信的基本机制以及采用多线程技术实现并发通信的基本原理,并给出实例。

2015-04-07

采温显示存储报警模块

一些常用模块,包括LCD1602显示模块,DS1302模块,DS18B20模块,报警模块,24C02模块,全都是用C语言编写的。全部都通过调试,很方便的。很实用喔。。个人觉得3分并不贵啦,物有所值。。

2013-04-02

matlab基础教学

挺好的一个资源,我从老师那拷贝过来的,与大家分享了,内容很详细!

2011-10-03

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除