我正在尝试在 xv6 中实现内核级线程。
我目前的主要问题是了解 CPU 如何获取有关当前进程的信息以及如何修改它以指向当前线程。
我知道它与这条线有某种联系:
extern struct proc *proc asm("%gs:4");
在proc.h
,但我不完全理解它是如何工作的以及为什么工作。
我发现 %gs 指向struct cpu *cpu;
struct cpu 中的行(在 proc.h 中定义),并且在该行的正下方(cpu 指针后 + 4 个字节)存储了 cpu 的当前进程:
struct proc *proc; // The currently-running process.
所以为了添加线程支持应该改变这一行以指向新的线程结构而不是进程结构,或者,在“proc”行下方添加线程并执行以下更改:
extern struct thread *thread asm("%gs:8");
c->gdt[SEG_KCPU] = SEG(STA_W, &c->cpu, 8, 0);
,c->gdt[SEG_KCPU] = SEG(STA_W, &c->cpu, 12, 0);
以便为额外的线程指针分配空间。