1

我在读写锁中实现了 copy_to_user() 。我的问题是,如果在执行 copy_to_user 时出现页面错误,即使没有释放锁,它也会得到服务吗?如果没有,我怎样才能做到这一点?任何想法都会非常感激。

read_lock(x);
copy_to_user((a), (b), (c));
read_unlock(x);

谢谢!

4

1 回答 1

1

读写锁是自旋锁的优化用例(用于对全局/静态/共享数据进行大量读取的路径)。因为它们本质上是自旋锁,所以你不应该在它们的临界区中放置任何可能休眠的东西(schedule())。

用户页面错误是可能发生睡眠的情况;因此,您不应该在 rw-lock 关键部分执行 copy_[to|from]_user() 。

如果你这样做呢?页面错误将在任何原子上下文中被禁用 - 例如使用 rwlocks 等。用户空间错误将导致控制转向错误处理代码;在 x86 上,它在这里:

arch/x86/mm/fault.c:__do_page_fault()
...
  /*   
     * If we're in an interrupt, have no user context or are running
     * in a region with pagefaults disabled then we must not take the fault
     */
    if (unlikely(faulthandler_disabled() || !mm)) {
        bad_area_nosemaphore(regs, error_code, address);
        return;
    }

...

bad_area_nosemaphore()基本上会通过 SIGSEGV 杀死用户进程上下文!

于 2016-05-26T04:32:48.310 回答