2
我想在xv6中实现内核级线程。在xv6中实现内核级线程
我目前的主要问题是了解CPU如何获取有关当前进程的信息,以及如何修改它以指向当前线程。
我知道这是某种链接到该行:
extern struct proc *proc asm("%gs:4");
在
proc.h
,但我不完全了解如何以及为什么它的工作原理。
我想在xv6中实现内核级线程。在xv6中实现内核级线程
我目前的主要问题是了解CPU如何获取有关当前进程的信息,以及如何修改它以指向当前线程。
我知道这是某种链接到该行:
extern struct proc *proc asm("%gs:4");
在
proc.h
,但我不完全了解如何以及为什么它的工作原理。
我发现%GS点到在struct CPU线struct cpu *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);
中,以便为额外的线程指针分配空间。
我不知道xv6是什么,但看起来像x86代码。在x86上,gs是段寄存器。它通常指向一个包含有关当前[线程](http://stackoverflow.com/a/10810340/2189500)信息的固定位置。 4表示到该位置的偏移4个字节。所以引用这个变量会将4bytes的数据引用到线程数据中。 gs中的数据格式是特定于操作系统的。在Windows上,在winnt.h中查看NT_TIB。不知道在哪里可以找到这个信息在Linux上。 –