File tree Expand file tree Collapse file tree 2 files changed +28
-0
lines changed Expand file tree Collapse file tree 2 files changed +28
-0
lines changed Original file line number Diff line number Diff line change 1+ ### 3.3.4 全局execute_data和opline
2+ Zend执行器在opcode的执行过程中,会频繁的用到execute_data和opline两个变量,execute_data为zend_execute_data结构,opline为当前执行的指令。普通的处理方式在执行每条opcode指令的handler时,会把execute_data地址作为参数传给handler使用,使用时先从当前栈上获取execute_data地址,然后再从堆上获取变量的数据,这种方式下Zend执行器展开后是下面这样:
3+ ``` c
4+ ZEND_API void execute_ex (zend_execute_data * ex)
5+ {
6+ zend_execute_data * execute_data = ex;
7+
8+ while (1) {
9+ int ret;
10+
11+ if (UNEXPECTED((ret = ((opcode_handler_t)execute_data->opline->handler)(execute_data)) != 0)) {
12+ if (EXPECTED(ret > 0)) {
13+ execute_data = EG(current_execute_data);
14+ } else {
15+ return;
16+ }
17+ }
18+ }
19+ }
20+ ```
21+ 执行器实际是一个大循环,从第一条opcode开始执行,execute_data->opline指向当前执行的指令,执行完以后指向下一条指令,opline类似eip(或rip)寄存器的作用。通过这个循环,ZendVM完成opcode指令的执行,如下图。
22+
23+ 
24+
25+
26+
27+
28+ 全局寄存器变量(Global Register Variables)是数据保存在寄存器中的一种变量类型,与存储在内存中的变量相比,寄存器变量具有更快的访问速度,在计算机的存储层次中,寄存器的速度最快,其次是内存,最慢的是内存。
You can’t perform that action at this time.
0 commit comments