【问题标题】:Is it possible to block a task from kernel space?是否可以从内核空间阻止任务?
【发布时间】:2011-12-03 10:52:20
【问题描述】:

我想知道是否有办法阻止内核空间中的用户空间任务?内核中是否已经为此提供了一个功能?我试过看,但到目前为止没有发现任何明显的东西。

【问题讨论】:

  • 在这里屏蔽是什么意思?
  • 停止执行以便稍后恢复。

标签: linux-kernel scheduling kernel


【解决方案1】:

在 UP 中,这很简单:将任务状态设置为 TASK_INTERRUPTIBLE 并调用 schedule()。您可以稍后通过将其状态设置为 TASK_RUNNING 来“恢复”它。

在 SMP 中,您必须确保任务没有在另一个 CPU 上运行。

【讨论】:

  • 好的,所以在 SMP 中我必须首先检查它是否在 CPU 上运行,如果是,是否有办法中断任务,或者我是否必须等待时间片完成?
  • 您不必等待:您可以通过 smp_call_function() 使用处理器间中断 (IPI)(但请注意限制,请参阅 lxr.linux.no/linux+v3.0.4/kernel/smp.c#L573
【解决方案2】:

看这个:

http://lxr.linux.no/linux+v3.0.4/include/linux/sched.h#L242

 250/*
 251 * This serializes "schedule()" and also protects
 252 * the run-queue from deletions/modifications (but
 253 * _adding_ to the beginning of the run-queue has
 254 * a separate lock).
 255 */
 256extern rwlock_t tasklist_lock;
 257extern spinlock_t mmlist_lock;
 258

所以我们知道这个锁是用于同步访问以更新调度结构。改变任务运行状态,找个例子:

http://lxr.linux.no/linux+v3.0.4/kernel/signal.c#L1812

1769                read_lock(&tasklist_lock); 
1809               __set_current_state(TASK_RUNNING); 
1810                if (clear_code) 
1811                        current->exit_code = 0; 
1812               read_unlock(&tasklist_lock

你只需要锁定/解锁tasklist_lock,并设置状态。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-11
    • 1970-01-01
    • 2018-10-26
    • 2019-08-23
    • 1970-01-01
    • 2014-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多