xv6解析-- 多处理器操作

Posted dream-chaser

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了xv6解析-- 多处理器操作相关的知识,希望对你有一定的参考价值。

xv6可以运行多cpu的计算机上,这个os使用mycpu函数来标识初当前的cpu,使用struct cpu结构体来记录当前的CPU状态。使用cpus这些状态存放于cpus数组中,使用ncpu来标志cpu的个数。

  1 // Per-CPU state
  2 struct cpu {
  3   uchar apicid;                // Local APIC ID 每个cpu都有一个唯一硬件ID,这个ID可以lapicid()函数进行获取,然后存放于这个字段中。
  4   struct context *scheduler;   // swtch() here to enter scheduler
  5   struct taskstate ts;         // Used by x86 to find stack for interrupt
  6   struct segdesc gdt[NSEGS];   // x86 global descriptor table
  7   volatile uint started;       // Has the CPU started?
  8   int ncli;                    // Depth of pushcli nesting.
  9   int intena;                  // Were interrupts enabled before pushcli?
 10   struct proc *proc;           // The process running on this cpu or null
 11 };
 12
 13 extern struct cpu cpus[NCPU]; //当前系统中存在的CPU
 14 extern int ncpu;

 

以下函数主要功能是获取 运行当前代码的cpu对应的ID,然后通过这个ID在cpus数组中进行匹配,得到当前CPU信息(这个cpu信息是已经事先通过程序获取的)

 35 // Must be called with interrupts disabled to avoid the caller being
 36 // rescheduled between reading lapicid and running through the loop.
 37 struct cpu*
 38 mycpu(void)
 39 {
 40   int apicid, i;
 41
 42   if(readeflags()&FL_IF)
 43     panic("mycpu called with interrupts enabled
");
 44
 45   apicid = lapicid();
 46   // APIC IDs are not guaranteed to be contiguous. Maybe we should have
 47   // a reverse map, or reserve a register to store &cpus[i].
 48   for (i = 0; i < ncpu; ++i) {
 49     if (cpus[i].apicid == apicid)
 50       return &cpus[i];
 51   }
 52   panic("unknown apicid
");
 53 }

 

以上是关于xv6解析-- 多处理器操作的主要内容,如果未能解决你的问题,请参考以下文章

XV6调度

XV6操作系统代码阅读心得:锁

XV6陷入,中断和驱动程序

在 Python 多处理进程中运行较慢的 OpenCV 代码片段

:qemu启动xv6问题记录

片段(Java) | 机试题+算法思路+考点+代码解析 2023