2015-04-21 4 views
2

Я пытаюсь реализовать потоки уровня ядра в xv6.Реализация потоков уровня ядра в xv6

Моя основная проблема на данный момент заключается в том, чтобы понять, как ЦП получает информацию о текущем процессе и как его модифицировать, вместо этого указывая на текущий поток.

Я знаю, что это каким-то образом связан с этой линии:

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

в proc.h, но я не в полной мере понять, как и почему это работает.

+1

Я не знаю, что такое xv6, но это выглядит как код x86. На x86 gs является регистром сегментов. Он обычно указывает на фиксированное местоположение, которое содержит информацию о текущей [нить] (http://stackoverflow.com/a/10810340/2189500). 4 указывает на смещение 4 байта в это место. Поэтому ссылка на эту переменную будет ссылаться на данные 4 байта на данные потока. Формат данных в gs зависит от ОС. В Windows посмотрите на NT_TIB в winnt.h. Не знаете, где найти эту информацию в Linux. –

ответ

3

я узнал% Gs указывает на линии struct cpu *cpu; в STRUCT центрального процессора (определенного в proc.h), и прямо под этой линии (+ 4 байта после указателя CPU) текущий процесс ЦП сохраняется : struct proc *proc; // The currently-running process. так, чтобы добавить поддержку потоков нужно либо изменить эту строку, чтобы указать на новую нить структуры вместо структуры процесса или в качестве альтернативы, добавить нить ниже линии «Proc» и выполните следующие изменения:

  1. Add in proc.h следующее отклонение: extern struct thread *thread asm("%gs:8");
  2. изменение в vm.c в fucntion "seginit (void)" строка c->gdt[SEG_KCPU] = SEG(STA_W, &c->cpu, 8, 0); до c->gdt[SEG_KCPU] = SEG(STA_W, &c->cpu, 12, 0);, чтобы выделить место для дополнительного указателя потока.
Смежные вопросы