gpt4 book ai didi

linux - 如何让 LKM 多进程安全?

转载 作者:太空宇宙 更新时间:2023-11-04 10:38:23 27 4
gpt4 key购买 nike

我制作了简单的 LKM(Linux 内核模块)以在用户级别与内核级别信息交互我的 MPI 应用程序(每个计算节点的多进程)。我需要在运行时从内核中提取一些数据到用户级应用程序。我的 MPI 应用程序使用了几个同时在同一计算节点上运行的进程。

我的 LKM 在 /proc 中提供了两个文件。 /proc/mylkm_input 文件用于向 LKM 提供一些虚拟地址。我的 MPI 应用程序使用文件 /proc/mylkm_output 从 LKM 读取信息。

应用程序是多进程的。至少有两个进程可以向 LKM 提供数据并期望 LKM(通过 /proc/mylkm_output)响应特定进程的唯一数据。

此外,文件/proc/mylkm_output 可以同时被不同的进程读取。要读取信息,我执行 lseek(fileId, 0, SEEK_SET) 然后 read(fileId, buffer, size)

是否有使 LKM 多进程安全的解决方案?

谢谢

谢尔盖

Update

我按照下面的建议实现了以下代码。我希望这有助于我使 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;
}

最佳答案

内核模块可以使用变量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 变量和从中加载应该以某种方式保护免受并发访问(例如,使用互斥锁)。

关于linux - 如何让 LKM 多进程安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36281796/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com