1 / 7
文档名称:

linux内核之内存管理.doc

格式:doc   大小:243KB   页数:7页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

linux内核之内存管理.doc

上传人:ranfand 2016/8/21 文件大小:243 KB

下载得到文件列表

linux内核之内存管理.doc

文档介绍

文档介绍:Linux 内核之内存管理作者: harvey wang 邮箱: @ 新浪博客地址: http://blog./harveyperfect ,有关于减肥和学****英语相关的博文, 欢迎交流把 linux 内存管理分为下面四个层面(一)硬件辅助的虚实地址转换(二)内核管理的内存相关(三)单个进程的内存管理(四) malloc 软件(一) 处理器硬件辅助的虚实地址转换(以 x86 为例) 在 x86 中虚实地址转换分为段式转换和页转换。段转换过程是由逻辑地址( 或称为虚拟地址) 转换为线性地址;页转换过程则是将线性地址转换为物理地址。段转换示意图如下 X 86 支持两种段, gdt 和 ldt ( 全局描述段表和局部描述符段表),在 linux 中只使用了 4 个全局描述符表,内核空间和用户空间分别两个 gdt ,分别对应各自的代码段和数据段。也可以认为在 linux 中变相地 disable 了 x86 的段式转换功能。页转换示意图如下在 linux 中 x86 的 cr3 寄存器( 页表基地址寄存器) 保存在进程的上下文中, 在进程切换时会保存或回复该寄存器的内容, 这样每个进程都有自己的转换页表, 从而保证了每个进程有自己的虚拟空间。(二) 内核管理的内存相关从几个概念展开内存管理: node 、 zone 、 buddy 、 slab 1、 Node SGI Altix3000 系统的两个结点如上图, NUMA 系统的结点通常是由一组 CPU (如, SGI Altix 3000 是2个 Itanium2 CPU ) 和本地内存组成。由于每个结点都有自己的本地内存, 因此全系统的内存在物理上是分布的, 每个结点访问本地内存和访问其它结点的远地内存的延迟是不同的, 为了优化对 NUMA 系统的支持, 引进了 Node 来将 NUMA 物理内存进行划分为不同的 Node 。而操作系统也必须能感知硬件的拓扑结构,优化系统的访存。但是 Intel x86 系统不是 NUMA 系统。为了保持代码的一致性,在 x86 平台上, Linux 将所有物理内存都划分到同一个 Node 。事实上,对于非 NUMA 体系结构,也是如此处理的。 L inux 系统用定义了数组 pg_data_t node_data[MAX_NUMNODES] 来管理各个 node 。 2、 Zone Linux 中 Node 、 Zone 和页的关系每个结点的内存被分为多个块,称为 zones ,它表示内存中一段区域。一个 zon e 用struct zone 结构描述, zone 的类型主要有 ZONE_DMA 、ZONE_NORMAL 和 ZONE_HIGHMEM 。ZONE_DMA 位于低端的内存空间,用于某些旧的 ISA 设备。 ZONE_NORMAL 的内存直接映射到 Linux 内核线性地址空间的高端部分, ZONE_HIGHMEM 位于物理地址高于 896MB 的区域。例如,在 X86 中, zone 的物理地址如下: 内核空间只有 1GB 线性地址,如果使用大于 1GB 的物理内存就没法直接映射到内核线性空间了。当系统中的内存大于 896MB 时,把内核线性空间分为两部分,内核中低于 896MB 线性地址空间直接映射到低 896MB 的物理地址空