首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux ARM上程序寄存器和堆栈的初始状态

在 Linux ARM 架构上,程序寄存器和堆栈的初始状态如下:

  1. 程序寄存器:程序寄存器是 CPU 中的一组寄存器,用于存储程序计数器(PC)、堆栈指针(SP)、链接寄存器(LR)、程序状态寄存器(PSR)等信息。在 Linux ARM 系统中,程序寄存器的初始状态如下:
  • PC:程序计数器,用于存储下一条要执行的指令的地址。在 Linux ARM 系统中,PC 的初始值为 0x00000000。
  • SP:堆栈指针,用于指向当前堆栈的顶部。在 Linux ARM 系统中,SP 的初始值为 0x00000000。
  • LR:链接寄存器,用于存储函数调用返回时的地址。在 Linux ARM 系统中,LR 的初始值为 0x00000000。
  • PSR:程序状态寄存器,用于存储当前 CPU 的状态信息。在 Linux ARM 系统中,PSR 的初始值为 0x00000000。
  1. 堆栈:堆栈是一种数据结构,用于存储函数调用时的临时变量、参数、返回地址等信息。在 Linux ARM 系统中,堆栈的初始状态如下:
  • 堆栈顶部:在 Linux ARM 系统中,堆栈顶部的地址由 SP 寄存器指向。
  • 堆栈底部:在 Linux ARM 系统中,堆栈底部的地址由内存空间的边界决定。

需要注意的是,Linux ARM 系统中程序寄存器和堆栈的初始状态可能会因为不同的硬件和软件配置而有所不同。因此,在实际使用中,需要根据具体情况进行调整。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

通过反汇编理解函数调用机制(x86和ARM)

在分析上面的汇编程序之前,需要了解rbp、rsp为栈基址寄存器、栈顶寄存器,分别指向栈底和栈顶;edx、eax、esi、edi均为x86CPU上的通用寄存器,可以存放数据(虽然它们还有别的作用,但是本文章不涉及...,是因为编译器还么有那么“智能”,它只能通过分析前部分的变量,一次性的为程序扩充堆栈) 然后向栈底上方的偏移地址为8和12的单元存入数据1和2; 把数据送入通用寄存器中,以供新的函数调用; 跳转到add...使用arm-linux-gcc编译并反汇编:arm-linux-objdump -D -m arm a.out 得到arm机器的汇编代码(除去一些初始化的代码)如下: ? ?...这段代码的解析与x86类似,只不过需要了解几个arm汇编指令和寄存器名称。fp为帧寄存器,起“标签”作用。...ARM为堆栈提供硬件支持,它有一个专门的寄存器sp指向栈顶,ARM支持四种堆栈工作方式,最常用的也是和x86类似,即从高地址向低地址生长。

2K20

系统启动流程-armV7

初始化核心模式堆栈和寄存器。 初始化任何关键的 I/O 设备。 执行NEON 或VFP 的任何必要初始化。 启用中断。 更改核心模式或状态。 处理安全世界所需的任何设置(参见第 21 章)。...例如,可能需要对将保存未初始化 C 变量的内存进行零初始化,将其他变量的初始值从 ROM 映像复制到 RAM,并设置应用程序堆栈和堆空间。...这会初始化主内存并将压缩的 Linux 内核映像复制到主内存中(从闪存设备、板上的内存、MMC、主机 PC 或其他地方)。引导加载程序将某些初始化参数传递给内核。...示例包括描述物理内存映射的 ATAG_MEM 和描述压缩 ramdisk 映像所在位置的 ATAG_INITRD2。引导加载程序还必须提供 ARM Linux 机器类型号 (MACH_TYPE)。...它初始化tick control、内存系统和特定于体系结构的子系统,并处理bootloader传递的命令行选项。 设置堆栈并初始化 Linux 调度程序。 设置各种内存区域并分配页面。

1.1K10
  • 嵌入式ARM设计编程(三) 处理器工作模式

    如果能得话,观察用户模式下压栈之前和压栈之后其堆栈区域的变化情况。 5)观察本程序模式切换过程中SPSR有无变化,并解释其原因。...由上可知,系统复位后处于管理模式。 2)记录每种模式下的初始堆栈指针,以及执行R1-R12内容压栈后本模式堆栈相关内存单元的数值。并分析快速中断FIQ模式与其他模式存入的R1-R12有什么不同。...5)观察本程序模式切换过程中SPSR有无变化,并解释其原因。 答:除了用户模式和系统模式,其余模式下都有一个私有SPSR保存状态寄存器....用来保存切换到该模式之前的执行状态,SPSR是异常模式的程序状态保存寄存器, 当特定的异常中断发生时,这个寄存器存放CPSR的内容,在异常中断退出时,可以用SPSR来恢复CPSR,但是通过观察可知,整个切换过程中没有异常的发生...此外也使用状态寄存器到通用寄存器的传送指令(MRS)以及通用寄存器到状态寄存器的传送指令(MSR),修改状态寄存器通过“读取-修改-写回”三个步骤操作来实现。

    54421

    10_异常与中断

    特权级别定义了在当前安全状态下访问资源的能力,并不暗含在其他安全状态下访问资源的能力。 ​ 通用操作系统(例如Linux)及其应用程序应在非安全状态下运行。...R15是程序计数器并保存当前程序地址(实际上,在ARM状态下,它始终指向当前指令之前的八个字节,而在Thumb状态下,它始终指向当前指令之前的四个字节,这是原始ARM1的三级流水线的遗留特性)。...在使用堆栈之前,必须通过引导代码初始化SP(堆栈指针)(针对每种模式)。...它是最高优先级的异常,无法屏蔽。上电后,此异常用于在处理器核上执行代码以对其进行初始化。 ​ (4)生成异常的指令 ​ 某些指令的执行会产生异常。...每个CPU核上的CPU interface有助于发送给该CPU核的中断控制和处理。 10.6.2 初始化 ​ distributor和CPU interface在复位时均被禁用。

    1.4K10

    【嵌入式】基于ARM的嵌入式Linux开发总结

    设计高性能、低功耗的嵌入式处理器。 2、ARM微处理器工作状态:两种指令对应两种状态(通常情况) (1)Thumb状态、ARM状态; (2)32位定长ARM指令,16位定长Thumb指令。..., SPSR_und,SPSR_svc,SPSR_mon (6)可复用寄存器: ① SP堆栈指针寄存器-R13,用于保存子程序调用或异常处理的临时数据; ② LR连接寄存器-R14,用于保存子程序调用或异常处理时...(7)PSR程序状态寄存器: ① 包括CPSR当前程序状态寄存器和SPSR备份的程序状态寄存器; ② CPSP用于保存当前模式下处理器模式、状态、中断使能、大小端模式及条件位等信息; ③ SPSR...用于备份异常发生前的CPSR寄存器的值,以便异常处理结束时能返回用户程序状态。...进程编程 一、Linux进程编程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是操作系统进行资源分配和调度的基本单位,是操作系统结构的基础。

    18.5K21

    一文读懂 | Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈

    有专门的栈指针寄存器,以及特定的硬件指令来完成 入栈/出栈 的操作。例如在 ARM 架构上,R13 (SP) 指针是堆栈指针寄存器,而 PUSH 是用于压栈的汇编指令,POP 则是出栈的汇编指令。...【扩展阅读】:ARM 寄存器简介 ARM 处理器拥有 37 个寄存器。这些寄存器按部分重叠组方式加以排列。每个处理器模式都有一个不同的寄存器组。...如果返回地址存储在堆栈上,则可将 lr 用作通用寄存器 * 程序计数器 (pc):指令寄存器 应用程序状态寄存器 (APSR):存放算术逻辑单元 (ALU) 状态标记的副本 * 当前程序状态寄存器...(CPSR):存放 APSR 标记,当前处理器模式,中断禁用标记等 * 保存的程序状态寄存器 (SPSR):当发生异常时,使用 SPSR 来存储 CPSR 上面是栈的原理和实现,下面我们来看看栈有什么作用...即使有另外一个任务在等待状态,程序是没法从此 main 函数里面跳转到另一个任务。因为如果是函数调用关系,本质上还是属于 main 函数的任务中,不能算多任务切换。

    2.1K20

    一文搞懂 | Linux 中的各种栈(进程栈 线程栈 内核栈 中断栈)

    有专门的栈指针寄存器,以及特定的硬件指令来完成 入栈/出栈 的操作。例如在 ARM 架构上,R13 (SP) 指针是堆栈指针寄存器,而 PUSH 是用于压栈的汇编指令,POP 则是出栈的汇编指令。...如果返回地址存储在堆栈上,则可将 lr 用作通用寄存器 程序计数器 (pc):指令寄存器 应用程序状态寄存器 (APSR):存放算术逻辑单元 (ALU) 状态标记的副本 当前程序状态寄存器 (CPSR)...:存放 APSR 标记,当前处理器模式,中断禁用标记等 保存的程序状态寄存器 (SPSR):当发生异常时,使用 SPSR 来存储 CPSR 上面是栈的原理和实现,下面我们来看看栈有什么作用。...即使有另外一个任务在等待状态,程序是没法从此 main 函数里面跳转到另一个任务。因为如果是函数调用关系,本质上还是属于 main 函数的任务中,不能算多任务切换。...而 ARM 上中断栈和内核栈则是共享的;中断栈和内核栈共享有一个负面因素,如果中断发生嵌套,可能会造成栈溢出,从而可能会破坏到内核栈的一些重要数据,所以栈空间有时候难免会捉襟见肘。

    7.1K33

    Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈

    有专门的栈指针寄存器,以及特定的硬件指令来完成 入栈/出栈 的操作。例如在 ARM 架构上,R13 (SP) 指针是堆栈指针寄存器,而 PUSH 是用于压栈的汇编指令,POP 则是出栈的汇编指令。...如果返回地址存储在堆栈上,则可将 lr 用作通用寄存器 程序计数器 (pc):指令寄存器 应用程序状态寄存器 (APSR):存放算术逻辑单元 (ALU) 状态标记的副本 当前程序状态寄存器 (CPSR)...:存放 APSR 标记,当前处理器模式,中断禁用标记等 保存的程序状态寄存器 (SPSR):当发生异常时,使用 SPSR 来存储 CPSR 上面是栈的原理和实现,下面我们来看看栈有什么作用。...即使有另外一个任务在等待状态,程序是没法从此 main 函数里面跳转到另一个任务。因为如果是函数调用关系,本质上还是属于 main 函数的任务中,不能算多任务切换。...而 ARM 上中断栈和内核栈则是共享的;中断栈和内核栈共享有一个负面因素,如果中断发生嵌套,可能会造成栈溢出,从而可能会破坏到内核栈的一些重要数据,所以栈空间有时候难免会捉襟见肘。

    2.9K50

    Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈

    有专门的栈指针寄存器,以及特定的硬件指令来完成 入栈/出栈 的操作。例如在 ARM 架构上,R13 (SP) 指针是堆栈指针寄存器,而 PUSH 是用于压栈的汇编指令,POP 则是出栈的汇编指令。...如果返回地址存储在堆栈上,则可将 lr 用作通用寄存器 程序计数器 (pc):指令寄存器 应用程序状态寄存器 (APSR):存放算术逻辑单元 (ALU) 状态标记的副本 当前程序状态寄存器 (CPSR)...:存放 APSR 标记,当前处理器模式,中断禁用标记等 保存的程序状态寄存器 (SPSR):当发生异常时,使用 SPSR 来存储 CPSR 上面是栈的原理和实现,下面我们来看看栈有什么作用。...即使有另外一个任务在等待状态,程序是没法从此 main 函数里面跳转到另一个任务。因为如果是函数调用关系,本质上还是属于 main 函数的任务中,不能算多任务切换。...而 ARM 上中断栈和内核栈则是共享的;中断栈和内核栈共享有一个负面因素,如果中断发生嵌套,可能会造成栈溢出,从而可能会破坏到内核栈的一些重要数据,所以栈空间有时候难免会捉襟见肘。

    3.5K20

    ARMv8 异常处理简介

    (2)堆栈指针寄存器SP 在AArch64状态下,除了通用寄存器外,还为以下每个异常级别实现了专用的堆栈指针寄存器, 堆栈指针寄存器为: SP_EL0和SP_EL1。...可以通过异常级别的堆栈指针后缀表明所选的堆栈指针: t表明使用SP_EL0堆栈指针。 h表明使用SP_ELx堆栈指针。 t和h后缀基于线程(thread)和处理程序(handler)的首字母。 ?...仅针对同步异常和SError进行更新。因为IRQ或FIQ中断处理程序从通用中断控制器(GIC)寄存器的信息获取状态。...每个表占128个字节,可以保存32条指令(arm64的指令长度也是4字节),以linux kernel-4.19/arch/arm64/kernel/entry.S为例,异常向量表的入口如下图,一共有4...另外就是读取elr_el1和spsr_el1等寄存器值。总之,kernel_entry主要将CPU寄存器按照pt_regs结构体的定义将异常第一现场保存到栈上。

    3.3K32

    Linux中的段

    但内核中也用到LDT,那只是在VM86 模式中运行Wine 时, 即在Linux 上模拟运行Windows 软件或DOS 软件的程序时才使用。...linux的GDT Linux 在启动的过程中设置了段寄存器的值和全局描述符表GDT 的内容,段的定义在include/asm-i386/segment.h 中: #define __KERNEL_CS...,实际上,Linux 内核不区分数据段和堆栈段,这也体现 了Linux 内核尽量减少段的使用。...按Intel 的规定,每个进程有一个任务状态段(TSS)和局部描述符表LDT,但Linux 也 没有完全遵循Intel 的设计思路。...例如arm处理器,由于arm处理器架构比较灵活,一般说arm寄存器并没有内存管理相关的寄存器,只说7种模式下的16个寄存器,其实arm的内存管理需要协处理器CP15去支持。

    4.6K20

    arm汇编指令详解带实例_汇编buf指令

    操作系统有安全级别要求,多模式为了方便操作系统多种角色安全等级需求 ARM寄存器组织 ARM 处理器有 37 个 32 位长的寄存器。 1 个用作 PC(程序指针)。...1 个用作 CPSR(程序状态寄存器)。 5 个用作 SPSR(备份程序状态寄存器)。 30 个用作通用寄存器。...两种风格 ARM官方的指令风格:指令一般用大写,一般用于Windows的开发环境(ADS,MDK等)如: LDR R0, [R1]。 GNU风格:指令一般用小写字母、linux中常用。...- 条件后缀决定了本句代码是否被执行,而不会影响上一句和下一句代码是否被执行。 多指令流水线 为增加处理器指令流的速度,ARM使用多级流水线.,下图为3级流水线工作原理示意图。...ARM 处理器支持 16 个协处理器。在程序执行过程中,每个协处理器忽略属于 ARM 处理器和其他协处理器的指令。

    1.4K11

    Linux下进程的创建过程分析(_do_fork do_fork详解)--Linux进程的管理与调度(八)

    ,而且由vfork()创建的子进程将先于父进程运行 clone Linux上创建线程一般使用的是pthread库 实际上linux也给我们提供了创建线程的系统调用,就是clone fork, vfork...由于系统调用是通过中断进程从用户态到内核态的一种特殊的函数调用,没有用户态或者内核态的堆栈可以被用来在调用函数和被调函数之间进行参数传递。系统调用通过CPU的寄存器来进行参数传递。..., 保存了调用的参数, 该参数使用的数据类型是特定体系结构的struct pt_regs,其中按照系统调用执行时寄存器在内核栈上的存储顺序, 保存了所有的寄存器, 即指向内核态堆栈通用寄存器值的指针,通用寄存器的值是在从用户态切换到内核态时被保存到内核态堆栈中的...当系统发生系统调用,即用户进程从用户态切换到内核态时,该结构体保存通用寄存器中的值,并被存放于内核态的堆栈中) stack_size 用户状态下栈的大小, 该参数通常是不必要的, 总被设置为0 parent_tidptr...sys_fork的实现 不同体系结构下的fork实现sys_fork主要是通过标志集合区分, 在大多数体系结构上, 典型的fork实现方式与如下 早期实现: 架构 实现 arm arch/arm/kernel

    2.6K20

    安卓逆向:这是一篇逆向基础ARM32指令集的总结

    这是一篇关于ARM32指令集的总结文章,后续会不断输出一系列逆向分析破解相关的文章。 ? ARM微处理器共有37个32位寄存器,其中31个为通用寄存器,6个为状态寄存器。...但是这些寄存器不能被同时访问,具体哪些寄存器是可以访问的,取决ARM处理器的工作状态及具体的运行模式。...ARM指令集可以分为跳转指令、数据处理指令、程序状态寄存器(PSR)处理指令、加载/存储指令、协处理器指令和异常产生指令六大类。 ?...ARM指令集中的跳转指令可以完成从当前指令向前或向后的32MB的地址空间的跳转,包括以下4条指令: 2.1 B 跳转指令 2.2 BL 带返回的跳转指令 2.3 BLX 带返回和状态切换的跳转指令...2.4BX 带状态切换的跳转指令 3.程序状态寄存器访问指令 状态寄存器有两个:MRS、MSR MRS指令用于将程序状态寄存器的内容传送到通用寄存器中。

    2.1K54

    C++代码和可执行程序在x86和arm上的区别

    它使用更多的寄存器来完成多个任务,实现了高吞吐量和性能。 能量消耗 ARM 处理器一次执行一条指令,它需要较少的硬件。与其他处理器相比,该处理器使用的寄存器没有更少。...X86 处理器更注重性能和高吞吐量,它使用更多的寄存器来实现它。因此,这里的功耗和热量产生更多。 Intel i7 是一款高端处理器,功耗为 130w。...ARM 处理器因其较低的功耗和较长的电池寿命而成为移动设备的首选,这对于为任何应用程序选择 CPU 至关重要。...软件 配备 ARM Process 的设备可在专为 ARM 开发的 Android 操作系统上运行。...台式机、笔记本电脑和服务器在为 X86 处理器开发的 Unix、Linux 和 Windows 等操作系统上运行。

    1.4K10

    一文看懂 | fork 系统调用

    ,而且由vfork()创建的子进程将先于父进程运行 clone Linux上创建线程一般使用的是pthread库 实际上linux也给我们提供了创建线程的系统调用,就是clone fork, vfork...由于系统调用是通过中断进程从用户态到内核态的一种特殊的函数调用,没有用户态或者内核态的堆栈可以被用来在调用函数和被调函数之间进行参数传递。系统调用通过CPU的寄存器来进行参数传递。..., 保存了调用的参数, 该参数使用的数据类型是特定体系结构的struct pt_regs,其中按照系统调用执行时寄存器在内核栈上的存储顺序, 保存了所有的寄存器, 即指向内核态堆栈通用寄存器值的指针,通用寄存器的值是在从用户态切换到内核态时被保存到内核态堆栈中的...当系统发生系统调用,即用户进程从用户态切换到内核态时,该结构体保存通用寄存器中的值,并被存放于内核态的堆栈中) stack_size 用户状态下栈的大小, 该参数通常是不必要的, 总被设置为0 parent_tidptr...主要是通过标志集合区分, 在大多数体系结构上, 典型的fork实现方式与如下 早期实现 架构 实现 arm arch/arm/kernel/sys_arm.c, line 239 i386 arch/i386

    2.5K30

    一文看懂 | fork 系统调用

    ,而且由vfork()创建的子进程将先于父进程运行 clone Linux上创建线程一般使用的是pthread库 实际上linux也给我们提供了创建线程的系统调用,就是clone fork, vfork...由于系统调用是通过中断进程从用户态到内核态的一种特殊的函数调用,没有用户态或者内核态的堆栈可以被用来在调用函数和被调函数之间进行参数传递。系统调用通过CPU的寄存器来进行参数传递。..., 保存了调用的参数, 该参数使用的数据类型是特定体系结构的struct pt_regs,其中按照系统调用执行时寄存器在内核栈上的存储顺序, 保存了所有的寄存器, 即指向内核态堆栈通用寄存器值的指针,通用寄存器的值是在从用户态切换到内核态时被保存到内核态堆栈中的...当系统发生系统调用,即用户进程从用户态切换到内核态时,该结构体保存通用寄存器中的值,并被存放于内核态的堆栈中) stack_size 用户状态下栈的大小, 该参数通常是不必要的, 总被设置为0 parent_tidptr...主要是通过标志集合区分, 在大多数体系结构上, 典型的fork实现方式与如下 早期实现 架构 实现 arm arch/arm/kernel/sys_arm.c, line 239 i386 arch/i386

    1.1K20

    Hypervisor Necromancy;恢复内核保护器(1)

    具体来说,我们 将展示一个为引导三星 S8+ 而开发的最小框架 专有的管理程序作为演示,提供详细信息和见解 关于 ARM 低级开发和虚拟化扩展的关键概念 供感兴趣的读者创建自己的框架并实际编译 并引导它们...当系统中存在管理程序时,它可以控制各个方面 EL1 行为,例如捕获某些传统上处理的操作 通过 EL1 到管理程序允许后者决定如何处理 手术。...这 内核还负责引导和初始化 RKP。在 另一方面,S10+ 虚拟机管理程序二进制文件驻留在单独的分区中,是 由引导加载程序引导,然后由内核初始化。我们会 在随后的相应部分中提供更多详细信息。...此外,各种可用的预言机将 可以检查后面讨论的以验证系统的有效性 初始化完成后配置。 堆栈指针 (SP_ELn) 设置为预定义区域,任意大小 每个 8kB。...异常处理程序保存当前 处理器状态(通用和状态寄存器)并调用 第二阶段处理程序。

    3K540

    嵌入式软件工程师笔试面试指南-ARM体系与架构

    举例来说,我们常说的x86 Linux平台实际上是Intel x86体系结构和Linux for x86操作系统的统称;而x86 WinNT平台实际上是Intel x86体系结构和Windows NT...如果异常中断处理程序中使用它自己的物理寄存器之外的其他寄存器,异常中断处理程序必须保存和恢复这些寄存器) 管理模式(SVC) 管理模式是CPU上电后默认模式,因此,在该模式下主要用来做系统的初始化,软中断处理也在该模式下...剩下的六种模式中除去系统模式外,统称为异常模式。 Arm有多少32位寄存器? ARM处理器共有37个寄存器。它包含31个通用寄存器和6个状态寄存器。 Arm2440和6410有什么区别? 主频不同。...Arm处理器有几种工作状态? 从编程的角度来看,ARM微处理器的工作状态一般ARM和Thumb有两种,并可在两种状态之间切换。...若异常是从ARM状态进入,则LR寄存器中保存的是下一条指令的地址(当前PC+4或PC+8,与异常的类型有关);若异常是从Thumb状态进入,则在LR寄存器中保存当前PC的偏移量,这样,异常处理程序就不需要确定异常是从何种状态进入的

    1.7K50
    领券