在函数调用过程中,栈是逐步生成的。为单个函数分配的栈空间,即从该函数栈底(高地址)到栈顶(低地址)这段空间称为栈帧(Stack Frame)。 例如父函数main()调用子函数func1(),那么在准备执行子函数func1()时,栈指针SP会向低地址延伸一段(从父函数的栈框最低地址往下延伸),为func1()创建一个栈帧。func1()使用
在函数调用过程中,栈是逐步生成的。为单个函数分配的栈空间,即从该函数栈底(高地址)到栈顶(低地址)这段空间称为栈帧(Stack Frame)。 例如父函数main()调用子函数func1(),那么在准备执行子函数func1()时,栈指针SP会向低地址延伸一段(从父函数的栈框最低地址往下延伸),为func1()创建一个栈帧。func1()使...
常用的是满减栈,Linux内核也使用满减栈。 下图是一个满减栈的示意图,高地址为栈顶,低地址为栈低,栈向低地址方向生长,如右边的箭头所示。栈指针SP指向栈底(栈低保存了数据)。每产生一次函数调用,就会在栈中形成一个栈帧,该栈总共保存了4个栈帧(Stack Frame),每个栈帧由FP、LR及栈参数(函数参数、函数局部...
Arm64有4种栈,分别是空增栈(Empty Ascendant Stack,EA)、空减栈(Empty Descendant Stack,ED)、满增栈(Full Ascendant Stack,FA)、满减栈(Full Descendant Stack,FD)。常用的是满减栈,Linux内核也使用满减栈。 下图是一个满减栈的示意图,高地址为栈顶,低地址为栈低,栈向低地址方向生长,如右边的箭头所示。
专注于嵌入式linux开发。问题或建议,请发邮件至hjhvictory@163.com。 更新:2020/04/26。 本文研究的是arm架构的函数帧栈,阅读者需要有arm汇编基础,不过本文涉及的汇编指令不是很多。 理论上来说,ARM的15个通用寄存器是通用的,但实际上并非如此,特别是在过程调用的过程中。
1. arm-linux-gcc -o example example.c 不加-c、-S、-E参数,编译器将执行预处理、编译、汇编、连接操作直接生成可执行代码。 -o参数用于指定输出的文件,输出文件名为example,如果不指定输出文件,则默认输出a.out 2. arm-linux-gcc -c -o example.o example.c ...
1. arm-linux-gcc -o example example.c 不加-c、-S、-E参数,编译器将执行预处理、编译、汇编、连接操作直接生成可执行代码。 -o参数用于指定输出的文件,输出文件名为example,如果不指定输出文件,则默认输出a.out 2. arm-linux-gcc -c -o example.o example.c ...
在讲解各编译器之前,必须先了解一下以下这些文件。这些文件在编译器目录下或者编译生成目标平台的可执行程序时经常见到。此外,还需要注意区分 Windows 平台 和 Linux 平台的文件。
每个表占128个字节,可以保存32条指令(arm64的指令长度也是4字节),以linux kernel-4.19/arch/arm64/kernel/entry.S为例,异常向量表的入口如下图,一共有4组16个表: 用另外一张表可以更好理解这个异常向量表的入口: 比如当前代码运行在内核空间,发生了data abort,异常向量表的入口地址就是0x200。
The stack frame is following: #1 0x8018A6F8(int_cpu_unlock+0x4) #2 0x0(UNKNOWN FUNC)---THREAD INFO--- ---第二次--- ---VEC_NUM---