2016-06-07 76 views
0

我是linux內核模塊開發的新手,我正在尋找從內核模塊到用戶空間進程的共享內存段以避免複製數據的延遲。從內核模塊到用戶空間進程的sys v共享內存

我正在使用sys v共享內存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); 
    } 
} 

任何建議或文檔可以提供幫助。

+0

內核模塊和用戶空間應用程序打印了什麼內容? – Tsyvarev

+0

當我試圖插入模塊.ko我得到錯誤:(-1)未知的符號引用sys_shmhet,sys_shmat ..,但編譯完成。 – Mondher123

回答

0

系統調用不適合內核使用:它們僅適用於用戶程序。此外,sys v內存共享不太可能適用於內核線程。

內核和內核模塊有自己的機制用於與用戶 空間進行交互。爲了共享內存,你的內核模塊可以爲它實現字符設備和mmap方法,它將內核分配的內存映射到用戶。請參閱Linux設備驅動程序(第三版),第15章mmap實現的示例。

+0

This [article](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwj1mNXXw6TNAhWJOBoKHTxgBK4QFggeMAA&url=http%3A%2F%2Fciteseerx.ist.psu。 edu%2Fviewdoc%2Fdownload%3Fdoi%3D10.1.1.145.6401%26rep%3Drep1%26type%3Dpdf&usg = AFQjCNGh8qSDajUD0bPt0nbtM2PvQM5ikA&sig2 = TttseQSxvpZB1i7oC1lA5Q)提供了3種內核線程和用戶空間應用程序之間快速數據傳輸的方法,其中之一是sys v shared記憶! – Mondher123

+0

這篇文章明確地告訴你,你需要修改內核**來讓make sys v共享內存工作:'導出內核函數* sys_shmget *,* sys_semget * ...需要內核模塊來創建和銷燬SYS V共享內存區域......(在第16頁末尾)。 – Tsyvarev

+0

謝謝Tsyvarev。 – Mondher123

相關問題