在内核线程启动时使用 use_mm 和 set_fs

jae*_*ong 3 c multithreading memory-management linux-kernel

有时,当我阅读内核源代码时,我发现这样的内容:

static int vhost_worker(void *data)
{
        struct vhost_dev *dev = data;
        struct vhost_work *work = NULL;
        unsigned uninitialized_var(seq);
        mm_segment_t oldfs = get_fs();

        set_fs(USER_DS);
        use_mm(dev->mm);

        for (;;) {
Run Code Online (Sandbox Code Playgroud)

在这里,看起来他们改变了内存空间。谁能解释一下 use_mm 和 set_fs 的细节及其关系?

Dan*_*oni 5

vhost_worker是一个内核线程函数,默认情况下内核线程不与常规进程地址空间关联。use_mm这里的目的set_fs是修改当前任务(即内核线程)以将 vhost_worker 内核线程附加到进程,特别是模拟 VM 的 QEMU 进程,并且dev->mm是该地址空间的句柄。set_fs(USER_DS)设置允许发生故障的最大虚拟地址,以便USER_DS内核处理低于虚拟地址(取决于体系结构)的故障,就像处理正常进程一样。

这允许 vhost 内核端实现直接访问 QEMU 的用户空间映射,该映射映射 VM 实例的来宾内存。实际上,这使得 vhost Worker 成为 QEMU 中不可见的运行线程。