1.1什么是内存管理

内存管理是对计算机内存进行分配和使用的技术。内存管理主要存在于多任务的操作系统中,因为内存资源极其有限。须要在不同的任务之间共享内存,内存管理的存在就是要高效、高速的非配内存,并在适当的时候回收和释放内存。以保各个任务正常的运行。最常见的内存管理机制有:段式内存管理和页式内存管理。

1.2内存中的地址

早期的16位计算中。寄存器的位宽仅仅有16位。为了能訪问到1M Bit的内存空间,CPU就採用了分段的方式来管理内存,将1M的内存分为若干个逻辑段,每一个逻辑段的起始地址必须是16的整数倍,每一个逻辑段最大的訪问空间为64K。

1) 段基地址

将物理地址分为64K Bit 为单位的多个段,因为最后4位总是0,所以段的起始地址被右移4位后保存,须要计算实际的物理地址时再左移四位。

2) 逻辑地址(段内偏移地址)

逻辑地址地分段后段内偏移量。

3) 线性地址

线性地址代表了计算机的地址訪问能力。代表了一个非物理的实体地址。是逻辑地址到物理地址变换之间的中间层。

在段式管理中。线性地址 = 段内基地址 + 逻辑地址。

4) 虚拟地址

虚拟地址的概念主要出如今虚拟内存技术中。它使得应用程序觉得它拥有连续的可用的内存(一个连续完整的地址空间)。所以在某种情况下被称为线性地址。

5) 物理地址

实际物理存储器的地址,是地址转换的终于结果。

PS: 对于16位机来说,他的实际物理地址是20位,线性地址和物理地址是同样的所以线性地址到物理地址之间是一一相应的。

1.3 段式管理(32位CPU)

x86的32位机型有“实模式”与“保护模式”两种。在“实模式”下段的使用方式与16位机时一致的。可是在“保护模式”下,段寄存器被称为段选择器(segment selector)。它存储的是段描写叙述符(segment descriptor),段描写叙述符记录了该段的基地址、权限等信息,段基地址+逻辑地址 能够转换成线性地址。

段式管理的长处:可以依据实际的代码。从用户的角度(程序猿)的角度将代码分成多个逻辑段,比方数据段、代码段、堆栈段。段大小可变,利于保护数据、方便内存共享。

1.4 页式管理

页式管理是将线性地址划分为固定长度的管理单元,一般是4K大小,对32位计算机来说就划分了2^20个也,以二级的页式内存管理机制来说,线性地址被分为三部分

l 页文件夹地址:22~31 (共10位)

l 页表地址:12~21(共10位)

l 页内偏移量:0~11(共12位)

系统会为每一个进程的页文件夹位置,通过线性地址的最高10位找到页表的起始地址,再通过中间10位找到页的起始地址。最后通过低12位找到页内偏移量。终于计算出物理地址。

1.5 Linux 的内存管理模式

Linux 是一个跨平台的操作系统。为了能支持Intel 的段式管理方式,它採用了段式 + 页式管理机制。不过Linux 不过有限度的使用段式管理方式。由于Linux 系统中每一个段的基地址都是0,所以 逻辑地址= 线性地址,逻辑地址转换成线性地址时一一相应。Linux 的这样的处理方式不仅简化了内核。也为移植到不支持段式管理方式的平台上提供了方便。

更严格的说,Linux 採用了页式管理模式,只是由于不同的平台的页级数不一致,Linux 2.6.29使用了四级的页式管理结构来兼容不同页级数的CPU。

这四级分别为:

页全局文件夹(Page Global Directory) :pgd

页上级文件夹(Page Upper Directory):pud

页中间文件夹(Page Middle Directory):pmd

页表(Page Table Entry):pte

Linux 内核开发 - 内存管理的更多相关文章

  1. 24小时学通Linux内核之内存管理方式

    昨天分析的进程的代码让自己还在头昏目眩,脑子中这几天都是关于Linux内核的,对于自己出现的一些问题我会继续改正,希望和大家好好分享,共同进步.今天将会讲诉Linux如何追踪和管理用户空间进程的可用内 ...

  2. Linux内核之内存管理

    Linux内核之内存管理 Linux利用的是分段+分页单元把逻辑地址转换为物理地址; RAM的某些部分永久地分配给内核, 并用来存放内核代码以及静态内核数据结构; RAM的其余部分称动态内存(dyna ...

  3. Linux内核笔记--内存管理之用户态进程内存分配

    内核版本:linux-2.6.11 Linux在加载一个可执行程序的时候做了种种复杂的工作,内存分配是其中非常重要的一环,作为一个linux程序员必然会想要知道这个过程到底是怎么样的,内核源码会告诉你 ...

  4. Linux内核之内存管理完全剖析

    linux虚拟内存管理功能 ? 大地址空间:? 进程保护:? 内存映射:? 公平的物理内存分配:? 共享虚拟内存.实现结构剖析   (1)内存映射模块(mmap):负责把磁盘文件的逻辑地址映射到虚拟地 ...

  5. Linux内核笔记——内存管理之slab分配器

    内核版本:linux-2.6.11 内存区和内存对象 伙伴系统是linux用于满足对不同大小块内存分配和释放请求的解决方案,它为slab分配器提供页框分配请求的实现. 如果我们需要请求具有连续物理地址 ...

  6. 深入理解Linux内核-内存管理

    内核如果给自己分配动态内存 动态内存:RAM的某些部分被永久打分配给内核,用来存放内核代码以及静态内核数据结构:剩余的部分被称为动态内存 连续物理内存区管理: 页框管理:1.页大小的选择,通常情况下主 ...

  7. Linux内核之 内存管理

    前面几篇介绍了进程的一些知识,从这篇开始介绍内存.文件.IO等知识,发现更不好写哈哈.但还是有必要记录下自己的所学所思.供后续翻阅,同时写作也是一个巩固的过程. 这些知识以前有文档涉及过,但是角度不同 ...

  8. Linux内核笔记——内存管理之块内存分配

    内核版本:linux-2.6.11 伙伴系统 伙伴系统是linux用于满足对不同大小块物理内存分配和释放请求的解决方案. 内存管理区 linux将物理内存分成三个内存管理区,分别为ZONE_DMA Z ...

  9. Linux内核之内存管理(4)--缺页处理程序

    本文主要解说缺页处理程序,凝视足够具体,不再解释. //以下函数将一页内存页面映射到指定线性地址处,它返回页面的物理地址 //把一物理内存页面映射到线性地址空间指定处或者说把线性地址空间指定地址add ...

随机推荐

  1. R-FCN:Object Detection via Region-based Fully Convolutional Networks

    fast.faster这些网络都可以被roi-pooling层分成两个子网络:1.a shared,'fully convolutional' subnetwork 2.an roi-wise sub ...

  2. Win7 与win10绘制桌面壁纸的区别

    win7使用csrss.exe绘制壁纸. win10使用explorer.exe绘制壁纸.

  3. vue之loader处理静态资源

    webpack 是利用loader 来处理各种资源的,wepback的配置基本上就是为各种资源文件,指定不同类型的loader. 1,处理css 最基本的css 处理loader 是css-loade ...

  4. 给SVN控制的项目添加忽略文件/文件夹

    忽略目录其实有些像建立一个文件夹,但却不放入版本控制.如果不加入版本控制又会在svn status命令中显示出来,很不方便,所以可以设置本文件夹属性,让它既加入版本控制,又忽略其变化 未加入控制的文件 ...

  5. svn 版本库信息修改

    root@hpcstack hpcweb]# svn info 路径: . URL: http://svn.pyindex.com/hpcweb 版本库根: http://svn.pyindex.co ...

  6. 解决WCF接口无法传递object参数的问题

    在某些场合中,我们需要提供以object为参数的方法.不过在WCF中,由于需要序列化与反序列化,因此它要求所有WCF传递的参数类型都是已知的,无法传递object这种未知类型.即使用了KnownTyp ...

  7. eclipse包分层

    方法很简单,如下图所示: 1.点击项目栏窗口的右上角的倒三角 2.选择Pachage Presentation(包呈现) 3.选择Hierarchical(分层)

  8. Mysql对象

    2.简介 2.1 存储过程 2.1.1什么是存储过程 存储过程就是一种类似函数的脚本,可以把多个sql语句组合起来,然后使用 call 存储过程名 来调用,从而执行这些SQL语句. 特点:一次编译,下 ...

  9. ubuntu环境安装docker

    查看已安装的docker apt list docker* 如果已安装,并且需要卸载,则执行以下命令: apt remove docker* 更新apt索引 apt update apt需要支持HTT ...

  10. Memcache 分布式存储 【一致性Hash】crc32

    class memcacheHash { private $_node = array(); private $_nodeData = array(); private $_keyNode = 0; ...