异构多核芯片系统中通过大核调试小核程序的实现方法与流程

文档序号:11582527阅读:619来源:国知局
异构多核芯片系统中通过大核调试小核程序的实现方法与流程

本发明属于异构多核芯片领域,具体是一种异构多核芯片系统中通过大核调试小核程序的实现方法。



背景技术:

传统的多核芯片的各个核调试都需要有硬件的jtag。jtag有2线制和5线制,需要占用额外的硬件资源,成本比较高;另外在小核单独用jtag调试时由于无法和大核同步,所以无法满足很多应用场景下的调试需求。



技术实现要素:

为了解决现有技术中存在的上述技术问题,本发明提供了一种异构多核芯片系统中通过大核调试小核程序的实现方法,大核与小核通过邮箱(mailbox)进行沟通,每个核都设有一个邮箱(mailbox),小核代码的数据段、代码段以及符号表放入头文件,大核通过包含小核的头文件来获得小核的上述内容,调试运行时大核把代码段和数据段拷贝到小核程序在编译链接阶段所指定的地址,然后复位小核,使小核程序开始运行,实现开始运行、设置断点、清除断点、读取变量或地址的值、修改某个变量或地址的值、和/或恢复运行。

进一步的,所述邮箱(mailbox)不同的寄存器地址,对应不同的中断,通过对邮箱(mailbox)进行读写,触发不同的中断,然后接收到中断的cpu读取相应寄存器值,得到其他核传递过来的信息。

进一步的,通过gnu的objcopy和readelf命令,将小核代码的数据段、代码段以及符号表放进c语言的头文件。

进一步的,所述开始运行具体为:在大核内将小核程序的代码段和数据段分别拷贝到链接阶段所指定的地址,复位小核的开始运行寄存器。

进一步的,所述设置断点具体为:大核查询自己保存的符号表,找到要设置断点的代码地址,发送邮箱(mailbox)命令,告知小核设置断点的位置,小核的邮箱(mailbox)中断服务程序备份原来代码内容,并修改大核指定该断点地址的内容为trap0指令;当程序运行到断点处会发生trap0异常,cpu保存当前pc值,后进入trap0异常服务程序;trap0服务程序等待大核发过来的邮箱(mailbox)命令。

进一步的,所述读取某个变量或地址具体为:进入断点后,大核发来邮箱(mailbox)命令,小核mailbox中断服务程序运行,把大核邮箱(mailbox)命令通知到trap0异常服务程序后退出;trap0异常服务程序检测到读取命令,将相应内容通过邮箱(mailbox)发给大核。

进一步的,所述设置变量或地址的内容具体为:进入断点后,大核发来邮箱(mailbox)命令,小核邮箱(mailbox)中断服务程序运行,修改相应位置的内容。

进一步的,所述恢复运行具体为:大核发来邮箱(mailbox)命令,trap0异常服务程序备份断点指令,修改断点处下一条指令为trap1,还原本断点处指令,退出trap0异常服务程序,让cpu执行刚被还原的指令;下一条指令为trap1,进入trap1异常服务程序,trap1异常服务程序修改上一条指令为trap0,还原本条指令,退出trap1异常服务程序,继续执行本条指令。

进一步的,所述清除断点具体为:大核发来邮箱(mailbox)命令,小核进入邮箱(mailbox)中断服务程序,把大核命令通知到trap0异常服务程序后退出,trap0异常服务程序随后将某个断点的代码复原,并删除断点记录。

本发明不使用jtag硬件的情况下,实现大核使用邮箱(mailbox)中断打断小核程序的运行并进行断点调试;使用trap0异常服务程序程序作为调试器服务端(server),在服务器(server)运行时通过邮箱(mailbox)与调试器客户端(client)进行交互;通过两个trap异常(trap0和trap1),巧妙地实现了退出断点恢复运行的机制。

附图说明

图1为trap0异常服务程序,小核程序运行到所设断点处(trap0指令)便进入trap0异常服务程序。

图2为trap1异常服务程序,其作用为辅助trap0异常服务程序执行恢复运行(continue)命令。

图3为小核程序,小核被邮箱(mailbox)中断则进入邮箱(mailbox)中断服务程序。

图4为小核邮箱(mailbox)中断服务程序。

图5为大核程序。

具体实施方式

下面结合附图对本发明作进一步说明。

如图1-5所示:

大核与小核的沟通方式

大核与小核通过邮箱(mailbox)进行沟通,每个核都设有一个邮箱(mailbox),有不同的寄存器地址,对应不同的中断,通过对邮箱(mailbox)进行读写,可以触发不同的中断,然后接收到中断的cpu读取相应寄存器值,就可以得到其他核传递过来的信息,这个信息包括命令号和参数。

小核程序加载方法

通过gnu的objcopy和readelf命令,小核代码的数据段、代码段以及符号表都被放进一个c语言的头文件。大核通过包含小核的头文件来获得小核的以上内容,调试运行时大核把代码段和数据段拷贝到小核程序在编译链接阶段所指定的地址,然后复位小核,使小核程序开始运行。

大核调试小核方法

要实现的内容有run(开始运行),break(设置断点),deletebreakpoint(清除断点),print(读取变量或地址的值),set(修改某个变量或地址的值),continue(恢复运行)。

1.开始运行(run)

在大核里将小核程序的代码段和数据段分别拷贝到链接阶段所指定的地址,复位小核的开始运行寄存器。

2.设置断点(break)

大核查询自己保存的符号表,找到要设置断点的代码地址,发送邮箱(mailbox)命令,告知小核在哪里设置断点,小核的邮箱(mailbox)中断服务程序备份原来代码内容,并修改大核指定该断点地址的内容为trap0指令。

3.进入断点

当程序运行到断点处会发生trap0异常,cpu保存当前pc值,后进入trap0异常服务程序。trap0服务程序等待大核发过来的邮箱(mailbox)命令。

4.读取某个变量或地址(print)

进入断点后,大核发来邮箱(mailbox)命令,小核mailbox中断服务程序运行,把大核邮箱(mailbox)命令通知到trap0异常服务程序后退出;trap0异常服务程序检测到读取命令,将相应内容通过邮箱(mailbox)发给大核。

5.设置变量或地址的内容(set)

进入断点后,大核发来邮箱(mailbox)命令,小核邮箱(mailbox)中断服务程序运行,修改相应位置的内容。

6.恢复运行(continue)

如图2所示,大核发来邮箱(mailbox)命令,trap0异常服务程序备份断点指令,修改断点处下一条指令为trap1,还原本断点处指令,退出trap0异常服务程序,让cpu执行刚被还原的指令;因为下一条指令为trap1,所以进入trap1异常服务程序,trap1异常服务程序修改上一条指令为trap0,还原本条指令,退出trap1异常服务程序,继续执行本条指令。

7.清除断点(deletebreakpoint)

大核发来邮箱(mailbox)命令,小核进入邮箱(mailbox)中断服务程序,把大核命令通知到trap0异常服务程序后退出,trap0异常服务程序随后将某个断点的代码复原,并删除断点记录。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1