热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

64位Linux下的地址映射

IA32-e模式下地址映射之前写过,32位Linux虚拟地址映射,讨论了在CPU80386下的虚拟地址映射。看过博主的《Linux内核在x86_64CPU中地址映射》,对32位和
IA32-e模式下地址映射

之前写过,32位Linux虚拟地址映射,讨论了在CPU 80386下的虚拟地址映射。

看过博主的《Linux内核在x86_64 CPU中地址映射》,对32位和64位下地址映射的区别做了一些总结。


---------------------------------------------------------------------------

1. x86_64CPU中逻辑地址(段式)映射

    x86_64段式地址过程和x86一致,即各段起始地址都是0,区别在于段大小不再是4G

    在 x86-64 下,处理器默认 CS, DS, ES, SS的段基址为 0,所以下面就不讨论逻辑地址到线性地址的转换了,因为基址为0,经过运算后线性地址和逻辑地址是一样的。

    分页过程会将 48-bit 的线性地址转换为 52-bit 的物理地址, 可以看出虽然是 64bit 的操作系统但在处理器层面并没有提供 2^64 大小的访问范围。48-bit 线性地址可以有以下 3 种映射分配


2.x86_64CPU中线性地址(页式)映射



具体分析如下:

(1)线性地址是48位

    x86_64线性地址不是64bit,物理地址也不是64位,Intel当前CPU最高物理地址是52bit,但实际支持的物理内存地址总线宽度是40bit。


        x86CPU仅支持64位虚拟地址中的48位。对于用户模式地址,64位中的虚拟地址高16位的地址总被设置为0x0;对于内核模式地址,总被设置为0xF.

为什么64位虚拟地址只能使用48位呢?

        由于x86_64处理器硬件限制。x86_64处理器地址线只有48条,故而导致硬件要求传入的地址48位到63位地址必须相同。最初AMD规定,只有虚拟地址的最低48位才会在地址转换(页表查询)时被使用。48位地址空间在AMD推出64位时是非常大的,即使对于现在来说也基本够用。48位的虚拟地址转换成物理地址需要4级页表。

(2)页面映射分为4级

    4K页面下, 48位线性地址分为5段,位宽度分别是9、9、9、12。映射的方法为页表查找。

    即可管理的地址空间为2^48 = 256T。而在32地址模式下,该值仅为2^32 = 4G。

    另外64位地址时支持的物理内存最大为64T而在32位地址时最大支持的物理内存为64G(开启PAE选项)。

(3)CR3寄存器保存最高一级表的起始物理地址

(4)每个表项的大小为8字节


长模式(IA32-e模式)

    x86-64兼容CPU可以运行在多种模式之下,除了熟悉的实模式,保护模式,还有长模式等,在长模式下,处理器完全执行64位指令,使用64位地址空间(物理内存的寻址能力却没有被完全扩展到64位,因为目前的众多CPU在其寿命期限之内都没有机会见识到如此巨大的内存)和64操作数。因此,为了降低制造成本,目前的CPU被限制在略少于64位寻址。

  • 长模式下cpu屏蔽了段机制,简化了应用程序的内存管理,提高了单个寄存器的运算位数,并引入了一系列的新指令集和前缀(比如rex),使得合理优化过的64位程序比32位程序效率要高一些。
  • 长模式下引入了rip相对寻址机制,使得“位置无关代码”的实现更容易而且更快。


注:x86_64下HIGHMEM是没有定义的,用户空间默认从高端内存分配所需内存,虽然x86_64没有高端内存也没有关系,内核设计了适当的回退机制,用户空间一样可以在低端内存分配内存,只不过需要二次映射,浪费一点效率。

而在32位下虚拟地址空间的内核空间中,存在ZONE_HIGH(高端内存),用于Linux在32位系统下映射高于1G的内存,这块区域一般为128M大小。


-----------------------------------------------------------------------------------------------

参考资料:

X86/X64处理器体系结构及寻址模式

Linux内核在x86_64 CPU中地址映射




推荐阅读
  • 深入探讨CPU虚拟化与KVM内存管理
    本文详细介绍了现代服务器架构中的CPU虚拟化技术,包括SMP、NUMA和MPP三种多处理器结构,并深入探讨了KVM的内存虚拟化机制。通过对比不同架构的特点和应用场景,帮助读者理解如何选择最适合的架构以优化性能。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 本文详细介绍了如何在Ubuntu系统中下载适用于Intel处理器的64位版本,涵盖了不同Linux发行版对64位架构的不同命名方式,并提供了具体的下载链接和步骤。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • Docker的安全基准
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • Linux设备驱动程序:异步时间操作与调度机制
    本文介绍了Linux内核中的几种异步延迟操作方法,包括内核定时器、tasklet机制和工作队列。这些机制允许在未来的某个时间点执行任务,而无需阻塞当前线程,从而提高系统的响应性和效率。 ... [详细]
  • Codeforces Round #566 (Div. 2) A~F个人题解
    Dashboard-CodeforcesRound#566(Div.2)-CodeforcesA.FillingShapes题意:给你一个的表格,你 ... [详细]
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
  • MySQL DateTime 类型数据处理及.0 尾数去除方法
    本文介绍如何在 MySQL 中处理 DateTime 类型的数据,并解决获取数据时出现的.0尾数问题。同时,探讨了不同场景下的解决方案,确保数据格式的一致性和准确性。 ... [详细]
  • 深入解析TCP/IP五层协议
    本文详细介绍了TCP/IP五层协议模型,包括物理层、数据链路层、网络层、传输层和应用层。每层的功能及其相互关系将被逐一解释,帮助读者理解互联网通信的原理。此外,还特别讨论了UDP和TCP协议的特点以及三次握手、四次挥手的过程。 ... [详细]
  • 探索电路与系统的起源与发展
    本文回顾了电路与系统的发展历程,从电的早期发现到现代电子器件的应用。文章不仅涵盖了基础理论和关键发明,还探讨了这一学科对计算机、人工智能及物联网等领域的深远影响。 ... [详细]
  • 2018年3月31日,CSDN、火星财经联合中关村区块链产业联盟等机构举办的2018区块链技术及应用峰会(BTA)核心分会场圆满举行。多位业内顶尖专家深入探讨了区块链的核心技术原理及其在实际业务中的应用。 ... [详细]
  • 本文详细介绍了C语言中的指针,包括其基本概念、应用场景以及使用时的优缺点。同时,通过实例解析了指针在内存管理、数组操作、函数调用等方面的具体应用,并探讨了指针的安全性问题。 ... [详细]
author-avatar
郭爷们1986_488
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有