RISC-V基础之内存分布与映射

news2024/11/23 16:57:38

内存映射是指将地址空间划分为不同的部分或段,每个段有不同的用途和属性。这段话介绍了五个段:文本段、全局数据段、动态数据段、异常处理器段和操作系统(OS)段。下面是对每个段的简要说明:

  • 文本段:存放程序的代码和常量数据,如字符串和数组。文本段是只读的,不能被修改。用户可以自己定义文本段的位置和大小。
  • 全局数据段:全局数据段存放全局变量,即可以被程序中所有函数访问的变量。全局变量在程序开始执行之前就在内存中分配好了,通常使用全局指针寄存器gp(寄存器x3)来访问,它指向全局数据段的中间位置。在这个例子中,gp是0x10000800。使用12位有符号偏移量,程序员可以使用gp来访问整个全局数据段。
  • 动态数据段:动态数据段包括栈和堆。这个段中的数据在程序启动时是不确定的,而是在程序运行过程中动态分配和释放的。操作系统在程序启动时设置栈指针(sp,寄存器x2)指向栈的顶部,在这个例子中是0xBFFFFFF0。栈通常向下增长,如图所示。栈包括一些临时存储和局部变量,如数组,它们不能放在寄存器中。函数还使用栈来保存和恢复寄存器。每个栈帧按照后进先出的顺序访问。堆存放程序运行时分配的数据。像宿舍地板上的一堆衣服一样,堆中的数据可以按任意顺序使用和丢弃。堆通常从动态数据段的底部向上增长。如果栈和堆相互碰撞了,程序的数据就会被破坏。内存分配器保证这种情况不会发生,如果没有足够的空间来分配更多的动态数据,它会返回一个内存不足的错误。
  • 异常处理器、操作系统和I/O段:例子中RISC-V内存映射的最低部分是保留给异常处理器和启动时运行的引导代码的。最高部分是保留给操作系统和内存映射I/O的。内存映射I/O是指将外部设备(如键盘、显示器等)的寄存器映射到内存地址空间中,以便通过读写内存来控制设备。异常处理器、操作系统和I/O段通常是受保护的,只能在特权模式下访问。

RISC-V不定义一个特定的内存映射,而是由用户自己决定各个段的位置和大小。这样可以提供灵活性,特别是对于一些较小的系统,如手持设备,它们可能只使用了部分内存范围,并且只有部分物理内存。

RISC-V要求sp保持16字节对齐,以便与RISC-V基础指令集RV128I兼容,它可以操作128位(即16字节)的数据。因此,sp每次减少16的倍数来为栈腾出空间,即使需要更少的栈空间也是如此。

RISC-V要求sp保持16字节对齐,这意味着sp的值必须是16的倍数。这样做的原因是为了与RISC-V基础指令集RV128I兼容,它可以操作128位(即16字节)的数据。如果sp不是16字节对齐的,那么RV128I指令就不能正确地访问栈上的数据,可能会导致数据错误或异常。因此,为了保证兼容性和正确性,RISC-V规定了sp的对齐要求。

因此,sp每次减少16的倍数来为栈腾出空间,即使需要更少的栈空间也是如此。例如,如果一个函数需要在栈上分配8个字节的空间,那么sp就要减少16个字节,而不是8个字节。这样做会浪费一些内存空间,但是可以保证sp始终是16字节对齐的。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/845829.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

cookie、sessionStorage、localStorage的使用介绍,通过localStorage保存当前菜单、已打开菜单

这篇文章主要介绍前端常用的几种存储技术cookie、storage(sessionStorage、localStorage)的简单介绍和使用方法。 一、cookie 1、在JavaScript中使用cookie 使用原生的cookie // 设置cookie document.cookie "nameTom;age18;";// 获取coo…

使用Python和wxPython构建中文OCR截图工具

引言: 随着数字化时代的到来,我们经常需要从图像中提取文本信息。而在处理中文文本时,OCR(Optical Character Recognition,光学字符识别)技术发挥着重要作用。本文将介绍如何使用Python编程语言和wxPython图…

powershell几句话设置环境变量

设置环境变量比较繁琐,现在用这段话,在powershell中就可以轻松完成。 $existingPath [Environment]::GetEnvironmentVariable("Path", "Machine") $newPath "C:\Your\Path\Here"if ($existingPath -split ";"…

ORACLE常用基础

. 1.oracle开机启动流程 su - oracle lsnrctl start lsnrctl status sqlplus / as sysdba startup 2、如何查看数据库版本 select * from v$version; 3.如何查看用户从那个设备连接的数据库 SELECT DISTINCT machine , terminal FROM V$SESSION; 4.如何查看表结构 selec…

【严重】Apache Airflow Run Task 权限绕过漏洞

漏洞描述 Airflow 是一个开源的工作流自动化平台,它允许用户定义、调度和监视工作流任务的执行。Run Task 是通过 Airflow 的 Web 界面或命令行工具。 在 Airflow 受影响版本中,Run Task 功能允许用户手动触发执行特定的任务,而不受正常的任…

CASAIM与迈普医学合作,基于CT数据三维重建和设计,在医疗辅具研究开发中实现高精度三维建模和偏差比对

近期,CASAIM与广州迈普再生医学科技股份有限公司(简称:迈普医学)合作,基于CT数据三维重建和设计,在医疗辅具研究开发中实现高精度三维建模和偏差比对,实现与缺损区域的精确匹配。 迈普医学&…

全新二开美化版UI好看的社区源码下载/反编译版

2023全新二开美化版UI精美的社区源码下载/反编译版 之前我分享过Rule原版,相信大家已经有很多人搭建好了。这次我要分享的是RuleAPP的二开美化版(请尊重每个作者的版权),这个版本没有加密,可以进行反编译,…

C#实现SqlServer数据库同步

实现效果: 设计思路: 1. 开启数据库及表的cdc,定时查询cdc表数据,封装sql语句(通过执行类型,主键;修改类型的cdc数据只取最后更新的记录),添加到离线数据表; 2. 线程定时查询离线数据表&#xf…

访问器模式(C++)

定义 表示一个作用于某对象结构中的各元素的操作。使得可以在不改变(稳定)各元素的类的前提下定义(扩展)作用于这些元素的新操作(变化)。 应用场景 在软件构建过程中,由于需求的改变,某些类层次结构中常常需要增加新的行为(方法),如果直接…

分布式理论之CAP与BASE

分布式理论之CAP与BASE 一、什么是CAP1. 一致性(Consistency):2. 可用性(Availability):3. 分区容错性(Partition tolerance):4. CAP小结: 二、AP&CP如何…

通向架构师的道路之weblogic与apache的整合与调优

一、BEAWeblogic的历史 BEA WebLogic是用于开发、集成、部署和管理大型分布式Web应用、 网络应用和数据库应 用的Java应用服务器。将Java的动态功能和Java Enterprise标准的安全性引入大型网络应用的 开发、集成、部署和管理之中。 BEA WebLogic Server拥有处理关键Web应…

气味传感器

本文将通过图文及视频的形式为各位介绍太阳诱电因应市场需求而开发的气味传感器产品。高浓度端采用QCM型,较低浓度端采用MEMS半导体型。另外还准备有FBAR型转换器。 太阳诱电为实现高灵敏度感应而开发了3款转换器。  高浓度端采用QCM型,较低浓度端采用…

python excel 操作

excel文件内容如下: 一、xlrd 读Excel 操作 1、打开Excel文件读取数据 filexlrd.open_workbook(filename)#文件名以及路径,如果路径或者文件名有中文给前面加一个 r 2、常用函数 (1)获取一个sheet工作表 table file.sheets(…

LeetCode 热题 100 JavaScript--234. 回文链表

function ListNode(val, next) {this.val val undefined ? 0 : val;this.next next undefined ? null : next; }var isPalindrome function (head) {if (!head || !head.next) {return true; }// 使用快慢指针法找到链表的中间节点let slow head;let fast head;while …

在win10上安装Docker desktop,并在docker中安装mysql

操作步骤: 安装docker 去 官网 下载安装软件;选择windows 2. 依次点击安装; 安装完成后无需登录,直接启动即可; 如果有提示需要更新wsl,执行以下命令更新: wsl --update wsl --status 查看状态 验证一下 适用命令:docker run hello-world 设置国内镜像 docker安装mysql…

Dockerfile部署golang,docker-compose

使用go镜像打包,运行在容器内 redis和mysql用外部的 项目目录结构 w1go项目: Dockerfile # 这种方式是docker项目加上 本地的mysql和redis环境 # go打包的容器 FROM golang:alpine AS builder# 为我们镜像设置一些必要的环境变量 ENV GO111MODULEon …

Apollo配置覆盖引发懒加载配置失效问题

背景 出现问题版本过低,最新版本可能已经做出调整,此文章只是记录 apollo-client.version 1.2.0 因为本地开发,想用测试环境的apollo,所以经常会出现本地覆盖测试环境的配置;一般我会新建一个local.properties来覆盖 …

Debian安装和使用Elasticsearch 8.9

命令行通过 .deb 包安装 Elasticsearch 创建一个新用户 adduser elastic --> rust # 添加sudo权限 # https://phoenixnap.com/kb/how-to-create-sudo-user-on-ubuntu usermod -aG sudo elastic groups elastic下载Elasticsearch v8.9.0 Debian 包 https://www.elastic.co/…

GATK BaseRecalibratorSpark 过程中因Too many open files终止

Error: GATK BaseRecalibratorSpark 过程中因Too many open files终止 执行命令: nohup time ./gatk --java-options "-Xmx16G" BaseRecalibratorSpark -R ../../alignment/hg38/hg38.fa -I ../../alignment/bam/P368T.sorted.markdup.bam …

【C++】C++文件操作-文本文件/二进制文件

0.前言 一、文本文件 1.写文件 代码 #include <iostream> using namespace std; #include <fstream> //头文件包含//************************************** //文本文件 写文件 void test01() {//1.包含文件 fstream//2.创建流对象ofstream ofs;//3.指导打开方式…