操作系统内核数据的位置

时间:2019-01-08 01:43:52

标签: operating-system stack location kernel heap

我是操作系统的初学者,对OS内核有疑问。

我习惯于每个用户进程的标准概念,这些进程具有虚拟地址空间,包括堆栈,堆,数据和代码。我的问题是,当OS内核发生上下文切换时,在内核中运行的代码是否被视为具有堆栈,堆,数据和代码的进程?

我知道有一个专用的内核堆栈,用户程序无法访问它。这位于用户程序地址空间中吗?

我知道OS需要维护一些数据结构以完成其工作,例如过程控制块。这些数据结构位于哪里?它们在用户程序地址空间中吗?它们是否在内核数据结构的某个专用内存段中?它们是否散布在有空间的物理内存中?

最后,我看到了一些图,其中OS代码位于用户程序地址空间的顶部。整个操作系统内核都位于这里吗?如果不是,则OS内核的代码还驻留在哪里?

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

是的,内核具有自己的堆栈,堆,数据结构和代码,与每个用户进程的堆栈,堆不同。

内核中运行的代码本身不被视为“进程”。该代码具有 privileged 特权,这意味着它可以修改内核中的任何数据,在处理器寄存器中设置特权位,发送中断,与设备进行交互,执行特权指令等。用户进程。

所有内核内存和用户进程内存都存储在计算机的物理内存中(如果已从内存交换数据,则可能存储在磁盘上)。

回答其余问题的关键是了解物理内存和虚拟内存之间的区别。请记住,如果您使用虚拟内存地址访问数据,则在将数据提取到确定的物理地址之前,该虚拟地址将转换为物理地址。

每个进程都有自己的虚拟地址空间。这意味着一个进程中的某些虚拟地址 a 可以映射到与另一进程中的同一虚拟地址 a 不同的物理地址。虚拟内存有许多重要用途,但在这里我不再赘述。重要的一点是虚拟内存会强制执行内存隔离。这意味着进程A无法访问进程B的内存。进程A的所有虚拟地址都映射到一组物理地址,而进程B的所有虚拟地址都映射到另一组物理地址。只要两组物理地址不重叠,进程就不会看到或修改彼此的内存。用户进程无法直接访问物理内存地址-他们只能使用虚拟地址进行内存访问。

有时候,两个进程可能有一些虚拟地址确实映射到相同的物理地址,例如它们是否都映射相同的文件,都使用共享库等。

现在,回答您有关内核地址空间和用户地址空间的问题。

每个用户进程的内核可以有一个单独的虚拟地址空间。这就像在每个上下文切换器上更改cr3寄存器(在x86处理器中)的页面目录指针一样简单。由于内核具有不同的虚拟地址空间,因此,只要没有一个内核的虚拟内存地址映射到与用户进程的任何地址空间中的任何虚拟地址相同的物理地址,则任何用户进程都无法访问内核内存。 >

这可能会导致一个小问题。如果用户进程进行系统调用并将指针作为参数传递(例如,指向read系统调用中的缓冲区的指针),内核如何知道哪个物理地址对应于该缓冲区?指针中的虚拟地址映射到内核空间中的其他物理地址,因此内核不能仅取消引用指针。有两种选择:

  1. 内核可以遍历用户进程页面目录/表,以找到与缓冲区相对应的物理地址。然后内核可以从该物理地址读取/写入该物理地址。

  2. 内核可以改为将其所有映射包括在用户地址空间中(如您所述,位于用户地址空间的顶部)。现在,当内核通过系统调用接收到指针时,由于它与进程共享地址空间,因此它可以直接访问该指针。

内核通常与第二个选项一起使用,因为它更方便,更有效。选项1的效率较低,因为每次上下文切换发生时,地址空间都会更改,因此需要刷新TLB,现在您将丢失所有缓存的映射。考虑到最近发现的Meltdown漏洞,内核开始做事的方式有所不同,因此我在这里简化了一些事情。

这导致另一个问题。如果内核将其映射包括在用户进程地址空间中,那么什么会阻止用户进程访问内核内存?内核在页表中设置了保护位,导致处理器禁止用户进程访问映射到包含内核内存的物理地址的虚拟地址。

看看这些slides以获得更多信息。

答案 1 :(得分:0)

  

我习惯于每个用户进程的标准概念,这些进程具有虚拟地址空间,包括堆栈,堆,数据和代码。我的问题是,当OS内核发生上下文切换时,在内核中运行的代码是否被视为具有堆栈,堆,数据和代码的进程?

我知道,每个现代操作系统都从来没有上下文切换到内核。内核是在进程上下文中执行的(某些系统用户会联想到精简的进程上下文。

当进程通过异常或中断进入内核模式时,“内核”就会执行。

每个进程(线程)通常在异常之后都有其自己的内核模式堆栈。通常,每个处理器只有一个中断堆栈。

https://books.google.com/books?id=FSX5qUthRL8C&pg=PA322&lpg=PA322&dq=vax+%22interrupt+stack%22&source=bl&ots=CIaxuaGXWY&sig=S-YsXBR5_kY7hYb6F2pLGjn5pn4&hl=en&sa=X&ved=2ahUKEwjrgvyX997fAhXhdd8KHdT7B8sQ6AEwCHoECAEQAQ#v=onepage&q=vax%20%22interrupt%20stack%22&f=false

  

我知道有一个专用的内核堆栈,用户程序无法访问它。这位于用户程序地址空间中吗?

每个进程都有自己的内核堆栈。它通常位于具有受保护内存的用户空间中,但也可能位于系统空间中。中断堆栈始终在系统空间中。

  

这些数据结构在哪里?它们在用户程序地址空间中吗?

它们通常在系统空间中。但是,某些系统的确在用户空间中将某些结构放在受保护的内存中。

  

它们是否在内核数据结构的某些专用内存段中?

如果它们在用户空间中,则通常它们的访问模式要比用户模式特权更高,而特权要低于内核模式。

  

它们是否散布在物理内存中任何有空间的地方?

思想几乎可以随机分布在物理内存上。