关于我
欢迎来到我的博客!这里汇集了我对编程和技术的洞见和总结。本站内容分为几个主要类别,涵盖从具体技术实现到编程理念的广泛话题。
主要内容分类
- 项目工程:深入探讨技术的实现细节和理解。
- C/C++:围绕C/C++语言的技术点和编程技巧进行详细总结。
- 程序员哲学:分享程序员在职业生涯中应该具备的哲学理念和思考方式。
想要了解更多具体内容,您可以访问文章分类页面。
联系我
如果您有任何问题或想要交流,欢迎通过关于页面与我联系。
感谢您的阅读和支持,希望我的博客能为您的技术旅程带来帮助!
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 | s->isa.inst.val = inst_fetch(&s->snpc, 4); |
要想知道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 !