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内核源代码情景分析》,真是一本好书

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

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

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

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

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

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

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

//CCRef. #include "base/CCPlatformMacros.h" #include "base/ccConfig.h" #define CC_USE_MEM_LEAK_...

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

前段时间在做面试题的时候碰到这样的一个题目,根据我的大概印象应该是这个样子的 #pragma pack(pop) struct A{     char a;     int b;     float...

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

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

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

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

关于SDWebImage内存缓存的一点简单理解-King

现在关于SDWebImage的理解暂时不是很深刻,我感觉也就局限在能够简单的使用,不过在学习使用的过程中,感觉对SDWebImage的内存缓存的原理有了一点初级的理解. 关于内存缓存,我的理解就是,从...

学一点 mysql 双机异地热备份—-快速理解mysql主从,主主备份原理及实践

双机热备的概念简单说一下,就是要保持两个数据库的状态自动同步。对任何一个据库的操作都自动应用到另外一个数据库,始终保持两个数据库数据一致。 这样做的好处多。 1. 可以做灾备,其中一个坏了可以切换到另...

学一点 mysql 双机异地热备份----快速理解mysql主从,主主备份原理及实践

双机热备的概念简单说一下,就是要保持两个数据库的状态自动同步。对任何一个数据库的操作都自动应用到另外一个数据库,始终保持两个数据库数据一致。 这样做的好处多。 1. 可以做灾备,其中一个坏了可以切换到...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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