2019-10-28 22:15
⁄ 工业·编程
⁄ 共 1418字
memcpy和memmove()都是C语言中的库函数,在头文件string.h中,作用是拷贝一定长度的内存的内容,原型分别如下: void *memcpy(void *dst, const void *src, size_t count); void *memmove(void *dst, const void *src, size_t count); 他们的作用是一样的,唯一的区别是,当内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确。 一、memcpy函数 ...
踩内存阅读全文
2019-10-27 21:13
⁄ 工业·编程
⁄ 共 4245字
1、DPDK特点
DPDK全称为Data plane development kit,是一个用来进行包数据处理加速的软件库。与传统的数据包处理相比,DPDK具有以下特点:
1)轮询:在包处理时避免中断上下文切换的开销,
2)用户态驱动:规避不必要的内存拷贝和系统调用,便于快速迭代优化
3)亲和性与独占:特定任务可以被指定只在某个核上工作,避免线程在不同核间频繁切换,保证更多的cache命中
4)降低访存开销:利用内存大页HUGEPAGE降低TLB miss,利用内存...
DPDK阅读全文
2019-10-26 20:52
⁄ 工业·编程
⁄ 共 1541字
在Linux内核源码中,实现和链表相关的接口list_entry()时,会调用container_of()宏定义,它的作用是:给定结构体中某个成员的地址、该结构体类型和该成员的名字,来获取这个成员所在的结构体变量的首地址。有点绕,没关系,接着往下看就能明白了。 container_of()宏定义实现如下所示
/** * container_of - cast a member of a structure out to the containing structure * * ...
GCC阅读全文
2019-10-25 20:45
⁄ 工业·编程
⁄ 共 937字
本文讲解typeof( ((type *)0)->member )的含义,并在此基础上学习offset_of()的用法。
typeof( ((type *)0)->member )
ANSI C标准允许值为0的常量被强制转换成任何一种类型的指针,并且转换的结果是个NULL,因此((type *)0)的结果就是一个类型为type *的NULL指针.
如果利用这个NULL指针来访问type的成员当然是非法的,但typeof( ((type *)0)->member )是想取该成员的类型(有关typeof()的用法可参考这里),所以编译器...
GCC阅读全文
2019-10-24 20:34
⁄ 工业·编程
⁄ 共 1571字
typeof() 是GCC提供的一种特性,可参考C-Extensions,它可以取得变量的类型,或者表达式的类型。
本文总结了typeof()关键字的常见用法,并给出了相应的例子,以加深理解 。
typeof()关键字常见用法
1、不用知道函数返回什么类型,可以使用typeof()定义一个用于接收该函数返回值的变量
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct apple{
int weight;
...
GCC阅读全文
2019-10-23 20:30
⁄ 工业·编程
⁄ 共 810字
如果你对sizeof很熟悉的话,那么大可进行类推,sizeof(exp.)返回的是exp.的数据类型大小,那么typeof(exp.)返回的就是exp.的数据类型。值得注意的是在上面的话里我们可以看到,如果编译选项中指定了使用标准C,那么gcc的扩展使用可能会受到影响,不过在gcc编译条件下使用__typeof__依然可以正常工作,这和使用asm是一样的。当然如果是在其他的编译器条件下,这样做也不行了,只能自定义一个macro去使用,也就是说跟gcc没啥...
GCC阅读全文
2019-10-22 18:59
⁄ 工业·编程
⁄ 共 4638字
前文已经向大家介绍了用脚本封装系统调用的方法。在本文中,我将向大家介绍使用.c文件封装系统调用的方法。
使用.c文件封装系统调用一般出于以下两个原因:一,系统调用已过时,可以使用新的系统调用替换旧的系统调用。系统调用的语义不变。二,封装后的函数改变了系统调用的语义。
stat系统调用的封装便是原因一的一个例子。
stat系统调用是106号系统调用。使用stat系统调用可以获取文件的属性,但是获取的属性值都是32位的,...
glibc阅读全文
2019-10-21 18:53
⁄ 工业·编程
⁄ 共 8749字
本文所有描述都是基于glibc-2.26。
系统调用
系统调用是程序员接触到的最底层的构建程序的组件。它们由内核实现,提供给程序调用。用户按照其调用规则可以实现调用。
glibc的封装方式
glibc使用了两种方式来封装系统调用。一种是由脚本生成。一种是.c文件。
使用.c文件封装系统调用,是因为封装过程比较复杂,除了按系统调用的调用规则来封装外,还要进行其他处理。而脚本生成则十分简单。只要按照系统调用的调用规则来封装即可...
glibc阅读全文
2019-10-20 18:17
⁄ 工业·编程
⁄ 共 23277字
本文试图解答系统调用与库函数之间的关系、glibc库函数的实现原理、系统调用的实现原理等知识,本文讲述的CPU架构限定为ARM核心,为什么是ARM呢,原因很简单,X86我不熟。
系统调用概念
从某种程度上来说,操作系统就是一个计算机的资源管理器,也可以理解为一个虚拟的计算机。那么这台虚拟计算机要向外提供功能,就必须提供一些接口,这些接口就是系统调用。
有很多开发人员经常搞不清楚库函数和系统调用...
glibc阅读全文
2019-10-19 07:49
⁄ 工业·编程
⁄ 共 2667字
最近在linux下写一个库,是给别人用的,要用到定时器这个功能,而且是多定时器任务的,在windows下实现是很方便的,但是在linux下就遇到了问题,linux下一个进程只能有一个定时器,如果我用了定时器去实现我的任务,那肯定是没问题的,如果用我库的人自己也创建了一个定时器,那么问题就出现了,我的定时器就被覆盖了。
我的功能肯定也受到了影响,所以linux下的定时器是需要解决的。
没办法,我就自己写了一个定时器类似功能的...
linux编程阅读全文