2016-03-29 41 views
0

我使用簡單的LKM(Linux內核模塊)與用戶級別的MPI應用程序(每個計算節點的多進程)交互內核級別信息。我需要在運行時從內核提取一些數據到用戶級應用程序。我的MPI應用程序使用同時運行在同一計算節點上的少量進程。如何讓LKM多進程安全?

我的LKM在/proc提供了兩個文件。文件/proc/mylkm_input用於向LKM提供一些虛擬地址。文件/proc/mylkm_output用於通過我的MPI應用程序從LKM中讀取信息。

該應用程序是多進程。至少有兩個進程可以向LKM提供數據,並期望LKM(通過/proc/mylkm_output)響應特定進程的唯一數據。

另外,文件/proc/mylkm_output可以被不同的進程同時讀取。要閱讀我做的信息lseek(fileId, 0, SEEK_SET),然後read(fileId, buffer, size)

是否有任何解決方案使LKM多進程安全?

謝謝

謝爾蓋

更新

我實現下面的代碼如下建議。我希望這可以幫助我使LKM過程安全。

#define CPES_MAX_PPN 128 

typedef struct CPESProcessInfoT { 
    pid_t localPID; 
    unsigned long virtualAddress; 
} CPESProcessInfo; 

static CPESProcessInfo addrVA[CPES_MAX_PPN];//using this due many processes use this LKM on the machine (PPN>1) 
static int maxItemInAddrVA = 0;//number of cells allocated by the process PID 

CPESProcessInfo *findAddress(void) { 
    int i = 0; 
    struct task_struct *callerTask = current; 
    for(i = 0; i < CPES_MAX_PPN; ++i) { 
     CPESProcessInfo *walkAddr = addrVA + i; 
     if(walkAddr) { 
      if(walkAddr->localPID == callerTask->pid) { 
       return walkAddr; 
      } 
      if(0 == walkAddr->localPID) { 
       walkAddr->localPID = callerTask->pid; 
       ++maxItemInAddrVA; 
       return walkAddr; 
      } 
     } else { 
      printk(KERN_WARNING "CPES LKM error in findAddress PPN %d maxUsed %d", CPES_MAX_PPN, maxItemInAddrVA); 
     } 
    } 
    return 0; 
} 
+1

換句話說,您希望內核模塊**區分**訪問* same *文件的不同進程,不是嗎?如果是這樣,只要在文件操作實現中使用'current'變量(* getter *),它返回當前執行的線程。 – Tsyvarev

+0

是的,我需要保證特定的過程獲得正確的信息。 例如,**進程1 **在文件上執行'lseek',但**進程2 **通過'lseek'並執行'read'。在這種情況下,我期望**進程1 **將失敗,因爲文件描述符被**進程2 **所改變。 對不起,我不明白什麼是'current variable(getter)' 請問我可以給我一些例子嗎? 謝謝 Sergey –

回答

1

內核模塊可以區分處理,其訪問該文件,使用可變current

struct task_struct* accessor = NULL; 

ssize_t my_write(...) 
{ 
    accessor = current; 
    ... 
} 

ssize_t my_read(...) 
{ 
    if(accessor != current) { 
     // This is not a process which performed .write before 
     return -EBUSY; 
    } 
    ... 
} 

當然,從accessor變量存儲對與裝載應當從併發存取(例如以某種方式保護互斥)。