有时,当我阅读内核源代码时,我会发现如下内容:
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/