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

标签 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 (;;) {

在这里,看起来他们改变了内存空间。 谁能解释一下 use_mm 和 set_fs 的具体情况以及它们之间的关系?

最佳答案

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

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

关于c - 在内核线程启动时使用 use_mm 和 set_fs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20085466/

相关文章:

c - 以 C 开头的 Pthread 函数

c# - yield 和 Parallel.ForEach 的奇怪行为

java - GraphStream 编辑节点属性并在 GUI 中显示它们

java - RabbitMQ 内存使用量增长过高

c - 查询完整 DNS 记录

c - 使用内存段的程序,等待锁才能访问数据段(基本)

python - sin_family 的网络字节顺序

java - 一个主线程可以在java中调用另一个主线程吗

python - Python 中的 MemoryError 钩子(Hook)?

java - JFreeChart 堆空间