mrpdev/MRP模拟器解决方案.TXT
zengming de08533a79 0
2019-03-21 13:34:44 +08:00

153 lines
3.9 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

EXT结构详解
前8字节
0~3mr_table 函数表 指针
4~7mr_c_function_st 指针
8~11mr_c_function_load 函数指针
typedef struct _mrc_extChunk_st
{
int32 check;
MR_LOAD_C_FUNCTION init_func; //mr_c_function_load 函数指针
/**
* (void* P, int32 code, uint8* input, int32 input_len, uint8** output, int32* output_len);
* 参数详解:
* pglobal_p_buf 指针
* code定义如下
* 0mrc_init 1mrc_event 2
*/
MR_C_FUNCTION event; //mr_helper 函数指针
uint8* code_buf; //ext内存地址
int32 code_len; //ext长度
uint8* var_buf; //RW段地址
int32 var_len; //RW段长度
mr_c_function_st* global_p_buf; //mr_c_function_st 表地址
int32 global_p_len; //mr_c_function_st 表长度
int32 timer;
mrc_extMainSendAppMsg_t sendAppEvent;
mr_table *extMrTable;
#ifdef MRC_PLUGIN
MR_C_FUNCTION_EX eventEx;
#endif
int32 isPause;/*1: pause 状态0:正常状态*/
} mrc_extChunk_st;
typedef struct _mr_c_function_st
{
uint8* start_of_ER_RW;
uint32 ER_RW_Length;
//uint8* old_start_of_ER_RW;
int32 ext_type;
mrc_extChunk_st * mrc_extChunk;
//stack shell 2008-2-28
int32 stack;
//
} mr_c_function_st;
启动流程:
先调用int32 mr_c_function_load (int32 code),完成 mr_table 函数表设置
时空:
[基址]-4位置是 mr_c_function_st指针。
[基址]-8位置是函数表指针。
mr_c_function_load调用了函数表里偏移为0x64的mr_c_function_new函数这个mr_c_function_new函数就在这里面。
EXT的RW段即EXT全局变量空间EXT内部自己会管理
BinSys
# /* ---- SKY_PLATFORM start ---- */
ifeq ($(strip $(DSM_SUPPORT)),TRUE)
# sky add ,compile switch macro
COM_DEFS += __MMI_DSM_NEW__
ifeq ($(strip $(PLATFORM)),MT6235B)
COMPOBJS += plutommi\mmi\mythroad\mythroadlib\dsm35.lib
endif
ifneq ($(strip $(PLATFORM)),MT6235B)
COMPOBJS += plutommi\mmi\mythroad\mythroadlib\dsm.lib
endif
COMPOBJS += plutommi\mmi\mythroad\mythroadlib\mmidsm111.lib
主要是 dsm.lib 和 mmidsm111.lib
你可以看看目前能拿到的移植层的代码看dsm.lib里的mythroad.obj
天使:
因为所有的API接口 都在函数表
我们写好接口 填到函数表
我看来 目前最主要的工作就是 函数表里所有函数
这个我们可以一起来写
封装NDK底层函数
然后 难点在于 加载EXT之前要做什么调用mrc_init前做了什么怎么调mrc_init
mr_c_function_load 函数地址为ext内存地址 + 8所以其在ext内部位置固定
eleqian
嗯,一般的像图像字符绘制比较容易实现
对话:
我现在最大的疑惑就是 mrc_init mrc_event mrc_pause 等函数 是不是在 ext文件中位置固定的额
无尽时空<timespace_2011@qq.com> 23:35:01
不是
eleqian(1003082820) 23:35:20
ext入口不是它们
天使之翼<edroid@foxmail.com> 23:35:44
那怎么找到 mrc_init 调用它
无尽时空<timespace_2011@qq.com> 23:35:48
它们都被mr_helper调用mr_helper 才是最重要的消息分发器。
eleqian(1003082820) 23:35:51
它们只是普通函数
天使之翼<edroid@foxmail.com> 1:22:58
mr_table 函数表内部函数地址设置是在MTK开机时完成的你改变了这个表里的某个函数地址后下次开机才会恢复
BinSys(123077083) 1:23:03
mr_c_function_load 确实是固定的因为一个elf文件经过fromelf后貌似只剩下代码段并且entry在0字节处。至于为什么偏移了8就不知道了
天使之翼<edroid@foxmail.com> 1:24:09
因为 前面 8个字节 分别用来存储 mr_table 和 mr_c_function_st 函数表地址
first和entry都指定为 mr_c_function_load另外不是armcc指定的是armlink的参数
armlink
输入
-rwpi
-ro
-base0x80000
-remove
-first mr_c_function_load
-entry mr_c_function_load
-o
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\mr_cfunction.fmt
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\mr_sfw_mrc_mrc_win.o
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\mr_src_helloworld.o
C:\SKYMOBI\SDS4CPv1.0\Compiler\mr_helper.lib(mr_helper.o)
C:\SKYMOBI\SDS4CPv1.0\Compiler\mr_helper.lib(mr_helper_s.o)
C:\SKYMOBI\SDS4CPv1.0\Compiler\mr_helperexf.lib
C:\SKYMOBI\SDS4CPv1.0\Compiler\mr_helperexb.lib
不同点:
ext启动
在mr_table里设置ext定时器启动和停止的函数设置ext启动标志。
普通启动:
在mr_internal_table设置字符串"dealtimer"
其他都相同。
普通启动调用的定时器函数在start.mr里设置dealtimer
dealtimer 本身是个函数在start.mr里定义
*(mr_c_function_load - 0x4) + 0xC 处是ext模块句柄
不分析不知道,一分析吓一跳。