gpt4 book ai didi

c - SPARC 程序集 jmp\boot

转载 作者:行者123 更新时间:2023-11-30 14:49:32 25 4
gpt4 key购买 nike

我会简要解释一下这个问题。我有一 block Leon3 板 (gr-ut-g99)。使用 GRMON2,我可以在板上所需的地址加载可执行文件。

我有两个程序。我们称它们为 A 和 B。我尝试将它们加载到内存中并单独运行。

我现在想做的是让A程序调用B程序。

这两个程序都是使用 gcc 编译器的变体(Gaisler Sparc GCC)用 C 语言编写的。

为了进行跳转,我在程序 A 中编写了一个微小的内联汇编函数,该函数跳转到我加载程序 B 的内存地址。

下面是程序 A 的片段

 unsigned int return_address;
unsigned int * const RAM_pointer = (unsigned int *) RAM_ADDRESS;
printf("RAM pointer set to: 0x%08x \n",(unsigned int)RAM_pointer);
printf("jumping...\n");

__asm__(" nop;" //clean the pipeline
"jmp %1;" // jmp to programB
:"=r" (return_address)
:"r" (RAM_pointer)
);

RAM_ADDRESS 是#define

#define RAM_ADDRESS 0x60000000

程序B是一个简单的hello world。程序B加载到0x60000000地址处。如果我尝试运行它,它就会起作用!

int main()
{
printf ("HELLO! I'M BOOTED! \n");
fflush(stdout);

return 0;
}

当我运行 ProgramA 时,我期望看到控制台上的“jumping...”消息,然后看到“HELLO!I'M BOOTED!”来自程序B

发生什么而不是 IU 异常。下面我发布了 grmon2 监视器显示的消息。我还报告了“inst”报告,该报告应显示异常之前执行的最后操作。

  grmon2> run

IU exception (tt = 0x07, mem address not aligned)

0x60004824: 9fc04000 call %g1


grmon2> inst
TIME ADDRESS INSTRUCTION RESULT SYMBOL

407085 600047FC mov %i3, %o2 [600063B8] -

407086 60004800 cmp %i4 [00000013] -

407089 60004804 be 0x60004970 [00000000] -

407090 60004808 mov %i0, %o0 [6000646C] -

407091 6000480C mov %i4, %o3 [00000013] -

407092 60004810 cmp %i4, %l0 [80000413] -

407108 60004814 bleu 0x60004820 [00000000] -

407144 60004818 ld [%i1 + 0x20], %o1 [FFFFFFFF] -

407179 60004820 ld [%i1 + 0x28], %g1 [FFFFFFFF] -

407186 60004824 call %g1 [ TRAP ] -

我还尝试用“jmpl”或“c​​all”替换“jmp”,但它不起作用。我很困惑。我不知道如何处理好这个问题,因此我不知道还需要提供哪些其他信息。

我可以说,programB是在0x60000000处加载的,而entry_point当然是0x60000000。从该入口点直接运行程序 B,效果很好!

预先感谢您的帮助!

最佳答案

在我看来,您确实执行了跳转,并且它到达了程序 B,正如跟踪缓冲区中指令的地址所证明的那样。但是你崩溃的地方是在 stdio 中尝试打印东西。 Stdio大量使用了函数指针,该序列清楚地显示了一条调用指令,目标地址位于寄存器中,这表明使用了函数指针。

我建议在跳转之前将 fflush(stdout) 放入程序 A 中,这样您就可以在跳转之前看到消息。然后,在程序 B 中,不使用 printf,而是将一些已知值放入内存中,稍后您可以通过监视器检查该值以验证它是否已到达内存。

我的猜测是 stdio 库有一些数据或参数需要在程序启动时设置,但没有完成或没有正确完成。不确定您正在运行的平台,但是您是否具有某种调试或单步执行能力,例如在调试器中?如果是这样,只需单步执行跳转并跟随程序前进。

关于c - SPARC 程序集 jmp\boot,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49535410/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com