浅析linux内核内存管理之PAE

早期Intel处理器从80386到Pentium使用32位物理地址,理论上,这样可以访问4GB的RAM。然而,大型服务器需要大于4GB的RAM来同时运行数以千计的进程,近几年来这对Intel造成了压力,所以必须扩展32位80x86所支持的RAM容量。

Intel通过在它的处理器上把管脚数从32增加到36已经满足了这些需求,可以寻址64GB。同时引入了一种新的分页机制PAE(Physical Address Extension,物理地址扩展)把32位线性地址转换为36位物理地址才能使用所增加的物理内存,通过设置CR4的第5位来开启对PAE的支持。引入PAE就是为了访问大于4GB的RAM,线性地址仍然是32位,而物理地址是36位。

64GB的RAM被分为2^24个页框,页表项的物理地址字段从20位扩展到了24位。PAE表项必须包含12个标志位和24个物理地址位,总数之和为36,页表项大小从32位变为64位。这样原来一个页框有1024个entry,现在有512个entry。开启PAE的80x86 32位使用的是三级页表,第一级是新引入的PDPT(页目录指针表,相当于PGD了),第二级是PMD,第三级是PTE。PDPT只有4个entry,每个对应1GB RAM,每个entry 是64位。CR3中有27位作为PDPT的起始地址。

在开启PAE前,CR3中用20来存储页目录的起始地址;开启PAE后,用27位来存储page directory pointer table的起始地址。

下边分两种情况来讨论,一个是PS=0,一个是PS=1:

当CR4的第5位被置位(开启PAE),第4位被置位(开启PSE)

线性地址31~30,用来指向一个PDPT的entry

线性地址29~21,用来指向一个pmd的entry

线性地址20~0,为4MB大页中的offset

当CR4的第5位被置位(开启PAE),第4位被清除(关闭PSE)

线性地址31~30,用来指向一个PDPT的entry

线性地址29~21,用来指向一个pmd的entry

线性地址20~12,用来指向一个pte

线性地址11~0,为4KB页中的offset

如何访问64GB?

从上边的三级分页可以看到2^2*2^9*2^9*2^11=4GB,仍然访问的是4GB。访问64GB方法如下:

修改CR3中的值使其指向不同的PDPT,这样就指向不同的4GB

修改PDP entry中的值,使其指向不同的PMD表,这样可以指向不同的1GB

但是实际上是不能访问这么大的内存的,实际可用的内存被限制在16GB,因为如果有64GB,那么每个struct page结构需要32字节,总共512MB,这样ZONE_NORMAL的内核地址空间就被大量占用,这样是不允许的。

pae扩展内存 linux,浅析linux内核内存管理之PAE相关推荐

  1. Linux教程:内核怎样管理你的内存

    在分析了进程的虚拟地址布局,我们转向内核以及他管理用户内存的机制.下图是gonzo的例子: Linux进程在内核中是由task_struct进程描述符实现的,task_struct的mm字段指向内存描 ...

  2. linux查看共享内存max,浅析Linux的共享内存与tmpfs文件系统

    浅析Linux的共享内存与tmpfs文件系统 前言 共享内存主要用于进程间通信,Linux有两种共享内存(Shared Memory)机制: (1)** System V shared memory( ...

  3. mtd分区创建linux,浅析linux下mtd设备onenand存储器的分区和节点创建流程及yaffs2文件系统挂载...

    浅析linux下mtd设备onenand存储器的分区和节点创建流程及yaffs2文件系统挂载 在arch/arm/mach-pxa/luther.c这个产品平台文件中,即: MACHINE_START ...

  4. linux 增加 ip_conntrack_max 造成 内核内存问题

    1.由ip_conntrack引出的Linux内存映射 有很多文章在讨论关于ip_conntrack表爆满之后丢弃数据包的问题,对此研究深入一些的知道Linux有个内核参数ip_conntrack_m ...

  5. 【Linux】Linux的内核空间(低端内存、高端内存)

    内核也是程序,也应该具有自己的虚存空间,但是作为一种为用户程序服务的程序,内核空间有它自己的特点. 内核空间与用户空间的关系 在一个32位系统中,一个程序的虚拟空间最大可以是4GB,那么最直接的做法就 ...

  6. pae扩展内存 linux,Linux内核-内存管理-PAE(物理地址扩展)

    Intel 通过在处理器上把管脚数从 32 增加到 36,以提高处理器的寻址能力,使其达到 2^36=64GB,然而线性地址的位数仍然是 32 位,为此,需引入一种新的分页机制.从pentium pr ...

  7. Linux内核如何管理内存

    在学习了进程的 虚拟地址布局 之后,让我们回到内核,来学习它管理用户内存的机制.这里再次使用 Gonzo: Linux kernel mm_struct Linux 进程在内核中是作为进程描述符 ta ...

  8. linux内核函数kmalloc,Linux_Linux平台上几个常见内核内存分配函数,* kmallocPrototype:#incl - phpStudy...

    Linux平台上几个常见内核内存分配函数 * kmalloc Prototype: #include void *kmalloc(size_t size, int flags); Kmalloc分配一 ...

  9. linux加大ram 内核需要,Linux 5.1内核发布:io_uring接口+支持持久性内存用作RAM

    拼 命 加 载 中 ... Linus Torvalds今天发布了Linux Kernel 5.1内核,这是一个功能强大的内核分支,它带来了许多重要的新功能,包括但不限于:改进了对Intel Fast ...

最新文章

  1. atitit.Sealink2000国际海运信息管理系统
  2. IT人员健康信号之鼻炎养护
  3. Nginx网站服务器
  4. linux如何把postgresql添加到环境变量_如何搞清楚PostgreSQL的环境变量 ?
  5. Python 编码规范 PEP 8
  6. Java进阶之光!mysql安装包安装教程
  7. MAC下 Intellij IDEA GO语言插件安装及简单案例
  8. weblogic创建多个域 及域的配置方法 war包部署及访问测试
  9. 如何开发一款可以删除个人信息的社交软件?小扎做到了!
  10. 算法 之 栈的简单讲解
  11. 电子书下载:[FBI教你破解身体语言].(美)乔·纳瓦罗.(美)马文·卡尔林斯.文字版...
  12. aforge 学习-命名空间中文理解
  13. Ros双线主辅同时映射一台服务器
  14. 【火灾疏散建模】基于MATLAB的火灾人员疏散建模编程和仿真分析
  15. RTKLIB(二)——RTKPOST
  16. 大数据开发超高频面试题!大厂面试必看!包含Hadoop、zookeeper、Hive、flume、kafka、Hbase、flink、spark、数仓等
  17. 一个程序员的奋斗经历
  18. Qt 并行运算高级API QtConcurrent
  19. 微信、支付宝支付绑定多个商户号
  20. html查找器如何卸载,租号器要求卸载影子系统-怎么完全删除影子系统

热门文章

  1. qt弹簧教程_弹簧启动执行器教程
  2. javafx查找子节点_JavaFX技巧29:使布局忽略不可见的节点
  3. java ee规范_测试Java EE 8规范
  4. mac 大写锁定延迟_延迟分析中的案例研究:锁定与同步
  5. junit单元测试断言_简而言之,JUnit:单元测试断言
  6. java 挥发注解_Java的挥发性修饰符
  7. 从Commons CLI迁移到picocli
  8. rest spring_Spring REST:异常处理卷。 1个
  9. jpa 事务嵌套事务_JPA 2 | EntityManagers,事务及其周围的一切
  10. 杰克逊JSON解析错误-UnrecognizedPropertyException:无法识别的字段,未标记为可忽略[已解决]...