C 为什么内核有一个主线程

C 为什么内核有一个主线程,c,multithreading,kernel,C,Multithreading,Kernel,我正在研究一个用C实现的简单的抢占式内核,它将主执行路径放在一个称为“主线程”的线程中。 线程由堆栈和`结构线程组成,其中包含: 以及其他一些不相关的组件 我不明白的是,为什么主执行路径绑定到整个线程?据我所知,执行的主要路径是CPU“无掩码”进行初始化和线程交换。其他一切都是由线程完成的,这些线程是CPU戴着不同的“面具”的线程。 现在,为什么主执行路径需要一个线程的所有组件?它只需要集成到CPU中的寄存器和可以从软件管理的堆栈。 那么struct线程部分对它来说不是多余的吗?它只需要线程的一

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

以及其他一些不相关的组件

我不明白的是,为什么主执行路径绑定到整个线程?据我所知,执行的主要路径是CPU“无掩码”进行初始化和线程交换。其他一切都是由线程完成的,这些线程是CPU戴着不同的“面具”的线程。 现在,为什么主执行路径需要一个线程的所有组件?它只需要集成到CPU中的寄存器和可以从软件管理的堆栈。
那么struct线程部分对它来说不是多余的吗?它只需要线程的一部分:堆栈。

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

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

当所有的启动时操作系统进程、驱动程序、服务等都在运行时,MPOE可以简单地终止自己——毕竟,它现在只是一个线程

概要—MPOE必须在完成其工作之前,将自己作为线程由内核管理。因此,它必须具有线程控制结构,以便能够以与任何其他线程相同的方式对其进行管理

它需要的不仅仅是集成到CPU中的寄存器,它还必须有一个可以从内核管理的堆栈。如果不发生这种情况,它启动的操作系统高级组件将无法与其并行运行


注意:操作系统专家请原谅我的经济性和可怕的复杂性:

据我所知,执行的主要路径是CPU“无掩码”进行初始化和线程交换。我不明白这可能意味着什么。你所说的主要执行途径是什么意思?这对我来说还不清楚,但我可以在结构的其他成员中看到有用的信息,比如magic,对于溢出、名称、调试和优先级,对于您的调度程序。为什么要为主要执行路径制作许多特殊情况和代码,当已经有了所有的执行机制,并且您可以像对待另一个线程一样对待该执行路径时。当然,主线程必须遵守与其他线程相同的大部分规则,例如挂起以便另一个线程可以运行、等待互斥体等等。在内核中,我能想到的最接近主线程的是进程调度器。。。无论如何,在初始化之后。
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. */