我正在阅读米肯斯的操作系统笔记,我看到了下面对虚拟地址空间的描述。

我从概念上理解了进程虚拟地址空间的“用户模式”。它包含程序指令、堆栈、堆、静态数据等。
但是“内核模式”呢?我一直认为内核指令和其他地方一样..。我认为内核是一个独立的过程。当系统调用发生时,内核进程被加载,处理程序被执行。
发布于 2021-01-11 15:58:19
当系统调用发生时,内核进程被加载,处理程序被执行。
这将非常慢,因为进行内核调用需要进程上下文切换,而当内核调用返回时则需要另一个调用。请考虑,即使是使用C中的printf()将"Hello“打印到屏幕上这样的简单操作,也至少需要一个(通常不止一个)内核调用。
为了加快速度,内核被映射到每个进程的虚拟地址空间中。内核调用基本上只是跳转到内核地址空间中的函数,这几乎与在代码中调用普通函数一样快;这样根本不需要上下文切换。
它作为普通函数调用的速度要慢一些,因为内核代码运行在与用户空间代码不同的特权级别上,并且在调用内核函数时必须增加特权级别(因此调用函数时使用SYSCALL指令而不是x86 CPU上的CALL指令)。或者,软件中断可以用于此目的,但中断处理要慢得多,因此现代系统不再为此目的使用中断,除非CPU没有其他可用的中断。详情请见系统调用的典型实现。
因此,内核类似于一个动态共享库,它对所有应用程序都隐式加载,并且在地址空间中可用,但例外,它在所有应用程序中都具有全局状态。缺点是用户空间进程可用的虚拟地址空间较少。这就是64位CPU之所以有意义的原因之一,就像64位指针一样,虚拟地址空间是巨大的,在这种情况下,内核丢失一点是完全不相关的。
另一个优点是内核还可以轻松地访问进行调用的用户空间代码的内存,因为该内存位于处理系统调用的代码的同一个虚拟地址空间内。当您执行要求内核访问用户空间内存的内核调用时,这个内存不必在进程之间复制或使用某种隐式共享内存机制,相反,调用只是传递一个指针,然后内核直接从指针引用的地址读取数据。
https://softwareengineering.stackexchange.com/questions/420907
复制相似问题