我使用简单的LKM(Linux内核模块)在用户级别与内核级别信息交互我的MPI应用程序(每个计算节点的多进程)。我需要在运行时从内核向用户级应用程序提取一些数据。我的MPI应用程序使用同时在同一计算节点上运行的几个进程。
我的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;
}
答案 0 :(得分:1)
内核模块可以使用变量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
当然,存储和加载sysdig
变量应该以某种方式保护并发访问(例如,使用互斥锁)。