内存布局与内存管理方案的混淆
Confusion on Memory Layout vs Memory Management Schemes
我在学习一些操作系统概念,有点困惑,现在有以下问题...
执行中的程序的内存布局(即文本、数据、堆栈、堆)是否仅在其虚拟地址上下文中才有意义 space?如果一个程序被组织(“布局”)到它的虚拟地址 space 中的这些逻辑部分,那么这些部分不会在地址开始使用内存管理从虚拟地址转换为物理地址时就变得混乱吗分页或分段之类的方案?
据我所知,这两个方案允许在物理地址 space 中进行非连续分区。因此,如果我的“文本”部分是从虚拟地址 space 中的地址 0 到 100(我选择的随机大小),并且我选择使用分页,并且我的页面大小是每个 20 个地址的长度(即会有文本部分为 5 页),一旦这些页面非连续地放置在物理地址 space 中(基于空闲 space 可用的任何地方),文本“部分的概念不会“有点不再有意义了(因为它被分块和分散了)?
最后,在物理地址 space 中结束的分段中的可变大小段是否与内存布局中存在的逻辑类别(文本、数据、堆栈、堆)的大小完全相同虚拟space?这里唯一需要注意的是,在物理 space 中,这些段是非连续分散的(彼此不相邻)但仍然完整地存在于它们的特定类别中(即所有“数据”仍然 together/contiguous在物理 space)?
非常感谢任何帮助和澄清,谢谢!
Does the memory layout of a program in execution (ie. text, data, stack, heap) only make sense in context of it's virtual address space? If a program is organized ("laid" out) into these logical sections in it's virtual address space, don't these sections just get messed up as soon as addresses start getting converted from virtual to physical addresses using a memory management scheme like paging or segmentation?
没错。这些部分在虚拟内存中是连续的,但在物理内存中是不连续的。这不是问题,因为操作系统会维护页表;处理器的 MMU 使用它们在每次访问时透明地将虚拟地址转换为物理地址,并且操作系统本身可以使用它们来确定与哪些(分散的)物理页面进行交互,例如当进程结束,内存要被回收时。
As far as I'm aware, these two schemes allow for non-contiguous partitioning in the physical address space. So if my "text" section was from address 0 to 100 (random size I picked) in the virtual address space, and I choose to use paging, and my page sizes were 20 addresses in length each (ie there would be 5 pages for the text section), once these pages get placed in the physical address space non-contiguously (based on wherever free space is available), wouldn't the notion of a TEXT "section" kinda not make sense anymore (as it's been chunked and scattered)?
节的概念仍然适用于虚拟地址适用的上下文。您的 user-mode 程序处理虚拟地址(即指针本质上是虚拟地址),并且许多操作系统仍然处理虚拟地址。由 MMU 完成对分散物理地址的转换 on-demand,只有一部分内核代码需要处理物理地址。
旁白:由于页面簿记的开销,这些尺寸不切实际;典型的页面大小为 4096 字节,并且有一些方法可以在某些平台上创建 larger pages 以进一步减少此开销。
Lastly, are the variable-sized segments in segmentation that end up in the physical address space the exact same size as the logical categories (text, data, stack, heap) of the memory layout present in the virtual space? Is the only caveat here that in the physical space the segments are scattered non-contiguously (are not adjacent to one another) but still exist wholesomely within their specific category (ie all the "data" remains together/contiguous in the physical space)?
不,它们分散在 page-by-page 的基础上,并不是每个虚拟页面都会有物理内存页面支持。这方面的一个例子是例如由于 demand paging 页面只有在实际需要时才懒惰地获得物理支持。尚未使用的 .text 页面可能不会从磁盘加载,直到页面错误实际导致内核从磁盘加载它们。
同样,如果物理内存不足,未使用的页面可能会从虚拟内存中逐出并放置到磁盘上;下次访问它们时,页面错误将导致内核从磁盘加载它们。
虚拟地址也可能映射到不代表 DIMM 某处 DRAM 内存物理页面的物理地址。可以将虚拟地址映射到表示 memory-mapped IO, or a page of virtual memory might be shared between two processes as a form of cooperative communication.
的物理地址
为了优化,还有更多技巧。例如,Linux 的 fork
系统调用不会复制页面;相反,它设置页表以启用称为 copy on write 的功能,其中仅当父级或子级写入时才复制页面,并且仅读取的页面在两者之间共享。
我在学习一些操作系统概念,有点困惑,现在有以下问题...
执行中的程序的内存布局(即文本、数据、堆栈、堆)是否仅在其虚拟地址上下文中才有意义 space?如果一个程序被组织(“布局”)到它的虚拟地址 space 中的这些逻辑部分,那么这些部分不会在地址开始使用内存管理从虚拟地址转换为物理地址时就变得混乱吗分页或分段之类的方案?
据我所知,这两个方案允许在物理地址 space 中进行非连续分区。因此,如果我的“文本”部分是从虚拟地址 space 中的地址 0 到 100(我选择的随机大小),并且我选择使用分页,并且我的页面大小是每个 20 个地址的长度(即会有文本部分为 5 页),一旦这些页面非连续地放置在物理地址 space 中(基于空闲 space 可用的任何地方),文本“部分的概念不会“有点不再有意义了(因为它被分块和分散了)?
最后,在物理地址 space 中结束的分段中的可变大小段是否与内存布局中存在的逻辑类别(文本、数据、堆栈、堆)的大小完全相同虚拟space?这里唯一需要注意的是,在物理 space 中,这些段是非连续分散的(彼此不相邻)但仍然完整地存在于它们的特定类别中(即所有“数据”仍然 together/contiguous在物理 space)?
非常感谢任何帮助和澄清,谢谢!
Does the memory layout of a program in execution (ie. text, data, stack, heap) only make sense in context of it's virtual address space? If a program is organized ("laid" out) into these logical sections in it's virtual address space, don't these sections just get messed up as soon as addresses start getting converted from virtual to physical addresses using a memory management scheme like paging or segmentation?
没错。这些部分在虚拟内存中是连续的,但在物理内存中是不连续的。这不是问题,因为操作系统会维护页表;处理器的 MMU 使用它们在每次访问时透明地将虚拟地址转换为物理地址,并且操作系统本身可以使用它们来确定与哪些(分散的)物理页面进行交互,例如当进程结束,内存要被回收时。
As far as I'm aware, these two schemes allow for non-contiguous partitioning in the physical address space. So if my "text" section was from address 0 to 100 (random size I picked) in the virtual address space, and I choose to use paging, and my page sizes were 20 addresses in length each (ie there would be 5 pages for the text section), once these pages get placed in the physical address space non-contiguously (based on wherever free space is available), wouldn't the notion of a TEXT "section" kinda not make sense anymore (as it's been chunked and scattered)?
节的概念仍然适用于虚拟地址适用的上下文。您的 user-mode 程序处理虚拟地址(即指针本质上是虚拟地址),并且许多操作系统仍然处理虚拟地址。由 MMU 完成对分散物理地址的转换 on-demand,只有一部分内核代码需要处理物理地址。
旁白:由于页面簿记的开销,这些尺寸不切实际;典型的页面大小为 4096 字节,并且有一些方法可以在某些平台上创建 larger pages 以进一步减少此开销。
Lastly, are the variable-sized segments in segmentation that end up in the physical address space the exact same size as the logical categories (text, data, stack, heap) of the memory layout present in the virtual space? Is the only caveat here that in the physical space the segments are scattered non-contiguously (are not adjacent to one another) but still exist wholesomely within their specific category (ie all the "data" remains together/contiguous in the physical space)?
不,它们分散在 page-by-page 的基础上,并不是每个虚拟页面都会有物理内存页面支持。这方面的一个例子是例如由于 demand paging 页面只有在实际需要时才懒惰地获得物理支持。尚未使用的 .text 页面可能不会从磁盘加载,直到页面错误实际导致内核从磁盘加载它们。
同样,如果物理内存不足,未使用的页面可能会从虚拟内存中逐出并放置到磁盘上;下次访问它们时,页面错误将导致内核从磁盘加载它们。
虚拟地址也可能映射到不代表 DIMM 某处 DRAM 内存物理页面的物理地址。可以将虚拟地址映射到表示 memory-mapped IO, or a page of virtual memory might be shared between two processes as a form of cooperative communication.
的物理地址为了优化,还有更多技巧。例如,Linux 的 fork
系统调用不会复制页面;相反,它设置页表以启用称为 copy on write 的功能,其中仅当父级或子级写入时才复制页面,并且仅读取的页面在两者之间共享。