2015-04-21 54 views
2

我想在xv6中實現內核級線程。在xv6中實現內核級線程

我目前的主要問題是瞭解CPU如何獲取有關當前進程的信息,以及如何修改它以指向當前線程。

我知道這是某種鏈接到該行:

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

,但我不完全瞭解如何以及爲什麼它的工作原理。

+1

我不知道xv6是什麼,但看起來像x86代碼。在x86上,gs是段寄存器。它通常指向一個包含有關當前[線程](http://stackoverflow.com/a/10810340/2189500)信息的固定位置。 4表示到該位置的偏移4個字節。所以引用這個變量會將4bytes的數據引用到線程數據中。 gs中的數據格式是特定於操作系統的。在Windows上,在winnt.h中查看NT_TIB。不知道在哪裏可以找到這個信息在Linux上。 –

回答

3

我發現%GS點到在struct CPU線struct cpu *cpu;(在proc.h定義),和右低於線(+ cpu的指針後4個字節) 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);中,以便爲額外的線程指針分配空間。