在 xv6 中实现内核级线程

Implementing kernel level threads in xv6

我正在尝试在 xv6 中实现内核级线程。

目前我的主要问题是了解 CPU 如何获取有关当前进程的信息以及如何修改它以指向当前线程。

我知道它以某种方式链接到这一行:

extern struct proc *proc asm("%gs:4");

proc.h 中,但我不完全理解它的工作原理和原因。

我发现 %gs 指向结构 cpu 中的行 struct cpu *cpu;(在 proc.h 处定义),并且就在该行正下方([ 后 + 4 个字节) =28=]指针) cpu 的当前进程被存储: struct proc *proc; // The currently-running process. 因此,为了添加线程支持,应该更改此行以指向新的线程结构而不是进程结构,或者将线程添加到 "proc" 行下方并执行以下更改:

  1. 在 proc.h 中添加以下声明:extern struct thread *thread asm("%gs:8");
  2. 更改 vm.c,在函数 "seginit(void)" 行中 c->gdt[SEG_KCPU] = SEG(STA_W, &c->cpu, 8, 0);c->gdt[SEG_KCPU] = SEG(STA_W, &c->cpu, 12, 0); 以便为额外的线程指针分配 space。