halloween 发表于 2007-1-10 13:05:28

【讨论】怎样让SkyEye支持Semihosting功能?

不知道SkyEye项目成员有没有考虑过这个问题?如果要实现,有没有什么技术障碍或者难度?

halloween 发表于 2007-1-10 17:10:16

Semihosting 具体来讲是指一种让代码在ARM 目标上运行,但使用运行了
ARM 调试器的主机上I/O 设备的方法;也就是让ARM 目标将输入/ 输出请求
从应用程序代码传递到运行调试器的主机的一种机制。通常这些输入/输出设备
包括键盘、屏幕和磁盘I/O。
    半主机由一组已定义的SWI 操作来实现。库函数调用相应的SWI(软件中
断),然后调试代理程序处理SWI 异常,并提供所需的与主机之间的通讯。
   多数情况下,半主机SWI 是由库函数内的代码调用的。但是应用程序也可
以直接调用半主机SWI。半主机SWI 的接口函数是通用的。当半主机操作在硬
件仿真器、指令集仿真器、RealMonitor 或Angel 下执行时,不需要进行移植处
理。
   使用单个SWI 编号请求半主机操作。其它的SWI 编号可供应用程序或操作系统使用。用于半主机的SWI 号是:
   在ARM 状态下:0x123456
   在Thumb 状态下:0xAB
   SWI 编号向调试代理程序指示该SWI 请求是半主机请求。要辨别具体的操
作类型,用寄存器r0 作为参数传递。r0 传递的可用半主机操作编号分配如下:
    0x00-0x31:这些编号由ARM 公司使用,分别对应32 个具体的执行函
数。
    0x32-0xFF:这些编号由ARM 公司保留,以备将来用作函数扩展。
    0x100-0x1FF:这些编号保留给用户应用程序。但是,如果编写自己的
SWI 操作,建议直接使用SWI 指令和SWI 编号,而不要使用半主机
SWI 编号加这些操作类型编号的方法。
    0x200-0xFFFFFFFF:这些编号未定义。当前未使用并且不推荐使用这
些编号。
半主机SWI 使用的软件中断编号也可以由用户自定义,但若是改变了缺省
的软中断编号,需要:
   更改系统中所有代码(包括库代码)的半主机SWI 调用
   重新配置调试器对半主机请求的捕捉与相应
这样才能使用新的SWI 编号。

ksh 发表于 2007-1-12 09:59:31

目前还没有实现。我理解半主机不用自己去模拟I/O,用了主机的I/O,提高了效率,模拟器的速度有可能会快一点。有可能在不同的操作系统上移植性会差一点。是这样的么?

halloween 发表于 2007-1-15 11:44:52

基本上差不多了,我想SkyEye之所以设计之初没有去考虑这个问题,可能和实现Semihosting功能需要和其它一些东西配合才可以实现,包括向RTL库之类的。

另外问一个问题,从技术实现角度来讲,如果要实现Semihosting,需要从SkyEye的哪些部分出发去考虑呢,希望得到一些指教,便于我继续研究这个方向,呵呵

ksh 发表于 2007-1-15 16:02:32

哦,对于SkyEye 的ARM 模拟部份,I/O的模拟在arch/arm/mach/中的skyeye_mach_*.c中。你可以重新实现一个semihosting的I/O模拟。比如可以利用主机的信号处理代替io_do_cycle的轮询。
页: [1]
查看完整版本: 【讨论】怎样让SkyEye支持Semihosting功能?