用户并发访问

时间:2010-11-10 18:57:31

标签: c linux-kernel kernel kernel-module

我正在尝试找出在SMP系统上删除模块的问题 有什么好的解释吗?

1 个答案:

答案 0 :(得分:1)

通常遇到的问题是有一些参考系统上某处的模块正在运行。这可以是任何东西,包括持有的锁,某种飞行中的回调 - 使用符号的另一个模块等等。

内核中有广泛的引用计数系统,应该用于帮助您确保永远不会发生这种情况。使用您的模块或模块的某些方面的东西会保留相应的引用计数。当此计数非零时,内核将阻止您的表单执行“rmmod”。您可以在“lsmod”输出中看到所有已加载模块的引用计数。

了解并明智地使用它们。

这些问题并非特定于“SMP” - 而是任何内核模块。例如,如果你的模块是一个字符驱动程序,并且有人打开了你的设备,你就不希望你的驱动程序在有人打开文件描述符的情况下卸载 - 或者更糟糕的是 - 在read()上有一个进程阻塞等待回应。在许多情况下 - 像这样 - 内核本身将为您保留引用。在这种情况下,打开驱动程序的进程将在驱动程序模块上保存一个refcnt。