首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | 服务器技术 | linux相关 | linux认证 | 嵌入式 | 下载中心 | 专题 | linux招聘 | 镜像站
OKLinux中文技术站
·设为首页
·加入收藏
·联系我们
系统管理: 中文环境 系统管理 桌面应用 内核技术 | Linux基础: 基础入门 安装配置 常用命令 经验技巧 软件应用 | Linux数据库: Mysql Postgre Oracle DB2 Sybase other
网络管理: 网络安全 网络应用 Linux服务器 环境配置 黑客安全 | 编程开发: PHP CC++ Python Perl Shell 嵌入式开发 java jsp | PHP技术: PHP基础 PHP技巧 PHP应用 PHP文摘
Linux资讯 Linux招聘 Linux专题 Apache | Linux相关: 硬件相关 Linux解决方案 Linux认证 企业应用 其它Unix | 相关下载: 资料下载 参考手册 开发工具 服务器类 软路由 其它
 技术搜索:
会员中心 注册会员 高级搜索  
  → 当前位置:首页>linux基础>linux其它>正文

内核循环缓冲区数据结构在用户态的使用

http://www.oklinux.cn  2007-07-24  来源: 赛迪网 sixth  会员收藏  游客收藏  【 】 

 

  忘记了之前是有个什么事情一时想起好像需要用个cycler buffer,手头一时又没有,懒得自己实现。就向同学要了个。后来好像也没有用到,倒是一直记得好像老早以前看到ldd上提到双向链表的时候有提到个kfifo,只是一直没有用到这个,所以一直没看。倒是无聊的时候想起过printk是否用的就是这个数据结构。

  昨天临下班的时候想到kfifo这个东东,今天就抽点时间看看。

  刚开始是把双向链表拎出来编一下看看,结果让我大吃一惊。居然没有list.h,看来fc从4以后开始倒退倒是有点佐证了。好在机器上还有linux-libc-headers的包,解包覆盖一下应该就ok了吧。不要高兴,还是不行。打开list.h一看,居然里面只包含了另一个文件,只扔给我一个#error,超ft。没办法,只好上内核源码里去拷了,于是把include/*都copy到了/usr/include。再编,靠,居然还是不过。nnd,再看list.h,居然还有个宏定义才能使用里面的inline函数,要不就extern reference了,郁闷。只好在源文件中加了:

#ifdef CONFIG_DEBUG_LIST
#undef CONFIG_DEBUG_LIST
#endif

  然后再包含上linux/autoconf.h,这才一切ok。汗......

  有了上面的折腾,在开始搞kfifo之前就先看看kfifo.h和他的实现吧。结果一看kfifo.h和kfifo.c,头文件里面extern了好几个kfifo.c里面实现的东东不说,还用了spinlock,看来直接用是没有指望了,还是dirty hack到user space算了。于是只能把文件copy出来dirty hack了。吭哧吭哧搞了一气,搞了个可用的东东开列如下:
  kfifo.c:

#include "kfifo.h"
#include
#include
#include
#include
struct kfifo *kfifo_init(unsigned char *buffer, unsigned int size)
{
    struct kfifo *fifo;

    fifo = malloc(sizeof(struct kfifo));
    if (!fifo)
        return (void*)(-ENOMEM);

    fifo->buffer = buffer;
    fifo->size = size;
    fifo->in = fifo->out = 0;

    return fifo;
}

struct kfifo *kfifo_alloc(unsigned int size)
{
    unsigned char *buffer;
    struct kfifo *ret;
    if (size & (size - 1)) {
        fprintf(stderr,"size > 0x80000000\n");
        size = roundup_pow_of_two(size);
    }

    buffer = malloc(size);
    if (!buffer)
        return (void *)(-ENOMEM);

    ret = kfifo_init(buffer, size);

    if ((unsigned long)ret<=0)
    {
        free(buffer);
    }

    return ret;
}

void kfifo_free(struct kfifo *fifo)
{
    free(fifo->buffer);
    free(fifo);
}

unsigned int __kfifo_put(struct kfifo *fifo, unsigned char *buffer, unsigned int len)
{
    unsigned int l;

    len = min(len, fifo->size - fifo->in + fifo->out);

        l = min(len, fifo->size - (fifo->in & (fifo->size - 1)));
    memcpy(fifo->buffer + (fifo->in & (fifo->size - 1)), buffer, l);
    memcpy(fifo->buffer, buffer + l, len - l);

    fifo->in += len;

    return len;
}

unsigned int __kfifo_get(struct kfifo *fifo,
             unsigned char *buffer, unsigned int len)
{
    unsigned int l;

    len = min(len, fifo->in - fifo->out);

    l = min(len, fifo->size - (fifo->out & (fifo->size - 1)));
    memcpy(buffer, fifo->buffer + (fifo->out & (fifo->size - 1)), l);

    fifo->out += len;
    return len;
}

共3页: 上一页 1 [2] [3] 下一页

上一篇:Linux不编译2.6内核直接给iptables加模块   下一篇:Ubuntu Linux系统备份与还原实用命令技巧


收藏于收藏夹】 【评论】 【推荐】 【打印】 【关闭
相关文档
·移植Uboot到ARMer9开发系统上
·Linux下使用FrameBuffer直接写屏
·Linux下各种主要文件系统的读写性能测试
·Ubuntu下用多个Sources.list文件加速APT
·jsp中加入中文后保存时报错的处理方法
·使用Eclipse开发Jsp
·Eclipse使用入门
·在Red Hat Linux 9上安装Eclipse
·直接用java来启动Eclipse workbench
·Eclipse实用快捷键大全
·使用 Eclipse 平台调试您的软件项目
·Kirin原创的eclipse editor配色方案
·eclipse 2.1.2 install shell & run shell
·教Eclipse说你的本土语言
·构建linux下IDE环境--Eclipse 篇
·Eclipse入门-- Eclipse的使用简介及插件开发
发表评论
密码: 匿名评论
评论内容:

(不超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规)
 
  最新文档
·Fedora Linux下运行PS2模拟器
·ARM、DSP、FPGA的技术特点和区别是什么
·从我做起,10件可以帮助开源的事
·介绍Linux系统下的几个小游戏模拟器
·了解 Linux Kudzu服务的作用
·Linux操作系统上到底提供了哪些基本软
·Ubuntu下两个项目管理工具:Dia和Plann
·UNIX的分支 服务器上的FreeBSD系统
·Ubuntu下用多个Sources.list文件加速AP
·Linux下各种主要文件系统的读写性能测
·移植Uboot到ARMer9开发系统上
·Linux下使用FrameBuffer直接写屏
  阅读排行
·配置ubuntu上网问题
·debian Linux 下 Cedega 使用指南
·SuSE Linux安装后的初步设置
·移植Uboot到ARMer9开发系统上
·ubuntu dapper下解决依赖关系安装opera
·ubuntu中的快捷方式
·解决ubuntu 6.06不能保存DNS地址的问题
·debian Linux下制作deb包的简便方法
·GNU EMACS字体设置,基本上可以随心所
·ubuntu下安装软件的几种方法
·在ubuntu下修改网卡地址
·Linux下使用FrameBuffer直接写屏
·Linux下各种主要文件系统的读写性能测
·Kirin原创的eclipse editor配色方案
·debian里面开启dma功能,提高硬盘读写速
网摘收藏: