内存学习(三):物理地址空间

简介: 内存学习(三):物理地址空间

物理地址空间

物理地址是处理器在系统总线上看到的地址。

使用精简指令集(Reduced Instruction Set Computer, RISC)的处理器通常只实现一个物理地址空间,外围设备和物理内存使用统一的物理地址空间。有些处理器架构把分配给外围设备的物理地址区域称为设备内存

处理器通过外围设备控制器的寄存器访问外围设备,寄存器分为控制寄存器、状态寄存器和数据寄存器三大类外围设备的寄存器通常被连续地编址

1-外围设备

处理器对外围设备寄存器的编址方式有两种。

  • (1)I/O映射方式(I/O-mapped):英特尔的x86处理器为外围设备专门实现了一个单独的地址空间,称为“I/O地址空间”或“I/O端口空间”,处理器通过专门的I/O指令(如x86的in和out指令)来访问这一空间中的地址单元。
  • (2)内存映射方式(memory-mapped):使用精简指令集的处理器通常只实现一个物理地址空间,外围设备和物理内存使用统一的物理地址空间,处理器可以像访问一个内存单元那样访问外围设备,不需要提供专门的I/O指令。(ARM)

程序只能通过虚拟地址访问外设寄存器,内核提供了以下函数来把外设寄存器的物理地址映射到虚拟地址空间。

2-外设寄存器映射虚拟地址

  • (1)函数ioremap()把外设寄存器的物理地址映射到内核虚拟地址空间
void * ioremap(unsigned long phys_addr, unsigned long size, unsigned long flags);
  • (2)函数io_remap_pfn_range()把外设寄存器的物理地址映射到进程的用户虚拟地址空间
int io_remap_pfn_range(struct vm_area_struct *vma, unsigned long addr, unsigned long pfn,
unsigned long size, pgprot_t prot);
  • 除了SPARC处理器以外,在其他处理器架构中函数io_remap_pfn_range()和函数remap_pfn_range()等价。函数remap_pfn_range()用于把内存的物理页映射到进程的用户虚拟地址空间。
  • (3)内核提供了函数iounmap(),它用来删除函数ioremap()创建的映射。
void iounmap(void *addr);

3-ARM64架构的实现

ARM64架构定义了两种内存类型。

1、两种内存

  • (1)正常内存(Normal Memory):包括物理内存和只读存储器(ROM)。
  • (2)设备内存(Device Memory):指分配给外围设备寄存器的物理地址区域。

对于正常内存,可以设置共享属性和缓存属性。共享属性用来定义一个位置是否可以被多个核共享,分为不可共享、内部共享和外部共享。

不可共享是指只被处理器的一个核使用内部共享是指一个处理器的所有核共享或者多个处理器共享外部共享是指处理器和其他观察者(比如图形处理单元或DMA控制器)共享。缓存属性用来定义访问时是否通过处理器的缓存。

设备内存的共享属性总是外部共享,缓存属性总是不可缓存(即必须绕过处理器的缓存)。

2、三种属性

ARM64架构根据3种属性把设备内存分为4种类型。

  • (1)Device-nGnRnE,这种类型限制最严格。
  • (2)Device-nGnRE。
  • (3)Device-nGRE。
  • (4)Device-GRE,这种类型限制最少。

3种属性分别如下。

  • (1)聚集属性:G表示聚集(Gathering), nG表示不聚集(non Gathering)。
    聚集属性决定对内存区域的多个访问是否可以被合并为一个总线事务
    如果地址被标记为“不聚集”,那么必须按照程序里面的地址和长度访问。
    如果地址被标记为“聚集”,处理器可以把两个“写一个字节”的访问合并成一个“写两个字节”的访问,可以把对相同内存位置的多个访问合并,例如读相同位置两次,处理器只需要读一次,为两条指令返回相同的结果。
  • (2)重排序属性:R表示重排序(Re-ordering), nR表示不重排序(non Re-ordering)。
    这个属性决定对相同设备的多个访问是否可以重新排序。如果地址被标记为“不重排序”,那么对同一个块的访问总是按照程序顺序执行。
  • (3)早期写确认属性:E表示早期写确认(Early Write Acknowledgement), nE表示不执行早期写确认(non Early Write Acknowledgement)。
    这个属性决定是否允许处理器和从属设备之间的中间写缓冲区发送“写完成”确认。如果地址被标记为“不执行早期写确认”,那么必须由外围设备发送“写完成”确认。如果地址被标记为“早期写确认”,那么允许写缓冲区在外围设备收到数据之前发送“写完成”确认。

3、物理地址位宽

目前ARM64处理器支持的最大物理地址宽度是48位,如果实现了ARMv8.2标准的大物理地址(Large Physical Address,LPA)支持,并且页长度是64KB,那么物理地址的最大宽度是52位。

可以使用寄存器TCR_EL1(Translation Control Register for Exception Level 1,异常级别1的转换控制寄存器)的字段IPS(Intermediate Physical Address Size,中间物理地址长度)控制物理地址的宽度,IPS字段的长度是3位,IPS字段的值和物理地址宽度的对应关系如表3.3所示。

目录
相关文章
|
3月前
|
存储 开发框架 .NET
"揭秘.NET内存奥秘:从CIL深处窥探值类型与引用类型的生死较量,一场关于速度与空间的激情大戏!"
【8月更文挑战第16天】在.NET框架中,通过CIL(公共中间语言)可以深入了解值类型与引用类型的内存分配机制。值类型如`int`和`double`直接在方法调用堆栈上分配,访问迅速,生命周期随栈帧销毁而结束。引用类型如`string`在托管堆上分配,堆栈上仅存储引用,CLR负责垃圾回收,确保高效且自动化的内存管理。
56 6
|
1月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
65 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
21天前
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
194 2
|
1月前
|
存储 Java
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
这篇文章详细地介绍了Java对象的创建过程、内存布局、对象头的MarkWord、对象的定位方式以及对象的分配策略,并深入探讨了happens-before原则以确保多线程环境下的正确同步。
53 0
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
|
1月前
|
C++
析构造函数就是为了释放内存,就是在局部指针消失前释放内存,拷贝构造函数就是以构造函数为模块,在堆里面新开一块,同一个变量在堆里面的地址
本文讨论了C++中构造函数和析构函数的作用,特别是它们在管理动态内存分配和释放中的重要性,以及如何正确地实现拷贝构造函数以避免内存泄漏。
37 2
|
1月前
|
存储 安全 NoSQL
driftingblues9 - 溢出ASLR(内存地址随机化机制)
driftingblues9 - 溢出ASLR(内存地址随机化机制)
36 1
|
2月前
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
130 5
|
3月前
|
存储 JavaScript 前端开发
学习JavaScript 内存机制
【8月更文挑战第23天】学习JavaScript 内存机制
34 3
|
3月前
|
算法 安全 UED
探索操作系统的内核空间:虚拟内存管理
【7月更文挑战第50天】 在现代操作系统中,虚拟内存管理是核心功能之一,它允许操作系统高效地使用物理内存,并为应用程序提供独立的地址空间。本文将深入探讨操作系统虚拟内存管理的机制,包括分页、分段以及内存交换等关键技术,并分析它们如何共同作用以实现内存的有效管理和保护。通过理解这些原理,读者可以更好地把握操作系统的内部工作原理及其对应用程序性能的影响。