如何在 ARM 架构上从 RAM 运行代码

2024-04-04

我正在对 ARM Cortex-R4 进行编程,并且有一些二进制文件,我想从 TCRAM 执行它们,只是为了看看性能的提升是否足够好。

我知道我必须编写一个函数来将二进制文件复制到 RAM(这可以通过链接器脚本来完成,并且知道二进制文件的大小)。但他们要怎么跑呢?

想象一下:第一个二进制文件有 func1()、func2()、func3() 和 func4()。我将整个模块复制到 TCRAM,然后如何调用那里的函数?我必须使用指向该特定函数的函数指针吗?如果 func4() 调用 func2() 和 func3() 会怎样?如果我没记错的话,他们会指出位于闪存中的代码段。这是否意味着我必须重新编写这些函数?完全使用函数指针吗?有人告诉我,只需链接器脚本就足以完成所有这些工作,我无需担心任何事情,但我仍然不明白它是如何工作的。


在 GCC 上:只需将函数放在 .data 部分中:

__attribute__( ( section(".data") ) )

它将通过启动代码与其余初始化变量一起复制(无需弄乱链接器 scipt)。如果函数在放入 RAM 后最终距离其余代码“很远”,您可能还需要一个“long_call”选项。

__attribute__( ( long_call, section(".data") ) )

Example:

__attribute__( ( long_call, section(".data") ) ) void ram_foobar (void) { ... }

您可能会收到可以安全忽略的编译器警告:

Warning: ignoring changed section attributes for .data
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 ARM 架构上从 RAM 运行代码 的相关文章

  • 如何创建静态链接共享库

    在我的硕士论文中 我尝试为 ARM Cortex M3 嵌入式系统采用共享库方法 由于我们的目标板没有 MMU 我认为使用 普通 动态共享库是没有意义的 因为 text 是直接从闪存执行的 而 data 在启动时被复制到 RAM 所以我无法
  • 使用 QEMU 模拟 Big Endian ARM 系统

    是否可以编译一些 Linux 内核并通过 QEMU 运行它 模拟一些 Big Endian ARM 处理器 如果 QEMU 无法做到这一点 我很想知道其他可以做到这一点的系统模拟器 我的基本目标是在尽可能多的本机环境中运行和调试专用的 Bi
  • 对 -finstrument-functions 的未定义引用

    我正在尝试跟踪内核函数并且我正在使用 finstrument functions这样做 但我收到未定义的参考错误 如下所示 arch arm kernel elf c 9 undefined reference to cyg profile
  • Android 上原生的自修改代码

    我正在尝试在 Android 上制作一些自修改本机代码并在模拟器中运行它 我的示例基于 android ndk 中的 Hello JNI 示例 它看起来像这样 define NOPE LENGTH 4 typedef void FUNC v
  • ARM 汇编 SOS 中的 64 位除法

    我正在计算 16 个 64 位数字相加的平均值 我认为我已经正确完成了所有加法 但现在我需要弄清楚如何将 64 位数字除以 16 但我被困住了 任何帮助都会非常感谢你 到目前为止 这是我的代码 tableSize EQU 16 sum EQ
  • 使用 GCC 编译器为代码的特定部分保留寄存器

    是否可以为 C 代码的特定部分保留寄存器 ffixed reg 选项或声明全局寄存器变量不是我正在寻找的答案 我想保留特定范围 比如说特定函数 的寄存器值 使用局部寄存器变量是不可能的 因为它不能保证在整个范围内保留寄存器的值 我正在寻找类
  • 如何修改内核DTB文件

    Summary 我目前正在为定制板编译 Linux 内核 内核 模块和 DTB 以及一些定制驱动程序 有时 我会编译内核并意识到 DTB 文件中的兼容性字符串不是自定义驱动程序正在寻找的内容 现在 我可以解决此问题的唯一方法是修改 DTS
  • 使用 gnueabihf 为 ARMv6 构建

    我尝试为 ARMv6 构建应用程序 但失败了 我猜问题是工具链支持硬浮点 但 ARMv6 不支持 好吧 首先我设置 march armv6 编译失败 opt gcc linaro arm linux gnueabihf 4 8 2014 0
  • ARM 汇编分支到寄存器或内存内部的地址

    我想知道在 ARM 汇编中我可以使用哪条指令分支到存储在某个内存地址中的地址或标签 例如 我们可以使用B LABEL来跳转到LABEL 但现在目的地只能在运行时知道 并且它存储在某个已知的内存位置 是否有类似 B 地址 的东西 Thanks
  • ARM架构中不同处理器模式下如何使用内核堆栈?

    据我了解 每个进程都有一个用户堆栈和内核堆栈 除此之外 ARM 架构中的每种模式都有一个堆栈 所以我想知道不同的堆栈和堆栈指针在 ARM 模式下如何工作 另外 何时会使用与进程关联的内核堆栈 何时会使用与进程关联的内核堆栈 当您进行系统调用
  • GCC ARM 汇编预处理器宏

    我正在尝试使用汇编 ARM 宏进行定点乘法 define MULT a b asm volatile SMULL r2 r3 0 1 n t ADD r2 r2 0x8000 n t ADC r3 r3 0 n t MOV 0 r2 ASR
  • 在嵌入式设备上使用new或malloc引起的段错误[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在尝试
  • ARM 中只有两个操作数的 ADD 或 SUB

    我正在学习ARM汇编语言 我读过 ADD 应该有 3 个操作数 然而 我见过很多案例 现实中只有两种 例如 STR R1 SP 0x20 var 1C LDR R1 a lua 0x1DE4E6 MOVS R0 R4 haystack AD
  • Linux malloc() 在 ARM 和 x86 上的行为是否不同?

    这个网站上有很多关于内存分配的问题 但是我 找不到专门解决我的问题的人 这 问题 https stackoverflow com questions 19148296 linux memory overcommit details似乎最接近
  • 源和目标具有不同的 EABI 版本

    我正在尝试使用 ARM 工具链编译 so 文件 但是我不断收到这个错误 错误 源对象的 EABI 版本为 0 但目标对象的 EABI 版本为 5 我无法更改工具链中的任何内容 因为我必须使用给定的工具链 我以前从未见过这个错误 我使用了这个
  • 可以使用Visual Studio 2012构建ARM桌面程序吗?

    我正在使用 Visual Studio 2012 beta 我的桌面 win32 程序在 ARM 架构中编译得很好 升级到 Visual Studio 2012 RC 后 编译器无法工作并出现以下错误 不支持为 ARM 平台编译桌面应用程序
  • 尝试使用 qemu-arm 运行arm二进制文件时如何解决“加载共享库时出错”?

    我正在运行 Linux Mint 14 并安装了 qemu qemu user 和 gnueabi 工具链 我编译了 test carm linux gnueabi gcc test c o test 当我尝试跑步时qemu arm usr
  • M1 MacBook Pro 上的 Android Studio 无法使用 ABI armeabi-v7a 模拟系统映像

    我的 M1 Macbook Pro 上的 Android Studio 可以很好地模拟 ABI arm64 v8a 的所有系统映像 API 24 29 30 31 但是 它无法使用 ABI armeabi v7a 运行所有映像 例如 API
  • 为什么 i2c_smbus 函数不可用? (I2C——嵌入式Linux)

    有很多参考使用i2c smbus 开发嵌入式 Linux 软件时在 I2C 总线上进行通信的函数 什么时候i2c smbus函数如i2c smbus read word data在软件项目中引用了 ARM8 处理器错误 例如 i2c smb
  • 使用 Android NDK 使用 -fsigned-char 进行构建安全吗?

    为了与其他平台保持一致 我需要使用signed char在我正在处理的一些本机代码中 但默认情况下在Android NDK上char类型是unsigned 我尝试明确使用signed char类型 但它生成太多警告differ in sig

随机推荐

  • DatePicker Blackout日期所有未来和一些过去

    我有一个 WPF 应用程序 需要使用 DatePicker 提供出生日期 除了 134 年前以及之后的所有时间之外 我还想删除明天和其余时间的日期 我尝试使用 BlackoutDates 来完成此任务 因为我们仍然希望允许手动用户输入 但我
  • 使用 Curl 发布 xml 时权限被拒绝?

    我必须将 xml 发布到某个 url 以便由某些 Web 服务使用 我正在使用 Cent OS 5 6 Apache 2 2 3 CentOS 当我使用命令行发布时curl d abc xml http example com它给了我结果
  • 使用 appium 自动登录过程时,密码和用户名被输入在用户名的同一字段中

    尽管测试清晰简单 但我在尝试发送密钥 用户名 密码 时总是面临同样的问题 但密码字段是写在用户名的位置 这是我的测试 NG 我使用 appium 进行测试 Test public void Test1 throws InterruptedE
  • 将 iOS 和 Android 客户端连接到 SockJS 后端

    我正在使用开发 WebSocket 消息传递后端Spring WebSockets https spring io guides gs messaging stomp websocket 它使用SockJS STOMP协议 之所以不使用普通
  • 通过 SSO 进行 Maven 设置?

    我有一些开发人员对于将 LDAP 用户名 密码存储在 settings xml 中以便访问 Nexus 感到不满意 他们的不满部分是出于 FUD 但也因为每当 LDAP 密码过期时都必须重新加密密码 这种情况在此处相对常见 带来的不便 有什
  • Airflow:只有一项任务的简单 DAG 永远不会完成

    我制作了一个非常简单的 DAG 如下所示 from datetime import datetime from airflow import DAG from airflow operators bash operator import B
  • 服务器显示文本而不是 HTML

    我正在尝试创建一个 C 服务器 它将接受输入并能够通过 html 格式将它们返回给用户 其中服务器充当用户界面 我当前的问题似乎无法弄清楚为什么 C 服务器在 localhost 3838 处将 HTML 代码以文本形式吐出 而不是将其显示
  • 在 PHP 中,为什么“or die()”可以工作,而“or return”却不行?

    在 PHP 中 您可以通过调用来处理错误or die当遇到某些错误时退出 如下所示 handle fopen location r or die Couldn t get handle Using die 不是处理错误的好方法 我宁愿返回一
  • C# 服务器和 Java 客户端:TCP 套接字通信问题

    我用 C 编写了一个服务器程序TCPListner和一个使用套接字的 Java 客户端程序 但我无法将复杂的对象从 Java 客户端发送到 C 服务器 当我通过将字符串转换为字节数组从 Java 客户端发送到 C 服务器时 当转换回字符串时
  • Ansible设置mysql root密码

    你们中有人有想法构建一个 yml 用于 mysql 更新 root 密码并授予权限吗 我已经创建了我的剧本 并且在全新安装时它按预期工作 完全没有问题 但是 当我再次进行 vagrant 配置时 它现在无法设置 root 密码 并且出现错误
  • 按排序顺序将元素插入数组

    我正在尝试按排序顺序将元素添加到数组中 这是我的代码 public class SortedInsertion public static void main String args int arr new int 6 arr 0 5 ar
  • LINQ如何返回最后一个日期以及第一个和最后一个计数之间的差异

    我有一个包含以下列和示例数据的表 acteename updated at count count is not sorted in db dev 52 2 7 2020 5 56 43 PM 1 dev 52 2 7 2020 5 56
  • 根据 Woocommerce 中的特定产品数量渐进式固定优惠券折扣

    我有一个小问题 不知道如何解决自己 我想在我的 Woocommerce 商店中仅针对一种产品使用此逻辑 我使用这样的链接来自动应用优惠券代码并添加到购物车 https testsite com checkout add to cart Pr
  • Videojs仅添加播放控件

    我在用Video js在我的网页中播放视频 我想将播放器控件自定义为仅播放按钮 我的代码是
  • 如何构建/编译 ndk 应用程序?

    嗨 现在我正在下载 ndk 但我不知道如何构建和编译 实际上我是 Android 应用程序的新手 现在我正在使用 linux 并且我不太擅长命令行 embdes embdes laptop cd home embdes projects a
  • 如何从简单的 jsdom 函数返回值?

    我将 jsdom 与 jquery 一起使用 并且运行得很好 然而 我试图将我的代码模块化一点 这样我就不会重复自己 所以我用一些 jsdom 代码创建了一个基本函数 它接受一些 html DOM 用 jquery 调整它 然后将其吐出来
  • AngularJS:避免在收到响应之前两次调用相同的 REST 服务

    我有两个指令 每个指令都使用包装 q http 调用的同一工厂 angular module demo directive itemA restService function restService return restrict A l
  • 张量流中的批量归一化

    我注意到张量流的 api 中已经有批量归一化函数 但我不明白的一件事是如何更改训练和测试之间的程序 批量归一化在测试期间的行为与训练期间的行为不同 具体来说 在训练期间使用固定的均值和方差 某处有一些好的示例代码吗 我看到了一些 但是对于作
  • 在 PHPUnit 中进行模拟时,通过回调中的引用传递

    我有一个想要模拟的接口 并模拟其方法之一的行为 所以我创建了一个回调来非常简单地模拟行为 如果我创建一个基于此接口的新对象 但我想模拟该接口 则此测试通过 模拟的 setUp 方法被正常调用 并且在回调中调用 getVar testing
  • 如何在 ARM 架构上从 RAM 运行代码

    我正在对 ARM Cortex R4 进行编程 并且有一些二进制文件 我想从 TCRAM 执行它们 只是为了看看性能的提升是否足够好 我知道我必须编写一个函数来将二进制文件复制到 RAM 这可以通过链接器脚本来完成 并且知道二进制文件的大小