当前位置:  技术问答>IP地址数字互转 iis7站长之家

讨论,用户空间和内核空间如何通信,有什么方式,如何实现的?

    来源: 互联网  发布时间:2015-10-30

    本文导语:  我现在知道两种: 1. ioctl    ifconfig用的这种方式 2. sendmsg  keepalived中见到过,设置端口ip地址 还有没有其他方式,并且现在我只能是去抄袭别人实现的代码,但是自己不清楚应该如何去用,如何查资料? 大家...

我现在知道两种:
1. ioctl    ifconfig用的这种方式
2. sendmsg  keepalived中见到过,设置端口ip地址

还有没有其他方式,并且现在我只能是去抄袭别人实现的代码,但是自己不清楚应该如何去用,如何查资料?

大家有没有这种感受啊?

|
通过共享内存(文件)的方式可行

/*user.c*/

#include 
#include 
#include 
#include 
#include 

#define PAGES 512
#define MEM_WIDTH 1500
struct MEM_DATA
{
    //int key;
    unsigned short width;/*缓冲区宽度*/
    unsigned short length;/*缓冲区长度*/
    //unsigned short wtimes;/*写进程记数,预留,为以后可以多个进程写*/
    //unsigned short rtimes;/*读进程记数,预留,为以后可以多个进程读*/
    unsigned short wi;/*写指针*/
    unsigned short ri;/*读指针*/
} * mem_data;

struct MEM_PACKET
{
    unsigned int len;
    unsigned char packetp[MEM_WIDTH - 4];/*sizeof(unsigned int) == 4*/
};

int get_mem(char *aMem,char *aBuf,unsigned int *size)
{
    register int i,s,width,length,mem_i;
    char     *buf;
    struct MEM_PACKET * curr_pack;

    s = 0;
    mem_data = (void *)aMem;
    width  = mem_data[0].width;
    length = mem_data[0].length;
    mem_i  = mem_data[0].ri;
    buf = (void *)(aMem + width * mem_i);

    curr_pack = (struct MEM_PACKET *)buf;
    if  (curr_pack->len != 0){/*第一个字节为0说明该部分为空*/
            memcpy(aBuf,curr_pack->packetp,curr_pack->len);
            *size = curr_pack->len;
            curr_pack->len = 0;
            s = mem_data[0].ri;
            mem_data[0].ri++;
            if(mem_data[0].ri >= length)
                    mem_data[0].ri = 1;
            goto ret;
        }
    
    for (i=1;i= length)
                mem_i = 1;
            buf = (void *)(aMem + width*mem_i);
            curr_pack = (struct MEM_PACKET *)buf;
            if  (curr_pack->len == 0)
                    continue;
            memcpy(aBuf,curr_pack->packetp,curr_pack->len);
            *size = curr_pack->len;
            curr_pack->len = 0;
            s = mem_data[0].ri = mem_i;
            mem_data[0].ri++;
            if(mem_data[0].ri >= length)
            mem_data[0].ri = 1;
            break;
        }

    ret:
    return s;
}

int main()
{
    char *su1_2;
    char receive[1500];
    int i,j;
    int fd;
    int fd_procaddr;
    unsigned int size;
    char addr[9];
    unsigned long ADDR;
    
    j = 0;
    /*open device 'mem' as a media to access the RAM*/
    fd=open("/dev/mem",O_RDWR);    
    fd_procaddr = open("/proc/nf_addr",O_RDONLY);
    read(fd_procaddr,addr,9);
    ADDR = atol(addr);
    close(fd_procaddr);
    printf("%u[%8lx]n",ADDR,ADDR);
    /*Map the address in kernel to user space, use mmap function*/
    su1_2 = mmap(0,PAGES*4*1024, PROT_READ|PROT_WRITE, MAP_SHARED, fd, ADDR);
    perror("mmap");
    while(1)
    {
        bzero(receive,1500);
        i = get_mem(su1_2,receive,&size);
        if (i != 0)
        {
            j++;
            printf("%d:%s[size = %d]n",j,receive,size);
        }    
        else 
        {
            printf("there have no datan");
            munmap(su1_2,PAGES*4*1024);
            close(fd);
            break;
        }
    }
    while(1);
}

|
仅就bekars(涡轮增压)贴出的文章中的“内存共享 需要信号量辅助,而信号量又无法使用。 ”得出用户空间和内核空间无法通过内存共享是错误的, 当然使用通常意义上的信号量的确是不行的,但我们可以自己构造自己的信号量来保持两个空间的同步。 上面我的帖出的代码实际上很多是我自己写的,并且经过了测试和运用在以前的一个产品中了,我只是选取了其中的一部分贴出来而已。 

|
copy_from_user, copy_to_user   不是吗?

|
驱动
系统调用

|
TO 楼上的:
这个问题说起来可以说半天的,总之,LINUX提供了统一的驱动接口,但具体功能和编程要自己实现,关于驱动方面,你可以看一下,不过在网上能下载的都是英文版的

关于系统调用相关资料,你看一下一书

|
中断
系统调用
信号

|
操,直接操作/dev/kmem吧
QQ:28286880

|
共享内存的方式太龌龊了

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 欢迎大家一起来讨论:集群在J2EE中的实现。
  • 大家讨论一下用QT及OSS实现LINUX下的录音程序的方法,说出想法就给分
  • 大家一起讨论一下这个程序设计(关于socket实现http协议)。
  • 讨论,如何实现表示层(P)、功能层(F)、数据层(D)的分离?
  • 请大家来讨论一下用CMP EJB可不可以实现create table?
  • shell 编程 按下tab键自动补全,该如何实现,欢迎大家讨论
  • java能否实现递归调用,入门级问题!!欢迎大家讨论!
  • 集思广益,力求完美实现"围棋"程序,1000分做项目基金,参与讨论者也有分
  • [讨论]csdn新版论坛的xml技术是如何实现的?
  • 讨论一下如何实现一个生产者与两个消费者的问题(版主们一定要来看看)
  • 讨论如何高效实现分页。
  • Java 可以做拨号程序吗?我只是和大家讨论讨论 不必太认真
  • 欢迎高手来讨论:关于文件格式的大讨论
  • 参数传递的问题!(大家讨论讨论)
  • 用java开发一个基于Proxy(代理)的网络计费系统。有兴趣的来讨论讨论
  • 哪位高手有兴趣跟我讨论讨论java中调用dll文件??小弟有些问题还是不很清楚??
  • 【讨论贴】gcc开发的时候有大家都有什么好的调试方法,来讨论下
  • 和Java版高手在线讨论代理服务器的问题,讨论者都有分。
  • 讨论讨论,当错误发生时,并用if语句测试出时,应该返回怎样的值
  • 新建了个QQ群(软件与创业),希望有兴趣的朋友进来讨论讨论软件项目、产品、创业、管理、投资等(代码之外的)观点和想法
  • Java 访问控制的问题(public,private,protected,(default))!讨论讨论!
  • 用java做c/s结构可行吗???大家来讨论讨论,应该都会有收获。
  • 这两天本版人气不高,我来发个问题,有关互斥同步的。大家讨论讨论
  • 有没有人讨论value object模式
  • http://www.itpub.net 论坛更换数据库,速度更快,欢迎大家前去讨论!
  • 讨论“内存泄漏”
  • 很专业的问题请教J2EE高手!这是一个讨论区,有请各位对J2EE感兴趣的朋友参加讨论!
  • 大家一起讨论讨论,suse和ubuntu的区别,顺便散散分
  • 对大家很有意义的一个问题,建议大虾、菜鸟们都来讨论讨论#¥#·#¥·#%#¥%#¥%
  • 大家来讨论一个最实际的问题:)
  • 大家来讨论一下java 的发展前景


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3