我已经编写了一个设备驱动程序,该驱动程序可以使用相同的文件系统创建3个设备。因此,基本上所有3个设备在被调用时都重定向到相同的文件操作。还有另一个用户程序可以打开单个设备以从中访问数据。假设我在访问另一个设备之前没有关闭设备,将会有什么后果?
fd1 = open("/dev/dummy1", O_RDWR);
if(fd1 < 0){
printf("Cannot open file");
return -1;
}
if(ioctl(fd1, DV_DAT, data) == -1){
printf("issue in getting data\n");
}
else{
printf("%d\n", data);
}
fd2 = open("/dev/dummy2", O_RDWR);
if(fd2 < 0){
printf("Cannot open file");
return -1;
}
if(ioctl(fd2, DV_DAT, data) == -1){
printf("issue in getting data\n");
}
else{
printf("%d\n", data);
}
close(fd2);
fd3 = open("/dev/dummy3", O_RDWR);
if(fd3 < 0){
printf("Cannot open file");
return -1;
}
if(ioctl(fd3, DV_DAT, data) == -1){
printf("issue in getting data\n");
}
else{
printf("%d\n", data);
}
close(fd3);
close(fd1);
此尝试是为了测试一个真实的场景,其中所有三个设备节点都被认为是独立的,并且可以由不同程序同时访问。这是当一个程序已经打开文件并在另一个程序打开文件时正在使用它的时候。
该问题的解决方案是什么?如何确保我不会因内核崩溃而结束?
我发现了问题。实际上,并不是导致内核崩溃的设备。在文件的每个打开功能处,我都使用kmalloc分配内存。在每个版本中,我都为相同的缓冲存储器调用kfree函数。因此,当调用多个设备时,同一指针指向分配的内存。和kfree()在同一指针上执行两次。这是double kfree问题