ARM结构和MIPS结构的地址空间

2024-09-03 05:48
文章标签 地址 结构 空间 arm mips

本文主要是介绍ARM结构和MIPS结构的地址空间,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ARM结构和MIPS结构的地址空间

无论在哪种体系结构中,地址空间的访问都是CPU运行的基本,CPU的每一条指令的地址,都必须在CPU所能访问的地址空间内,当然这个空间指的是虚拟地址空间。每个CPU所能访问多大的虚拟地址这是和CPU的位数有关的,32位地址总线,最大的虚拟地址就是2的32次方,64位同理。当然在实际的使用中,是不会出现这么大的地址范围的,我们都会根据设备的地址和内存的范围来配置一些窗口来给CPU访问,这就限制了CPU实际所使用的地址空间的大小。这些虚拟地址空间又是如何映射到实际的物理地址(设备地址和内存地址)的,每种结构的映射方法可能不同。不过大同小异,只要掌握一种其他的都不难理解。

简单的讲CPU拿到的地址都是虚拟地址,CPU区访问地址的时候,有的地址是落在了内存上,而有的地址落在了设备的寄存器上,这是怎么实现的呢,主要是通过窗口的配置实现的。内核通过MMU的分段管理和分页管理机制来管理内核的内存映射。

CPU拿到虚拟地址后经过MMU的分段管理得到了线性地址,线性地址又经过分页管理得到了物理地址,逻辑地址基于分段管理或者分页管理中基于基址的偏移值。(分段管理和分页管理这里不做详细介绍)进程使用的虚拟地址,由操作系统协助相关硬件,把它“转换”成真正的物理地址。虚拟地址通过页表(Page Table)映射到物理内存,页表由操作系统维护并被处理器引用。内核空间在页表中拥有较高特权级,因此用户态程序试图访问这些页时会导致一个页错误(page fault)。在Linux中,内核空间是持续存在的,并且在所有进程共享。内核代码和数据总是可寻址,随时准备处理中断和系统调用。与此相反,用户模式地址空间的映射随进程切换的发生而不断变化。

(1)ARM地址空间

32ARM结构地址空间划分:

地址分布如下图所示:

img

如上图所示:

用户空间(0—3G),这段空间映射到物理内存的高端内存

内核空间(3G—4G),这段空间映射到低端内存,这段空间又分为以下四部分,分别为

(a)直接映射区(0—896M):这段虚拟地址空间和低端内存地址存在线性的地址关系即虚拟地址3G+X=物理地址X

(b)动态映射区(896—1016M):这段 空间具体映射到物理内存的什么位置不确定,该区域的地址由内核中的vmalloc来实现 分配,其特点是虚拟地址空间连续,但是物理地址空间不一定连续。vmalloc函数返回的是虚拟地址,但是其映射的物理地址有可能在高端内存,也有可能在低端内存。

(c)永久内存映射区(pkmap1016—1020M):使用kmap函数将高端内存的地址映射到这部分区域,这样就可以通过这个 虚拟地址来访问高端内存的地址。通过这4M的窗口可以重复映射所有的高端内存。

(d)固定映射区:(1020—1024M):这4M的地址是有特定用途的固定地址,这4M的区域映射的物理内存作为ACPI电源管理等寄存器的地址。

64位ARM地址空间的划分:

ARM64架构处理器采用48位物理寻址,最大可以支持256T的地址空间,对于目前的应用来说已经足够了。但是虚拟地址依然采用64,虚拟地址远远大于物理地址。所以在处理器架构设计上,把虚拟地址空间划分为三部分,分别为用户空间,非规范区和内核空间,其中内核空间和用户空间每个部分最大支持256T的访问。

用户空间:(0x0000_0000_0000_0000——0x0000_FFFF_FFFF_FFFF)256T

内核空间:(0xFFFF_0000_0000_0000——0xFFFF_FFFF_FFFF_FFFF)256T

其余部分被称为非规范区域。

内核空间由做了详细的划分,分为以下部分:

(a)Vmalloc区域:0xFFFF_0000_0000_0000——0xFFFF_7BFF_BFFF_0000(126974G)

(b)Vmemmap区域:0xFFFF_7BFF_C000_0000——0xFFFF_7FFF_C000_0000(4096G)

(c)PCI I/O区域:0xFFFF_7FFF_AE00_0000——0xFFFF_7FFF_BE00_0000(16M)

(d)Moudules区域:0xFFFF_7FFF_C000_0000——0xFFFF_8000_0000_0000(64M)

(e)Normal memory线性映射区:0xFFFF_8000_0000_0000——0xFFFF_FFFF_FFFF_FFFF(128T)

如下图所示:

img

(2)MIPS结构的地址空间

32位MIPS地址空间划分(loongson平台):

如下图所示:

img

如上图所示:在mips结构上,32位虚拟地址空间也同样分为两部分,即用户空间和内核空间。只不过哦与ARM结构不同,这里的内核空间是2G大小。

(a)内核空间(0x8000_0000—0xFFFF_FFFF)2G

(b)用户空间(0x0000_0000——0x7FFF_FFFF)2G

内核空间又做了比较详细的划分,分别为kseg0,kseg1,kseg2。

kseg0:(0x8000_0000——0x9FFF_FFFF)512M

这部分虚拟地址被映射到物理内存的0到512M空间内,访问这个窗口的地址是需要cache的,也就意味着CPU来这个窗口取内存的数据的时候,会将数据添加到cache中,下次再取的时候就可以直接从cache中获取。

kseg1:(0xA000_0000——0xBFFF_FFFF)512M

这部分虚拟地址也被映射到物理内存的0到512M空间内,和上面属于重复映射,读取的数据属于内存的同一块内存,只不过这部分地址不经过cache,也就是CPU用这个窗口的指令去内存中取数据的时候是不经过cache的,cache中没有数据的拷贝。每次取都要从内存中读取。

kseg2:(0xC000_0000——0xFFFF_FFFF)1G

这部分虚拟地址被映射到物理内存的0x4000_000到0x7FFF_FFFF这1G的内存地址空间,作为PCI的memory空间。这个映射是TLB完成的。

用户空间虚拟地址0x0000_0000——0x7FFF_FFFF经过TLB被映射到物理内存的0x8000_0000向上的物理内存,这里面需要扣掉

0x8000_0000——0x9000_0000这256M的内存,因为这部分地址被reserved掉了不是用。所以用户空间真正的物理内存是0x9000_0000向上的地址空间。

64位MIPS地址空间划分(loongson平台)

64位地址空间划分的比较复杂,和ARM一样虚拟地址还是采用64位地址,物理地址采用了48位的物理地址,但是48位中高4位为节点号,其余的44位才是每个设备内的物理地址分布。

节点空间分布如下图所示:

img

而每个节点内的地址空间分布如下图所示:

img

如上图所示,内核模式下,虚拟地址被划分为以下五部分:

(a)用户空间:0x0000_0000_0000_0000——0x0001_0000_0000_0000(256T)

(b)地址空洞:如上图中紫色部分,内核模式下访问会出错的地址

(c)可扩展区:0x4000_0000_0000_0000——0x4000_FFFF_FFFF_FFFF和

​ 0xC000_0000_0000_0000——0xC000_00FF_7FFF_FFFF(257T+2G)

(d)xkphys段:0x8000_0000_0000_0000——0xBFFF_FFFF_FFFF_FFFF(4E)

(e)完全复用32位地址的部分:0xFFFF_FFFF_8000_0000——0xFFFF_FFFF_FFFF_FFFF(4G)

如何用64位地址来访问48位的物理地址呢?请看下图:

img

我们在软件代码上,要用64位的虚拟地址来访问设备,只需要牢记,用0x9800_xxxx_xxxx_xxxx和0x9000_xxxx_xxxx_xxxx的地址就可以访问全部48位地址空间,用0x98开头的地址是经过cache的,0x90开头的地址是不经过cache的,其中低32位地址完全复用32位模式下的地址即可。

这篇关于ARM结构和MIPS结构的地址空间的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1132197

相关文章

常用的jdk下载地址

jdk下载地址 安装方式可以看之前的博客: mac安装jdk oracle 版本:https://www.oracle.com/java/technologies/downloads/ Eclipse Temurin版本:https://adoptium.net/zh-CN/temurin/releases/ 阿里版本: github:https://github.com/

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

webapp地址

F:\LSP\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps

Jenkins 插件 地址证书报错问题解决思路

问题提示摘要: SunCertPathBuilderException: unable to find valid certification path to requested target...... 网上很多的解决方式是更新站点的地址,我这里修改了一个日本的地址(清华镜像也好),其实发现是解决不了上述的报错问题的,其实,最终拉去插件的时候,会提示证书的问题,几经周折找到了其中一遍博文

OpenCV结构分析与形状描述符(11)椭圆拟合函数fitEllipse()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C++11 算法描述 围绕一组2D点拟合一个椭圆。 该函数计算出一个椭圆,该椭圆在最小二乘意义上最好地拟合一组2D点。它返回一个内切椭圆的旋转矩形。使用了由[90]描述的第一个算法。开发者应该注意,由于数据点靠近包含的 Mat 元素的边界,返回的椭圆/旋转矩形数据

C语言程序设计(选择结构程序设计)

一、关系运算符和关系表达式 1.1关系运算符及其优先次序 ①<(小于) ②<=(小于或等于) ③>(大于) ④>=(大于或等于 ) ⑤==(等于) ⑥!=(不等于) 说明: 前4个优先级相同,后2个优先级相同,关系运算符的优先级低于算术运算符,关系运算符的优先级高于赋值运算符 1.2关系表达式 用关系运算符将两个表达式(可以是算术表达式或关系表达式,逻辑表达式,赋值表达式,字符

Science|癌症中三级淋巴结构的免疫调节作用与治疗潜力|顶刊精析·24-09-08

小罗碎碎念 Science文献精析 今天精析的这一篇综述,于2022-01-07发表于Science,主要讨论了癌症中的三级淋巴结构(Tertiary Lymphoid Structures, TLS)及其在肿瘤免疫反应中的作用。 作者类型作者姓名单位名称(中文)通讯作者介绍第一作者Ton N. Schumacher荷兰癌症研究所通讯作者之一通讯作者Daniela S. Thomm

【干货分享】基于SSM的体育场管理系统的开题报告(附源码下载地址)

中秋送好礼 中秋佳节将至,祝福大家中秋快乐,阖家幸福。本期免费分享毕业设计作品:《基于SSM的体育场管理系统》。 基于SSM的体育场管理系统的开题报告 一、课题背景与意义 随着全民健身理念的深入人心,体育场已成为广大师生和社区居民进行体育锻炼的重要场所。然而,传统的体育场管理方式存在诸多问题,如资源分配不均、预约流程繁琐、数据统计不准确等,严重影响了体育场的使用效率和用户体验。

【高等代数笔记】线性空间(一到四)

3. 线性空间 令 K n : = { ( a 1 , a 2 , . . . , a n ) ∣ a i ∈ K , i = 1 , 2 , . . . , n } \textbf{K}^{n}:=\{(a_{1},a_{2},...,a_{n})|a_{i}\in\textbf{K},i=1,2,...,n\} Kn:={(a1​,a2​,...,an​)∣ai​∈K,i=1,2,...,n