编辑:我想我解决了这个问题.我明天再次上班时会立即添加自己的答案/解决方案.
我正在为Linux内核3.16.x开发内核模块.我的模块应该接收和发送以太网帧,所以我创建了两个线程.一个用于接收部分,一个用于发送部分.它工作正常.
当我尝试关闭模块的设备文件并卸载它时出现我的问题.确切地说,它在尝试杀死我的线程时发生.机器(我在虚拟机上测试,使用Ubuntu 14.04)在任何输出之前冻结.但是,当我从代码中删除"线程杀死部分"时,它不再冻结.这就是为什么我很确定,这个问题源于我处理kthreads杀戮的方式.
这是我的两个主题:
TX THREAD:信号量tx_sem在代码的另一部分中被提升.
static int tx_task(void *par)
{
device->tx_task_running = 1;
allow_signal(SIGTERM);
while (!signal_pending(current) && device->tx_task_running) {
/* wait until there is something to send */
down_interruptible(&device->tx_sem);
if (signal_pending(current)) {
PRINTD("device_TX_task(): Received kill signal\n");
break;
}
/* check if device is still initialized before continuing*/
if (!device->init_flag) {
break;
}
}
device->tx_task_running = 0;
return DEVICE_RET_OK;
}
Run Code Online (Sandbox Code Playgroud)
RX THREAD
static int device_rx_task(void *par)
{
device->rx_task_running = 1;
/* task loop */
allow_signal(SIGTERM);
while …Run Code Online (Sandbox Code Playgroud)