【问题标题】:Implementing kernel level threads in xv6在 xv6 中实现内核级线程
【发布时间】:2015-04-21 14:55:12
【问题描述】:

我正在尝试在 xv6 中实现内核级线程。

我目前的主要问题是了解CPU如何获取有关当前进程的信息以及如何修改它以指向当前线程。

我知道它与这条线有某种联系:

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

proc.h,但我不完全理解它的工作原理和原因。

【问题讨论】:

  • 我不知道 xv6 是什么,但它看起来像 x86 代码。在 x86 上,gs 是一个段寄存器。它通常指向包含有关当前thread 的信息的固定位置。 4 表示该位置的偏移量 4 个字节。所以引用这个变量会将4字节的数据引用到线程数据中。 gs 的数据格式是特定于操作系统的。在 Windows 上,查看 winnt.h 中的 NT_TIB。不知道在哪里可以在 linux 上找到此信息。

标签: c xv6


【解决方案1】:

我发现 %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); 以便为额外的线程指针分配空间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-15
    • 2013-04-14
    • 2013-02-19
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多