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

Assembly 每个进程的内核虚拟内存包含什么?,assembly,operating-system,linker,loader,Assembly,Operating System,Linker,Loader,假设将3个程序(可执行文件)加载到内存中,布局可能如下所示: 我有以下问题: 虚拟内存的概念是否仅限于用户进程?因为,我想知道操作系统内核、驱动程序在哪里?它的内存布局如何?我想了解更多关于内核端内存的信息。我知道它的操作系统是特定的,请选择(windows/linux) 每进程虚拟内存的概念是基于什么?我的意思是说4GB的进程1+4GB的进程2+4GB的进程3=12GB的虚拟内存(对于所有进程)对吗。这听起来不对。或者从总共4GB的空间中,1GB由内核占用,REST3GB由所有进程共享 他们

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

我有以下问题:

  • 虚拟内存的概念是否仅限于用户进程?因为,我想知道操作系统内核、驱动程序在哪里?它的内存布局如何?我想了解更多关于内核端内存的信息。我知道它的操作系统是特定的,请选择(windows/linux)

  • 每进程虚拟内存的概念是基于什么?我的意思是说4GB的进程1+4GB的进程2+4GB的进程3=12GB的虚拟内存(对于所有进程)对吗。这听起来不对。或者从总共4GB的空间中,1GB由内核占用,REST3GB由所有进程共享

  • 他们说,在4GB地址空间的32位机器上。它的一半(或者最近的1GB)被内核占用。我可以在这个图中看到“内核虚拟内存”占用0xc0000000-0xFFFFFF(=1GB)。他们在谈论这个吗?还是别的什么?我只是想确认一下

  • 每个进程的
    内核虚拟内存
    到底包含什么?它的布局是什么

  • 当我们做IPC时,我们谈论的是共享内存。我没有看到这些进程之间共享任何内存。它住在哪里

  • 资源(windows中的文件、注册表)对所有进程都是全局的。因此,资源/文件句柄表必须位于某个全局空间中。那会在哪个区域

  • 我在哪里可以知道更多关于内核方面的东西

  • 当系统使用虚拟内存时,内核也使用虚拟内存。Windows将使用较高的2GB(如果您在Windows引导加载程序中指定了/3GB开关,则为1GB)供自己使用。这包括内核代码、数据(或者至少是分页的数据——没错,Windows可以将部分内核地址空间分页到硬盘)和分页表

  • 每个进程都有自己的VM地址空间。当进程切换发生时,页表通常与另一进程的页表交换。这在x86处理器上很简单-更改
    CR3
    控制寄存器中的页表基址就足够了。整个4GB地址空间被替换为完全不同的4GB地址空间的表所取代。话虽如此,通常会有在进程之间共享的地址空间区域。这些区域在页表中用特殊标志进行标记,这些标志向处理器指示这些区域不需要在处理器的页面中失效

  • 正如我前面提到的,内核的代码、数据和页表本身需要放在某个地方。此信息位于内核地址空间中。内核的代码、数据和页表的某些部分可以根据需要交换到磁盘。有些部分被认为比其他部分更重要,并且根本不会被替换掉

  • 见(3)

  • 视情况而定。用户模式共享内存位于用户模式地址空间中。内核模式地址空间的一部分也可能在进程之间共享。例如,内核代码在系统中的所有进程之间共享并不少见。记忆的位置并不精确。我在这里使用的是任意地址,但一个进程中位于
    0x100000
    的共享内存可能位于另一个进程中的
    0x101000
    。位于完全不同地址的不同地址空间中的两个页面可以指向相同的物理内存

  • 我不知道你在这里是什么意思。打开文件句柄不是所有进程的全局句柄。存储在硬盘上的文件系统对所有进程都是全局的。在Windows下,文件句柄由内核管理,对象存储在内核地址空间中,并由内核对象管理器管理

  • 对于基于WindowsNT的系统,我推荐MarkRussinovich和DavidSolomon

  • 对评论的答复:

    现在,这3GB是共享的b/w所有 过程?或者每个进程都有4GB 空间

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

    为什么每个进程都有内核 虚拟内存

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

    此外,假设用户程序为其系统调用传递了指向某些数据的指针。此指针是一个虚拟地址。您已经关闭了虚拟内存,因此需要将指针转换为物理地址,然后内核才能使用它。如果你打开了虚拟内存,你可以免费得到它,这要感谢CPU上的内存管理单元。相反,您必须手动翻译软件中的地址。我可以描述各种各样的示例和场景(一些涉及硬件,一些涉及页表维护,等等),但其要点是,使用