VxWorks函数栈帧剖析

摘要:
让我们看看任务列表-&gt。

VxWorks任务内存地址空间布局

VxWorks系统中,所有Tasks(包括系统任务和用户任务)都工作在特权模式,共享所有内存。A任务可以直接访问B任务的内存地址空间而不会触发任何“异常”。下图为单个任务的内存地址空间布局,任务ID(Task ID)分割任务控制块(TCB)和任务栈,任务栈中压栈函数栈帧,从高地址向低地址增长。

VxWorks函数栈帧剖析第1张

首先,我们查看任务列表

-> i

  NAME        ENTRY       TID    PRI   STATUS      PC       SP     ERRNO  DELAY
---------- ------------ -------- --- ---------- -------- -------- ------- -----
^@tExcTask   excTask      87df85b0   0 PEND       8178f244 87df8490   3006b     0
tLogTask   logTask      87df5a00   0 PEND       8178f244 87df58e8       0     0
tCPUIdlCaptmeasureCPUId 57beefb0   1 DELAY      8173ad78 57beef28       0    17
tShell     shell        878aea90   1 READY      8173c008 878ae6a8       0     0
active_shelshell_task   57b5ac40   2 PEND       80168bec 57b5abc8       0     0
tWdbTask   wdbTask      878d1700   3 PEND       80168bec 878d1470  3d0002     0
Timer      8175f730     57bed110   5 DELAY      8173ad78 57bed088       0    55
keep_alive 810f90a4     5ee7e900   6 PEND       8178f244 5ee7e1b8       0     0
oind       810f829c     5eeaf260   7 PEND+T     80168bec 5eeaef08  3d0002    30
hind       810f8d64     5ee9eea0   8 PEND       8178f244 5ee9e1d0  3d0002     0
Co00       810f960c     5ee6e630   9 PEND       8178f244 5ee6e4f0  3d0002     0

我们以Timer为例,分析函数栈帧结构

-> ti Timer
^@
  NAME        ENTRY       TID    PRI   STATUS      PC       SP     ERRNO  DELAY
---------- ------------ -------- --- ---------- -------- -------- ------- -----
Timer      8175f730     57bed110   5 DELAY      8173ad78 57bed088       0    22

stack: base 0x57bed110  end 0x57beb110  size 8176   high 292    margin 7884 

options: 0xc
VX_DEALLOC_STACK    VX_FP_TASK          

VxWorks Events
--------------
Events Pended on    : Not Pended
Received Events     : 0x0
Options             : N/A

$0    =        0   t0    =        0   s0    =        0   t8    =        0
at    =        0   t1    =        0   s1    =        0   t9    =        0
v0    =        0   t2    =        0   s2    =        0   k0    =        0
v1    =        0   t3    =        0   s3    =        0   k1    =        0
a0    =        0   t4    =        0   s4    =        0   gp    = 82d6cba0
a1    =        0   t5    =        0   s5    = 57bed110   sp    = 57bed088
a2    =        0   t6    =        0   s6    =       3c   s8    = 57bed0d0
a3    =        0   t7    =        0   s7    = 832bb500   ra    =        0
divlo =        0   divhi =        0   sr    = 1000fc01   pc    = 8173ad78
value = 0 = 0x0

从上面可以看出,tLogTask任务的栈空间为0x57bed110~0x57beb110地址段,栈顶指针SP值为0x57bed088。

继续查看函数调用栈

-> tt Timer
^@80169604 vxTaskEntry    +c  : TmrStopTimer (0, 0, 0, 0)
8175f768 TmrStopTimer   +410: taskDelay (eeeeeeee, eeeeeeee, eeeeeeee, eeeeeeee)
value = 0 = 0x0

此处,分析TmrStopTimer函数的栈帧

-> l TmrStopTimer,20
^@                      TmrStopTimer:
0x8175f358  27bdffd8    addiu           sp,sp,65496(-40)                   // sp = sp - 40
0x8175f35c  afbf0024    sw              ra,36(sp)                          // [sp + 36] = ra
0x8175f360  afbe0020    sw              s8,32(sp)                          // [sp + 32] = s8
0x8175f364  03a0f025    move            s8,sp                              // s8 = sp
0x8175f368  afc40028    sw              a0,40(s8)                          // [s8 + 40] = a0   第一个参数
0x8175f36c  afc5002c    sw              a1,44(s8)                          // [s8 + 44] = a1   第二个参数
0x8175f370  8fc20028    lw              v0,40(s8)                          // v0 = [s8 + 40]
0x8175f374  afc20014    sw              v0,20(s8)                          // [s8 + 20] = v0
0x8175f378  afc00010    sw              zero,16(s8)                        // [s8 + 16] = 0
0x8175f37c  3c0282ca    lui             v0,0x82ca
0x8175f380  8c422088    lw              v0,8328(v0)
0x8175f384  10400008    beqz            v0,0x8175f3a8
0x8175f388  00000000    nop     
0x8175f38c  3c0482ca    lui             a0,0x82ca
0x8175f390  8c842088    lw              a0,8328(a0)
0x8175f394  2405ffff    li              a1,65535
0x8175f398  0c05a189    jal             semTake
0x8175f39c  00000000    nop     
0x8175f3a0  085d7ced    j               0x8175f3b4
0x8175f3a4  00000000    nop     
value = -2122976344 = 0x8175f3a8 = TmrStopTimer + 0x50

第一行指令表示把栈顶指针sp下移40个字节,表示TmrStopTimer函数的栈帧大小为40字节。

VxWorks函数栈帧剖析第2张

如上所示,TmrStopTimer函数栈帧的底部压栈返回地址ra和返回函数的栈顶指针。

对于叶子函数(不调用其他函数的函数),可能不会压栈ra,因为ra寄存器值不会被改写。此外,编译器的优化选项-O指定的优化级别,也会影响栈帧结构。

打印从sp~s8地址空间的栈数据:

-> d 0x57bed088,20,4
^@57bed080:                    eeeeeeee eeeeeeee   *            ....*
57bed090:  57bed098 8175f834 82eaa780 0000001d   *W....u.4........*
57bed0a0:  eeeeeeee eeeeeeee 0000000f 00000001   *................*
57bed0b0:  0000001d 82eaaff8 eeeeeeee 8175f770   *.............u.p*
57bed0c0:  00000000 00000000 00000000 57bed0d0   *............W...*

可以看到,s8为0x57bed0d0,ra为0。(此处有点诡异,居然是反的,有可能函数汇编代码中移位了sp指针,待商榷)

免责声明:文章转载自《VxWorks函数栈帧剖析》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇NX二次开发-Ufun C函数例子目录【更新日期2020.7.5】BIRT新建项目下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ODOO 新API修饰符

Odoo8中,API接口分为traditaional style和record style两种类型: traditional style指的就是我们在7.0中使用的类型,def(self,cr,uid,ids,context)式的语法. record style 8.0及以后版本精简化参数后的风格,只保留了self和args,形如def(self,args...

Windows10 ntoskrnl.exe占用大量的磁盘空间(100%)

一、解决办法: 1、此电脑(右键)>  管理(点击)> 系统工具 > 任务计划程序 > 任务计划程序库 > Microsoft > windows > .NET Framework 禁用右侧四项!!! 同时,禁用以下两项!!!  2、在 C:WindowsSystem32TasksMicrosoftWindow...

Windows下 VS2015编译RocksDB

VS2015编译RocksDB RocksDB 是一个来自 facebook 的可嵌入式的支持持久化的 key-value 存储系统,也可作为 C/S 模式下的存储数据库,但主要目的还是嵌入式。RocksDB 基于 LevelDB 构建。 1、下载rocksdb源码 git clone https://github.com/facebook/rocksdb...

php CI框架目录结构及运行机制

CI目录结构   CI主要组成部分为,application(应用文件夹)、system(系统文件夹)和index.php入口文件。     应用文件夹中主要是存放控制器、模型和视图等,系统文件夹中主要是存放组成CI的核心文件的,index.php入口文件是一个单一入口文件,所谓单一文 件是指在一个网站(应用程序)中,所有的请求都是指向的这么一个文件,由...

QT信号槽详解

1         QT信号槽详解 1.1  信号和槽的定义 信号是触发信号,例如按钮的点击触发一个clicked信号,槽是用来接收信号,并处理信号,相当于信号响应函数。一个信号可以关联多个槽函数,信号也可以连接信号。 要使用信号槽,类必须继承与QObject类或者其子类,否则无法识别槽函数错误。在类的定义开头需要添加宏定义Q_OBJECT。如下 clas...

Qt5之反射机制(内省)

Qt的元对象系统除了提供信号/槽机制的特性之外,它还提供了以下特性: QObject::metaObject() 返回关联的元对象 QMetaObject::className() 在运行时状态下返回类名 QObject::inherits() 判断类的继承关系 QObject::tr(),QObject::trUtf8() 提供国际化,翻...