我正在读一本关于操作系统的恐龙书,我对多线程模型有疑问。
第1行:用户线程在内核之上受支持,并且在没有内核支持的情况下进行管理。
第2行:多对一模型将多个用户级线程映射到一个内核线程
我的问题是,映射用户级线程和内核级线程的需要是什么?
发布于 2020-12-28 09:08:45
我不完全理解你的问题。在运行在x86 CPU上的现代OSes中,没有真正的内核线程。操作系统大多是中断驱动的。
例如,在Linux上有systemd,它作为内核的第一个进程运行。然后systemd查看它的“单元”,这些单元是配置文件,允许指定下一步要运行的内容。它负责向您显示著名的用户GUI界面。因此,您有一个目标文件,它指定了在系统启动时应该运行的几个单元。
在启动时,内核将初始化大量内容,然后启动systemd。systemd进程本身是一个用户模式进程,它将在预定义的目录中查找单元文件的文件系统。然后,它将运行单元文件中指定的内容。因为systemd是一个用户模式进程,所以所有运行的进程都是用户模式进程。
它的工作原理是内核将为定时器中断设置处理程序。它将启动计时器,计时器将倒计时到0。然后,计时器将发出一个中断,该中断将启动一个处理程序。该处理程序将在内核中调用schedule()。调度功能将确定下一步运行哪个进程,并重新调度计时器。
不能存在在一个内核线程之上运行的用户线程,这将需要一个内核线程始终运行。这是不可能的,特别是在只有一个核心的系统上。
当您启动一个可执行文件时,您所使用的GUI界面或命令行会在编译期间或启动前动态链接的内核代码中进行系统调用。系统调用使用sysenter特殊x86指令跳转到特殊寄存器中指定的地址。此寄存器不能在启动后设置。这提供了安全性,使用户模式进程不能更改使用int 0x80进行系统调用时将运行的指令。一旦进入内核模式,代码就可以访问所有硬件和所有指令。
我们通过这样做所实现的是安全性。因为用户模式进程不能简单地决定销毁系统或运行它想要的任何内核代码。如果用户模式进程试图运行内核代码,那么它会受到sysenter指令的限制,该指令提供了一个软件接口来从用户模式运行内核代码。即使恶意的用户模式代码可以造成很大的危害,它也不能运行任何内核代码。
用户模式代码和内核模式代码之间的这种分离是在不同级别上完成的。您可以在页到页的基础上指定访问级别,在页表中设置某些位。您还可以通过设置IDT中的某些位来指定中断的访问级别。所有这些都是在引导时由操作系统完成的。
https://stackoverflow.com/questions/65470350
复制相似问题