LiNUX内存原理的一点理解

原创 2006年06月07日 15:22:00

最近看了一点关于内核的书籍,有些收获,现在拿出来与大家分享,不当之处请指教

模式转换

linux在引导的过程的前半段运行于实时模式,程序运行使用的是物理地址,如0X9000,指的就是物理地址的
0X9000。后半段转入保护模式使用的是虚拟地址。虚拟地址转化的开关在CR1寄存器,虚拟地址转化的基础是程序建立了页目录,页表机制。就是虚拟地址通过页目录,页表映射到相应的物理地址。

虚拟地址
   32位机的寻址空间(虚拟地址)为4G,其中0-3G为用户空间,3G-4G为系统空间。在用户看来,我们的程序就像是运行在4G空间的内存上。而且各个进程可以使用相同的虚拟地址,而不会互相干扰。其实就是操作系统在玩的一个把戏,偷梁换柱,例如程序甲用的是 0x1000,程序乙用的也是 0x1000
而操作系统可能把甲用的0x1000指向了物理内存的0X01000000,而将乙用的0x1000指向了物理内存的0X02000000。

转换原理
   Linux采用的是三级映射机制即:页目录,中间页表,页表。而i386支持是两级,所以中间页表
不起作用,视为透明。虚拟地址转换为实际的物理地址是由硬件MMU自动完成的,具体的过程是,由寄存器CR3取得页目录的地址,按照虚拟地址的22-31位数值(作为位移)取得页表的地址,按照页表地址加上虚拟地址的12-21位(作为位移)取得页表的数值(物理页地址),按照物理页地址加上虚拟地址0-11位数值(作为位移)取得相应的物理地址,完成转换。

虚拟地址的状态
   每一个进程都有一套自己的页表,页表描述的空间为0-4G。系统空间也有自己的页表,描述空间
为0-4G,但是0-3G全部初始化为0,只在3G-4G进行了映射,采用的方式为线形映射,如0xC0009000指的就是物理内存的0x00009000,xC0029000指的就是物理内存的0x00029000。

   进程在运行过程中不论在系统空间运行还是在用户空间运行均使用自己的页表,而所有的进程的页表 3G-4G空间均为相同映射。

   在进程切换的时候CR3会由下一个进程的页目录地址进驻。从而当切换为下一个因为而所有的进程的页表 3G-4G空间均为相同映射,所以不论CR3怎样切换,那么内核都能正常运行。

虚拟内存的管理

   为了对虚拟内存进行管理,每个进程有一个mm_struct结构和一些vm_area_struct,前者是对一个
进程的虚拟内存的一个总体描述,后者是对进程的各个内存区域的描述。

由于LINUX采用的是分页制,而对于CPU提供的分段制,可以理解系统进行了直接的穿透

以上参考了 毛德操 胡希明的《Linux内核源代码情景分析》,真是一本好书

arm-linux内存管理学习笔记(1)-内存页表的硬件原理

学习内核的内存管理如果脱离了MMU的硬件原理,只去学习其软件逻辑,真的很难懂。说到底,软件代码的逻辑是为硬件服务,只是为了充分发挥硬件的各项功能,因此学习linux的内存管理机制,首先要学习下该处理器...
  • skyflying2012
  • skyflying2012
  • 2016年04月05日 16:40
  • 3729

linux内存映射mmap原理分析

一直都对内存映射文件这个概念很模糊,不知道它和虚拟内存有什么区别,而且映射这个词也很让人迷茫,今天终于搞清楚了。。。下面,我先解释一下我对映射这个词的理解,再区分一下几个容易混淆的概念,之后,什么是内...
  • joejames
  • joejames
  • 2014年07月19日 11:07
  • 8318

伙伴系统之伙伴系统概述--Linux内存管理(十五)

日期 内核版本 架构 作者 GitHub CSDN 2016-09-02 Linux-4.7 X86 & arm gatieme LinuxDeviceDrive...
  • gatieme
  • gatieme
  • 2016年09月03日 00:13
  • 4716

linux内存管理原理深入理解段式页式

前一段时间看了《深入理解Linux内核》对其中的内存管理部分花了不少时间,但是还是有很多问题不是很清楚,最近又花了一些时间复习了一下,在这里记录下自己的理解和对Linux中内存管理的一些看法和认识。 ...
  • h674174380
  • h674174380
  • 2017年07月20日 08:52
  • 494

对于Linux内核tty设备的一点理解

  • 2014年06月06日 09:45
  • 842KB
  • 下载

关于#pragma pack()和内存分配的一点理解

前段时间在做面试题的时候碰到这样的一个题目,根据我的大概印象应该是这个样子的 #pragma pack(pop) struct A{     char a;     int b;     float...
  • u010286750
  • u010286750
  • 2015年03月31日 16:39
  • 841

我对C++11内存模型的一点理解(附面经)

霎时间又到周末,这两天广州天气比较糟糕,一下子雷暴雨一下子又出太阳,夏天到了么- -大学城打雷的时候完全不敢走在路上..感觉随时有被闪电劈中的危险...     周四周五的时候过去腾讯校招帮忙了,负...
  • gaa_ra
  • gaa_ra
  • 2012年04月15日 12:35
  • 3889

对iOS开发中内存管理的一点总结与理解

做iOS开发也已经有两年的时间,觉得有必要沉下心去整理一些东西了,特别是一些基础的东西,虽然现在有ARC这种东西,但是我一直也没有去用过,个人觉得对内存操作的理解是衡量一个程序员成熟与否的一个标准。好...
  • ios_che
  • ios_che
  • 2013年11月05日 17:31
  • 6994

Java内存的一点理解, 静态方法和实例方法的区别及使用场景

注意:变量指基本数据类型非对象,局部变量不能被静态修饰 1、(静态)成员变量存放在data segment区(数据区),字符串常量也存放在该区 2、非静态变量,new出来的对象存放在堆内存,所有局...
  • fancky58
  • fancky58
  • 2017年08月06日 13:40
  • 604

cocos3.1内存管理的一点理解

//CCRef. #include "base/CCPlatformMacros.h" #include "base/ccConfig.h" #define CC_USE_MEM_LEAK_...
  • yangzhengqui
  • yangzhengqui
  • 2014年10月08日 19:48
  • 803
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LiNUX内存原理的一点理解
举报原因:
原因补充:

(最多只允许输入30个字)