cmd_c嵌套调用

项目工程

Posted by Bruce Lee on 2024-04-08

cmd_c等一系列执行函数CALL cpu_exec函数

cpu_exec参数:调用一次该函数要执行的指令数

然后cpu_exec带着指令数CALL execute(n)函数

execute函数(详解)

execute函数会调用exec_once函数传入Decode s变量和cpu.pc变量

调用execute的cpu_exec函数的n值,在execute中用于for循环,多次调用exec_once函数.

对于execute函数的解析:

Decode类型解析?

Decode定义
其中含有:
变量:
pc
snpc
dnpc
ISADecodeInfo isa变量
IFDEF宏展开

这里就是含有,关于指令地址的pc类变量,一个承载指令二进制串的isa变量,一个用于调试的logbuf变量

关于Decode结构体,其中的ISADecodeInfo变量类型解析?

ISADecodeInfo结构体

结构体内部就是一个名为inst的union,内含一个uint32_t类型的val.就是承载执行的指令的二进制串值.

关于Decode结构体的宏IFDEF的大致分析?

1
IFDEF(CONFIG_ITRACE, char logbuf[128]);

当定义了CONFIG_ITRACH宏后,就展开为char logbuf[128];
这个应该是调试功能的代码,所以这里先不追究

exec_once函数的解析?

exec_once(&s, cpu.pc);

将临时变量Decode类型s,和cpu.pc这个全局变量接收

在exec_once函数内部,使用cpu.pc来初始化s变量的s->pc, s->snpc
并且调用isa_exec_once(s)函数
然后将s->dnpc的值,重新赋值给cpu.pc

//由此可见,cpu这个全局变量始终都是指向下一个执行指令
//临时变量用于在分析的过程中起作用,其中的pc,snpc和dnpc都是关键成员

对于exec_once函数中的isa_exec_once(s)函数解析?

只有两行代码:

1
2
s->isa.inst.val = inst_fetch(&s->snpc, 4);
return decode_exec(s);

要想知道Decode 类型的s变量的ISADecodeInfo类型的isa变量的val是什么含义,还需要分析inst_fetch函数的返回值.

根据分析inst_fetch函数的返回值,这个s->isa.inst.val就是要执行的指令的二进制串.

也就是ISADecodeInfo,上述;

然后获取了指令的二进制码,然后调用decode_exec(s)函数,返回这个函数的返回值.

inst_fetch(&s->snpc, 4);的作用是什么?

传入的pc是下一条指令的地址.

然后调用vaddr_ifetch(*pc, len);函数,返回该地址的指令二进制串,是32位.因为传入的4,表示4字节.

然后将s->snpc递增len长度,指向下一条静态指令地址.

然后返回取出的指令.

分析isa_exec_once(Decode *s)函数调用的decode_exec函数

首先定义了src1,src2,imm字段
然后将s->snpc赋值给s->dnpc

定义INSTPAT_INST宏,INSTPAT_MATCH宏

调用INSTPAT_START,一系列的INSTPAT,以及INSTPAT_END宏

调用R(0)将x0寄存器赋值为0;

然后返回;


If you like this blog or find it useful for you, you are welcome to comment on it. You are also welcome to share this blog, so that more people can participate in it. All the images used in the blog are my original works or AI works, if you want to take it,don't hesitate. Thank you !