为什么内核有一个主线程

时间:2014-02-13 19:08:51

标签: c multithreading kernel

我正在研究一个用C实现的简单抢占式内核,它将执行的主要路径放在一个称为“主线程”的线程中。 一个线程由一个堆栈和一个包含:

的结构线程组成
tid_t tid;                          /* Thread identifier. */
enum thread_status status;          /* Thread state. */
char name[16];                      /* Name (for debugging purposes). */
uint8_t *stack;                     /* Saved stack pointer. */
int priority;                       /* Priority. */
struct list_elem allelem;           /* List element for all threads list. */
unsigned magic;                     /* Detects stack overflow. */

以及其他一些无关紧要的组件。

我不明白的部分是为什么主要的执行路径绑定到整个线程?据我了解,执行的主要途径是CPU'unmasked'进行初始化和线程交换。其他一切都是由穿着不同“面具”的CPU的线程完成的。 现在,为什么主要的执行路径需要拥有线程的所有组件?它只需要寄存器(包含在CPU中)和堆栈(可以从软件管理)。 那么struct thread部分不是多余的吗?它只需要一个线程的一部分:堆栈。

1 个答案:

答案 0 :(得分:4)

在这里猜测,'因为你的问题有点不清楚......

您的“主要执行路径”是在启动时运行的,并且(除其他外)初始化您的操作系统的调度程序,内存管理器,驱动程序等。通常,它会希望启动shell,登录管理器线程,服务管理器,可加载驱动程序等。这些实体需要内核服务运行 - MPOE不能只调用它们。因此,在这一点上,它必须安排内核管理执行线程,同时仍然在自身上运行。因此,MPOE为自己创建一个线程控制块,为自己分配一个堆栈,初始化堆栈/ TCB看起来像一个已被中断的线程,将保存的堆栈指针指向它自己的代码,该代码将运行系统的其余部分启动和中断 - 返回自身。它现在是一个单独的内核管理线程,它可以加载/运行必要的驱动程序(启用它们的硬件中断),然后加载启动进程,(加载器创建一个线程来初始运行进程,就像加载用户进程一样) ,所以你的操作系统外层与MPOE并行启动,因为它会继续启动。

当所有启动时OS处理驱动程序,服务等都在运行时,MPOE可以简单地终止自身 - 毕竟它现在只是一个线程。

总结 - 在完成工作之前,MPOE必须安排内核作为线程进行管理。因此,它必须具有线程控制结构,以便可以像处理任何其他线程一样进行管理。

它需要的不仅仅是寄存器(包含在CPU中),它必须有一个可以从内核管理的堆栈。如果没有发生这种情况,它启动的操作系统更高级别的组件就不能与它并行运行。

注意:操作系统专家请原谅我在可怕的复杂性方面经济实惠:)