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 的细节及其关系?
vhost_worker
是一个内核线程函数,默认情况下内核线程不与常规进程地址空间关联。use_mm
这里的目的set_fs
是修改当前任务(即内核线程)以将 vhost_worker 内核线程附加到进程,特别是模拟 VM 的 QEMU 进程,并且dev->mm
是该地址空间的句柄。set_fs(USER_DS)
设置允许发生故障的最大虚拟地址,以便USER_DS
内核处理低于虚拟地址(取决于体系结构)的故障,就像处理正常进程一样。
这允许 vhost 内核端实现直接访问 QEMU 的用户空间映射,该映射映射 VM 实例的来宾内存。实际上,这使得 vhost Worker 成为 QEMU 中不可见的运行线程。
归档时间: |
|
查看次数: |
1462 次 |
最近记录: |