gpt4 book ai didi

assembly - 每个进程的内核虚拟内存包含什么?

转载 作者:行者123 更新时间:2023-12-02 18:46:14 25 4
gpt4 key购买 nike

当说 3 个程序(可执行文件)加载到内存中时,布局可能如下所示:

alt text http://img97.imageshack.us/img97/3460/processesm.jpg

我有以下问题:

  • 虚拟内存的概念是否仅限于用户进程?因为,我想知道操作系统内核、驱动程序在哪里?它的内存布局如何?我想了解更多关于内核端内存的信息。我知道它的操作系统特定于您的选择(windows/linux)。
  • 虚拟内存的概念是基于每个进程的吗?我的意思是说 4GB 的进程 1 + 4GB 的进程 2 + 4GB 的进程 3 = 12GB 的虚拟内存(对于所有进程)是否正确。这听起来不对。或者从总共 4GB 空间中,1GB 被内核占用,其余 3GB 被 b/w 所有进程共享。
  • 他们说,在 4GB 地址空间的 32 位机器上。其中一半(或最近 1GB)被内核占用。我可以在这张图中看到“内核虚拟内存”占用了 0xc0000000 - 0xffffffff (= 1 GB)。他们在谈论这个吗?或者是别的什么?只是想确认一下。
  • 什么 正好 Kernel Virtual Memory这些进程中的每一个都包含什么?它的布局是什么?
  • 当我们做 IPC 时,我们谈论的是共享内存。我没有看到这些进程之间共享任何内存。它在哪里生活?
  • 资源(Windows 中的文件、注册表)对所有进程都是全局的。因此,资源/文件句柄表必须在某个全局空间中。那会在哪个区域?
  • 我在哪里可以了解有关内核方面的更多信息。
  • 最佳答案

  • 当系统使用虚拟内存时,内核也会使用虚拟内存。 Windows 将使用较高的 2GB(或 1GB,如果您在 Windows 引导加载程序中指定了/3GB 开关)供自己使用。这包括内核代码、数据(或者至少是调入的数据——没错,Windows 可以将内核地址空间的一部分调出到硬盘)和页表。
  • 每个进程都有自己的 VM 地址空间。当进程切换发生时,页表通常被另一个进程的页表换出。这在 x86 处理器上很简单——改变 CR3 中的页表基地址控制寄存器就足够了。整个 4GB 地址空间被替换为完全不同的 4GB 地址空间的表所取代。话虽如此,通常会有在进程之间共享的地址空间区域。这些区域在页表中用特殊标志标记,向处理器表明这些区域不需要在处理器的 translation lookaside buffer 中失效。 .
  • 正如我之前提到的,内核的代码、数据和页表本身需要位于某处。该信息位于内核地址空间中。内核代码、数据和页表的某些部分本身可以根据需要交换到磁盘上。有些部分被认为比其他部分更重要,并且根本不会被换掉。
  • 见 (3)
  • 这取决于。用户模式共享内存位于用户模式地址空间中。内核模式地址空间的一部分也很可能在进程之间共享。例如,内核代码在系统中的所有进程之间共享的情况并不少见。该内存位于何处并不准确。我在这里使用任意地址,但共享内存位于 0x100000在一个进程中可能位于 0x101000在另一个进程中。位于不同地址空间、地址完全不同的两个页面可以指向同一个物理内存。
  • 我不确定你在这里的意思。打开的文件句柄并非对所有进程都是全局的。存储在硬盘上的文件系统对所有进程都是全局的。在Windows下,文件句柄由内核管理,对象存放在内核地址空间,由内核对象管理器管理。
  • 对于基于 Windows NT 的系统,我推荐 Windows Internals, 5ed作者:Mark Russinovich 和 David Solomon

  • 回复评论:

    And now this 3GB is shared b/w all processes? or each process has 4GB space?



    这取决于操作系统。一些内核(例如 L4 microkernel )为多个进程使用相同的页表并使用 segmentation 分隔地址空间。 .在 Windows 上,每个进程都有自己的页表。请记住,即使每个进程可能都有自己的虚拟地址空间,但这并不意味着物理内存总是不同的。例如, kernel32.dll 的图像进程 A 中加载的内容与 kernel32.dll 共享在进程 B 中。许多内核地址空间也在进程之间共享。

    Why does each process have kernel virtual memory?



    考虑这个问题的最好方法是问自己,“如果内核不使用虚拟内存执行,它会如何工作?”在这种假设情况下,每次您的程序导致上下文切换到内核时(假设您进行了系统调用),当 CPU 在内核空间中执行时,虚拟内存必须被禁用。这样做是有代价的,当您切换回用户空间时,将其重新打开也是有代价的。

    此外,假设用户程序为其系统调用传入了一个指向某些数据的指针。这个指针是一个虚拟地址。您已经关闭了虚拟内存,因此需要将指针转换为物理地址,然后内核才能对其进行任何操作。如果您打开了虚拟内存,那么由于 CPU 上的内存管理单元,您可以免费获得它。相反,您必须在软件中手动转换地址。我可以描述各种各样的示例和场景(一些涉及硬件,一些涉及页表维护等),但其要点是拥有同构内存管理方案要容易得多。如果用户空间使用虚拟内存,那么在内核空间中维护该方案会更容易编写内核。至少这是我的经验。

    there will be only one instnace of OS kernel right? then why each process has seperate kernel virtual space?



    正如我上面提到的,相当多的地址空间将在进程间共享。在进程之间的上下文切换期间,内核空间中的每个进程数据会被换出,但由于只有一个内核,因此很多数据是共享的。

    关于assembly - 每个进程的内核虚拟内存包含什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2445242/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com