【问题标题】:sys v shared memory from kernel module to user space processsys v 从内核模块到用户空间进程的共享内存
【发布时间】:2016-10-07 12:39:24
【问题描述】:

我是 linux 内核模块开发的新手,我正在寻找从内核模块到用户空间进程共享内存段以逃避复制数据的延迟。

我正在使用 sys v shared memory api,当我在两个进程之间共享内存时它工作正常,但我无法在进程和内核模块之间共享内存。

下面是我的内核模块和用户空间应用的代码

服务器端:模块

#include <linux/module.h> // init_module, cleanup_module //
#include <linux/kernel.h> // KERN_INFO //
#include <linux/types.h> // uint64_t //
#include <linux/kthread.h> // kthread_run, kthread_stop //
#include <linux/delay.h> // msleep_interruptible //
#include <linux/syscalls.h> // sys_shmget //

#define BUFSIZE 100
#define SHMSZ BUFSIZE*sizeof(char)
key_t KEY = 5678;

static struct task_struct *shm_task = NULL;


static char *shm = NULL;
static int shmid;

static int run_thread( void *data )
{
    char strAux[BUFSIZE];
    shmid = sys_shmget(KEY, SHMSZ, IPC_CREAT | 0666);
    if( shmid < 0 )
    {
        printk( KERN_INFO "SERVER : Unable to obtain shmid\n" );
        return -1;
    }
    shm = sys_shmat(shmid, NULL, 0);
    if( !shm )
    {
        printk( KERN_INFO "SERVER : Unable to attach to memory\n" );
        return -1;
    }
    strncpy( strAux, "hello world from kernel module", BUFSIZE );
    memcpy(shm, strAux, BUFSIZE);
    return 0;
}

int init_module()
{
    printk( KERN_INFO "SERVER : Initializing shm_server\n" );
    shm_task = kthread_run( run_thread, NULL, "shm_server" );
    return 0;
}

void cleanup_module()
{
    int result;
    printk( KERN_INFO "SERVER : Cleaning up shm_server\n" );
    result = kthread_stop( shm_task );
    if( result < 0 )
    {
        printk( KERN_INFO "SERVER : Unable to stop shm_task\n" );
    }
    result = sys_shmctl( shmid, IPC_RMID, NULL );
    if( result < 0 )
    {
        printk( KERN_INFO
        "SERVER : Unable to remove shared memory from system\n" );
    }

}


MODULE_LICENSE( "GPL" );
MODULE_AUTHOR( " MBA" );
MODULE_DESCRIPTION( "Shared memory  server" );

客户端:进程

#include <sys/ipc.h> // IPC_CREAT, ftok //
#include <sys/shm.h> // shmget, ... //
#include <sys/sem.h> // semget, semop //
#include <stdio.h> // printf //
#include <string.h> // strcpy //
#include <stdint.h> // uint64_t //

#define BUFSIZE 4096
key_t KEY = 5678;

int main(int argc, char *argv[]) {
    int shmid, result;
    char *shm = NULL;

    shmid = shmget(KEY, BUFSIZE, 0666);
    if (shmid == -1) {
        perror("shmget");
        exit(-1);
    }
    shm = shmat(shmid, NULL, 0);
    if (!shm) {
        perror("shmat");
        exit(-1);
    }

    printf("%s\n", shm);
    result = shmdt(shm);
    if (result < 0) {
        perror("shmdt");
        exit(-1);
    }
}

任何建议或文件都可以提供帮助。

【问题讨论】:

  • 内核模块和用户空间应用打印了什么?
  • 当我尝试插入模块 .ko 时,我得到错误:(-1) 引用 sys_shmhet、sys_shmat.. 的未知符号,但编译已完成。

标签: linux-kernel ipc shared-memory kernel-module sysv-ipc


【解决方案1】:

系统调用不打算供内核使用:它们仅用于用户程序。此外,sys v 内存共享不太可能适用于内核线程。

内核和内核模块有自己的与用户交互的机制 空间。为了共享内存,你的内核模块可以实现字符设备和mmap 方法,它将内核分配的内存映射到用户。请参阅 Linux 设备驱动程序(3d 版)第 15 章中此类 mmap 实现的示例。

【讨论】:

  • 这个article 提出了内核线程和用户空间应用程序之间快速数据传输的 3 种方法,其中 3 种方法之一是 sys v 共享内存!!!
  • 文章明确指出,您需要修改内核以使 sys v 共享内存正常工作:Exporting the kernel functions *sys_shmget*, *sys_semget* ... was nessesary to allow kernel module to create and destroy SYS V Shared Memory regions...(第 16 页末尾)。
猜你喜欢
  • 2016-10-12
  • 2012-12-26
  • 2017-05-23
  • 2011-12-16
  • 2012-03-02
  • 2018-06-08
  • 1970-01-01
  • 2015-12-12
  • 1970-01-01
相关资源
最近更新 更多