在 Spike/PK

如何解决在 Spike/PK

更新:写下来让我发现我哪里出错了,但不知道为什么。我显然以错误的方式调用 fgets,因为在五次调用后,我到达了地址 0x221000,这是 mmapped 内存所在的位置 - 我正在写入更高的地址 - 但我不知道为什么会发生这种情况。有人能解释一下吗?

这有点复杂,我不知道为什么会出现这种行为:我不知道是我的基础知识有误,还是 Spike/PK 的一个功能。

注意:这里的libc由newlib提供,代码编译为riscv64-unknown-elf。

简短版本 我用 RISC-V 程序集编写的输入代码以前运行顺利,但由于我引入了对 mmap 的系统调用,它在第五次执行时崩溃了。问题是因为我的调用顺序有误,还是可能是 Spike 模拟器和 PK 代理内核的问题?

详细解释

我正在编写一种类似于 Forth 的线程解释语言。它目前针对 Spike 模拟器上的 PK 代理内核,但希望很快可以在“真实”硬件上运行。代码位于 https://github.com/mcmenaminadrian/riscyforth

TIL 实现了一个无限循环来获取输入,依次调用一个例程来获取标准输入的文件指针,然后一个例程来获取输入。

获取标准输入文件指针(存储在堆栈中):

mv a0,zero
la a1,stdinopen
call fdopen
addi sp,sp,-8
sw a0 0(sp)

(stdinopen 在 .data 部分作为 .asciz "r")

然后获取输入 - 从堆栈中弹出...

lw a2,0(sp)
addi sp,8
la a0,INPUT_BUFFER
li a1,BUFFERLEN #0x200
call fgets

INPUT_BUFFER 在 .bss 部分定义为 .common INPUT_BUFFER,BUFFERLEN,8

这一切都很好,直到我添加了在某些内存中映射为 R/W/X 的新代码 - 如果您了解 Forth,您就会知道我需要具有这组不寻常权限的内存,因为我必须允许用户定义新关键字。

现在尝试获取输入在第四次被调用时失败。 (尽管如果我定义了 mmap,问题就会消失。)

这是一个失败的例子:





欢迎来到 RISCYFORTH - 版权所有 Adrian McMenamin 2020 - 2021


RISCYFORTH 是一种紧密基于 FORTH 的线程解释型语言。 目前我们正在 EXECUTE 模式下运行,您输入的任何内容都将 在输入每一行时执行。 RISCYFORTH 根据 GNU 通用公共许可证第 2 版获得许可。 见https://github.com/mcmenaminadrian/riscyforth.git



346 5622 * 重复 好的

重复 好的

重复 好的

。 1945212 好的

z 0000000000000000 ra 0000000000010442 sp 0000003ffffffaf8 gp 000000000001fe30 tp 0000000000000000 t0 000000000009fa60 t1 000000000000000a t2 0000000000000003 s0 0000000000000000 s1 000000000000000 a0 000000000001e530 a1 000000000009fa60 a2 0000000000000200 a3 0000000000000000 a4 0000000000221000 a5 0000000000000001 a6 000000000001ec88 a7 00000000000000d6 s2 00000000000001ff s3 000000000009fa60 s4 000000000001e530 s5 000000000009fa60 s6 0000000000000000 s7 0000000000011b64 s8 0000000000010400 s9 000000000011fc58 sA 000000000009f950 sB 0000000000000000 t3 0000000000000064 t4 0000003ffffffb08 t5 0000000000000054 t6 0000000000000054 pc 0000000000011ca4 va/inst 0000000000000008 sr 8000000200006020 用户加载段错误@ 0x0000000000000008

这里是代码失败的地方:

0000000000011c64 <_fgets_r>:
11c64:       4785                    li      a5,1
11c66:       0ac7de63                bge     a5,a2,11d22 <_fgets_r+0xbe>
11c6a:       7139                    addi    sp,-64
11c6c:       f822                    sd      s0,48(sp)
11c6e:       f04a                    sd      s2,32(sp)
11c70:       ec4e                    sd      s3,24(sp)
11c72:       e852                    sd      s4,16(sp)
11c74:       fc06                    sd      ra,56(sp)
11c76:       f426                    sd      s1,40(sp)
11c78:       e456                    sd      s5,8(sp)
11c7a:       e05a                    sd      s6,0(sp)
11c7c:       8932                    mv      s2,a2
11c7e:       8a2a                    mv      s4,a0
11c80:       89ae                    mv      s3,a1
11c82:       8436                    mv      s0,a3
11c84:       c119                    beqz    a0,11c8a <_fgets_r+0x26>
11c86:       493c                    lw      a5,80(a0)
11c88:       cbc1                    beqz    a5,11d18 <_fgets_r+0xb4>
11c8a:       397d                    addiw   s2,s2,-1
11c8c:       8ace                    mv      s5,s3
11c8e:       a819                    j       11ca4 <_fgets_r+0x40>
11c90:       601c                    ld      a5,0(s0)
11c92:       9f05                    subw    a4,a4,s1
11c94:       9aa6                    add     s5,s5,s1
11c96:       94be                    add     s1,s1,a5
11c98:       c418                    sw      a4,8(s0)
11c9a:       e004                    sd      s1,0(s0)
11c9c:       3cb000ef                jal     ra,12866 <memcpy>
11ca0:       04090f63                beqz    s2,11cfe <_fgets_r+0x9a>
11ca4:       441c                    lw      a5,8(s0)

(_fgets_r 被 fgets 调用)

0000000000011d26 <fgets>:
11d26:       87aa                    mv      a5,a0
11d28:       8401b503                ld      a0,-1984(gp) # 1f670 <_impure_ptr>
11d2c:       86b2                    mv      a3,a2
11d2e:       862e                    mv      a2,a1
11d30:       85be                    mv      a1,a5
11d32:       bf0d                    j       11c64 <_fgets_r>

memcpy 中出了点问题,给我留下了相当于空指针的东西,但我不清楚是什么 - 但我更基本的问题是:我是否掌握了正确调用 fgets 的基本程序?

我相信我以前遇到过和没有遇到过任何问题,但是关于这方面的文档很少而且相去甚远,因此确认会有所帮助,至少会建议我更仔细地查看 mmap 代码。

当然,如果有人能发现任何其他错误,我们将不胜感激。

解决方法

通过反复打开文件,我的代码占用了越来越多的内存,并最终覆盖了通过 mmap 分配的部分内存范围。 我通过将文件指针的值存储在 .bss (inputfileptr) 中并且只打开一次来解决这个问题:

            la t0,inputfileptr
            lw a0,0(t0)
            bne a0,zero,getstdin_getin
            la a1,stdinopen
            call fdopen                
            la t0,inputfileptr
            sw a0,0(t0)
            getstdin_getin:
            PUSH a0                          #store value on stack

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-