在 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" 行下方并执行以下更改:
- 在 proc.h 中添加以下声明:
extern struct thread *thread asm("%gs:8");
- 更改 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。
我正在尝试在 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" 行下方并执行以下更改:
- 在 proc.h 中添加以下声明:
extern struct thread *thread asm("%gs:8");
- 更改 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。