首页
学习
活动
专区
圈层
工具
发布

ARMv8 异常处理简介

它包括31个通用寄存器R0-R30。这些寄存器可以作为31个64位寄存器X0-X30或31个32位寄存器W0-W30进行访问。...堆栈指针寄存器选择: 在EL0上执行时,处理器使用EL0堆栈指针SP_EL0。在其他任何异常级别执行时,可以将处理器配置为使用SP_EL0或配置为对应该异常级别的堆栈指针SP_ELx。...可以通过异常级别的堆栈指针后缀表明所选的堆栈指针: t表明使用SP_EL0堆栈指针。 h表明使用SP_ELx堆栈指针。 t和h后缀基于线程(thread)和处理程序(handler)的首字母。 ?...检查发生异常时PSTATE的值,确定引起异常指令的当前执行状态和异常级别,例如,当前执行状态是AArch64还是AArch32等。...堆栈指针保存到目标异常级别的专用堆栈指针寄存器SP_ELx。 执行移至目标异常级别,并从异常向量定义的地址开始执行。

3.9K32

第二章 IBM-PC微机的基本功能

输出设备将计算机处理后的结果转换为人或其它系统能识别的信息形式向外输出。 如显示器、打印机等。 有的设备既具有输入功能又具有输出功能。 如磁盘、磁带、触摸显示屏等。...每个存储段用一个段寄存器来指明该段的起始位置(也叫段基址)。 CPU在访问存储器时必须指明两个内容: 所访问的存储单元属于哪个段,即指明使用的段寄存器。...2.4堆栈及其操作方法 2.4堆栈及其操作方法(理解,掌握) 堆栈是一个特定的存储区,访问该存储区一般需要按照专门的规则进行操作。...即最先送入堆栈的数据要到最后才能取出,而最后送入堆栈的数据,最先取出。 二、8086/8088堆栈的组织 在8086/8088微机中堆栈是由堆栈段寄存器SS指示的一段存储区。...2.进栈PUSH 进栈就是把数据存入堆栈。 由指令PUSH或者由机器自动实现,可以将通用寄存器、段寄存器或字存储单元的内容压入堆栈顶部。

97220
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    结合多种系统api来理解堆栈的概念

    ; 函数返回地址,arm中一般函数的返回地址是专门保存到 LR(LinkRegister)寄存器中的,如果这个函数里面还调用了一个函数的话,这个存储了函数返回地址的 LR 寄存器内容是要入栈的; 函数内部的状态保存操作也需要额外的栈空间...堆(heap):堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。...当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减) 栈(stack):栈又称堆栈, 是用户存放程序临时创建的局部变量...进程栈是属于用户态栈,和进程 虚拟地址空间 (Virtual Address Space) 密切相关。那我们先了解下什么是虚拟地址空间:在 32 位机器下,虚拟地址空间大小为 4G。...每个进程都拥有一套属于它自己的页表,因此对于每个进程而言都好像独享了整个虚拟地址空间。

    52620

    java中的堆与栈

    前言:java中常常听到堆栈,但是好多时候感觉还是一个模糊的认识。因此,一定要认真的看下这方面的东西,查阅资料。并作出总结。...堆与栈 基本认识 基本认识 首先呢,提出问题:内存中的堆栈和数据结构中的堆栈是否是一样的? 不必过于深刻的去探究的话,也会想到,当然是不同的概念啦!...内存中的堆栈是实际存在的存储空间,数据结构中的堆栈只是抽象出来的数据存储结构。 具体的话,首先,内存中所谓的堆栈其实是属于其中的一个划分,叫做动态存储区。动态存储区的话,就分为栈区和堆区。...标签: Java 可能,如果没有对硬件有一个轮廓认识的话,其实一切都似乎是抽象出来的。 要说明的是,堆栈位于RAM中中。当然。栈的存取数据的速度还是仅次于cpu中的寄存器的。...下面是摘录的一些详细的说明 : 1,寄存器,在是cpu中的一块空间,速度比较快…Java不能直接对寄存器操作 2,堆栈位于RAM中,速度仅次于寄存器…将基本数据类型和对象的引用,方法的形式参数存储在栈中

    79440

    攻击本地主机漏洞(中)

    缓冲区溢出 应用程序将静态(堆栈)或动态(堆)存储变量和分配内存,两者都存储在计算机的随机存取内存(RAM)中。在堆栈上分配的变量可以快速访问并直接存储到内存中。...堆是特定于应用程序的(例如基于Java的应用程序),访问内存的速度比堆栈慢一些,因为变量是在运行时分配的,它可以容纳比堆栈更多的数据,这取决于对象在程序中声明时的大小。...基于堆栈的缓冲区溢出类似于前面的堆示例,因此,当程序向缓冲区写入的数据超过堆栈分配的处理量时,可能会导致覆盖现有堆栈数据,并在覆盖指令指针时导致拒绝服务或任意代码执行。...注:计算机通过寄存器管理堆栈。寄存器作为内存中的专用位置,在使用数据时存储数据。大多数寄存器临时存储用于处理的值。在堆栈中存储最后一个程序请求地址的小寄存器称为堆栈指针。...RSP(堆栈指针)、RBP(基指针)和RIP(指令指针)是帮助促进程序执行的重要寄存器。

    2.1K20

    【C++】自引用this指针的秘密

    this是一个指针,它时时刻刻指向这个个实例。 识别一个类可以分为哪三步? ①识别类名。 ②识别数据成员。 ③识别成员函数并修改之。...,即this指针的值是当前调用成员函数的对象的起始地址。...堆、栈、全局变量还是其他地方? this指针会因编译器不同,而放置的位置不同。可能是栈,也可能是寄存器,甚至全局变量。 this指针是如何访问类中的变量的?...还是在函数参数的首参数就是this指针? 大多数编译器通过ecx寄存器传递this指针。事实上,这也是一个潜规则。一般来说,不同编译器都会遵从一致的传参规则,否则不同编译器产生的obj就无法匹配了。...静态成员函数并不是针对某个类的实例对象,而是属于整个类的,为所有的对象实例所共有。它在作用域的范围内是全局的,独立于类的对象之外的。它只对类内部的静态成员变量做操作。

    1.2K20

    【Linux】对信号产生的内核级理解

    然后操作系统会判定键盘文件中用户输入的数据是命令还是普通的数据,如果是普通数据操作系统就直接将将数据写到键盘文件的缓冲区中,让对应的进程读到,如果是命令,操作系统就会解释成信号发送给对应的进程。...变址寄存器和指针寄存器 ESI, EDI: 32位变址寄存器,常用于数组访问和字符串操作。 ESP, EBP: 32位堆栈指针和基指针寄存器,用于管理堆栈和访问堆栈上的数据。...当我们的程序出现除0错误时,CPU中的标志寄存器(EFlags)中的溢出标志位被设置为1,CPU识别到标志寄存器中的溢出标志位被设置为1,就会转而通知操作系统,操作系统就会向正在执行的进程发送SIGFPE...2.2、野指针 CPU中还有两个寄存器: CR2寄存器:功能:CR2存放发生页错误时的虚拟地址。当CPU尝试访问一个未映射或不可访问的虚拟地址时,会触发页错误,此时CR2会保存导致错误的虚拟地址。...CR3寄存器:功能:CR3用于存放最高级页目录地址(物理地址)。在分页机制中,页目录是存储页面表物理地址的数据结构,而CR3则指向这个页目录的基地址。

    37810

    内核态与用户态_linux内核态和用户态通信

    最后一个堆栈段(注意,堆栈是Stack,堆是Heap,不是同一个东西),堆栈可太重要了,这里存放着局部变量和函数参数等数据。例如递归算法就是靠栈实现的。栈的地址是向下增长的。...堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。...一般大家说的堆栈和栈是一样的,就是栈(stack),而说堆时才是堆heap。栈是先入后出的,一般是由高地址向低地址生长。 (1)让我们忽略Linux对段式内存映射的支持。...在保护模式下,我们知道无论CPU运行于用户态还是核心态,CPU执行程序所访问的地址都是虚拟地址,MMU 必须通过读取控制寄存器CR3中的值作为当前页面目录的指针,进而根据分页内存映射机制(参看相关文档)...准备复制之前内核先要确定用户空间地址和长度的合法性,至于从该用户空间地址开始的某个长度的整个区间是否已经映射并不去检查,如果区间内某个地址未映射或读写权限等问题出现时,则视为坏地址,就产生一个页面异常,

    2.3K20

    JavaScript 是如何工作的:JavaScript 的共享传递和按值传递

    的值是重新指向的那个,即 [1, 2],但最后打印结果可以看出 arr1 的值还是原先的值,这是为什么呢?...调用堆::这个区域跟踪当前正在执行的函数,执行计算并存储局部变量。变量以后进先出法存储在堆栈中。最后一个进来的是第一个出去的,数值数据类型存储在这里。...在这里,变量 corn 和 lion 值在执行期间存储在堆栈中。 堆:是分配 JavaScript 引用数据类型(如对象)的地方。 与堆栈不同,内存分配是随机放置的,没有 LIFO策略。...Here,lion 和 tiger 是引用类型,它们的值存储在堆中,并被推入堆栈。它们在堆栈中的值是堆中位置的内存地址。...(ebp+4)是地址 0x12223 ,即 n 所在地址也是对象 {number: 90} 在堆中的位置。这里,堆栈位置被值 0x002231 覆盖。现在,num1 指向另一个内存地址。

    5.2K41

    汇编和栈

    之前说过:栈是从 高地址 -> 低地址 ,堆是从 低地址 -> 高地址 ,而 Windows 中栈是在堆的下方,所以 Windows 中内存是从 中间向两边分布 。...而 Linux 中 栈是在堆的上面,所以 Linux 中的内存是 从两边向中间分布 。 很迷惑吗?通过下面这个图片你可以看出栈的移动方式。 栈从高位地址开始。确切地说,它的高度取决于操作系统的内核。...栈的大小是有限的,并且随着内存地址空间的向下增长而增加。当栈上的空间用完时,指向栈 “顶部” 的指针从最高地址向下移动到最低地址。 一旦栈达到内核给定的有限大小,或者如果栈越过了堆的边界,则称栈溢出。...还有一个重要的寄存器是基址指针寄存器(RBP),在执行在方法 / 函数内部时有多种用途,程序使用 RBP 的偏移量来访问局部变量或函数参数。...接下来,RSP 递增 0x8,还是那句话 栈是从大到小的增长,所以递增 以下是 pop 的示例: pop rdx 这将 RSP 寄存器的值存储到 RDX 寄存器中,然后递增 RSP 寄存器。

    4.5K20

    C++ CreateThread的使用

    不管是指针还是句柄, 都不过是内存中的一小块数据(一般用结构描述), 微软并没有公开句柄的结构细节, 猜一下它应该包括: 真实的指针地址、访问权限设置、引用计数等等....尽管可以用 Addr(类名.方法名) 或 MethodAddress('published 区的方法名') 获取类中方法的地址, 但都不能当做线程的入口函数, 原因可能是因为类中的方法的地址是在实例化为对象时动态分配的...CreateThread 第三个参数是函数指针, 新线程建立后将立即执行该函数, 函数执行完毕, 系统将销毁此线程从而结束多线程的故事. 6、参数2:堆栈大小 栈是私有的但堆是公用的 CreateThread...这首先这可以让我们知道: 每个线程都有自己独立的堆栈(也拥有自己的消息队列). 什么是堆栈? 其实堆是堆、栈是栈, 有时 "栈" 也被叫做 "堆栈"....它们都是进程中的内存区域, 主要是存取方式不同(栈:先进后出; 堆:先进先出); "栈"(或叫堆栈)适合存取临时而轻便的变量, 主要用来储存局部变量; 譬如 for i := 0 to 99 do 中的

    1.5K30

    RTOS应用跳转至Bootloader后串口发送数据引发HardFault

    如果从Bootloader跳转到应用时,任务的上下文(包括堆栈)可能未正确恢复,或者堆栈空间不足以处理串口数据发送操作,导致栈溢出或堆栈指针失效。 堆空间管理:RTOS管理堆内存的分配与释放。...如果堆内存分配不当,可能导致在向串口发送数据时出现内存访问冲突。 解决方案: 检查堆栈和堆的分配:确认在RTOS应用中,堆栈和堆空间是否足够大,避免与其他内存区域发生冲突。...你可以尝试在跳转前确认RTOS的任务栈大小和堆的状态。 上下文恢复:检查在从Bootloader跳转到应用时,是否正确恢复了堆栈指针。可以在跳转时,手动恢复堆栈指针和其他重要的寄存器信息。...问题点分析: 跳转地址:Bootloader和应用之间的跳转地址必须正确设置。如果跳转地址错误,或者跳转后堆栈指针(SP)和程序计数器(PC)没有正确初始化,会导致异常的程序行为。...解决方案:手动设置跳转地址,确保从Bootloader跳转到应用时,正确设置程序计数器(PC)和堆栈指针(SP),并且确保跳转时的环境状态是稳定的。

    59700

    Android内存管理(三)内存管理基础

    寄存器(Register):CPU内部的高速存储区域 当一个程序加载到内存中时,它由四个内存区域组成: 堆栈(Stack):存储由该程序的每个函数创建的临时变量 堆(Heap):该区域特别适用于动态内存分配...(虚拟内存) Swapping(交换) Segmentation(分段) Paging(分页) Base and limit registers(基址寄存器和界限寄存器) 必须限制进程,以便它们只能访问属于该特定进程的内存位置...每个进程都有一个基址寄存器和限制寄存器: 基址寄存器保存最小的有效存储器地址 限制寄存器指定范围的大小 例如,process 2的有效内存地址是300040到420940 ?...所有程序都使用虚拟内存地址 虚拟地址会被转换为物理地址 物理地址表示数据的实际物理位置 物理位置可以是内存或磁盘 ? ? ?...Segmentation(分段) 分段是一种将内存分解为逻辑片段的技术,其中每个片段代表一组相关信息。例如,将每个进程按照堆栈,堆,数据以及代码分为不同的段,还有OS内核的数据段等。

    2.1K20

    微机原理与接口技术 重点详解与章节总结——指令系统和汇编程序设计

    五、寄存器 相对 寻址方式(Register relative addressing) •通过基址寄存器BX、BP或变址寄存器SI、DI与一个位移量相加形成有效地址,计算物理地址的缺省段是**SI、DI...表格的首地址可设置为位移量,修改基址或变址寄存器的内容取得表格中的值。...微处理器可以识别的每一条指令称为机器指令,每一种处理器都有自己可以识别的一整套指令,称为指令集或指令系统。...微指令是微程序级的命令,属于硬件;宏指令是由若干机器指令组成,属于软件;机器指令介于二者之间,因而是硬件和软件的界面。...当然,操作数也可以存放在堆栈中(堆栈是存储器的一个特殊区域),只要知道堆栈指针,就可以用栈操作指令寻找操作数。

    1.6K30

    详解CC++堆栈的工作机制

    EBP寄存器是用于访问堆栈中的数据的,它指向堆栈中间的某个位置(具体位置后文会具体讲解),函数的参数地址比EBP的值高,而函数的局部变量地址比EBP的值低,因此参数或局部变量总是通过EBP加减一定的偏移地址来访问的...因此,通过EBP很容易查找函数是被谁调用的或者访问函数的参数(或局部变量)。 为局部变量分配地址 接着,foo函数将为局部变量分配地址。...函数用EBP寄存器来访问参数和局部变量。我们知道,参数的地址总是比EBP的值高,而局部变量的地址总是比EBP的值低。而在特定的堆栈帧中,每个参数或局部变量相对于EBP的地址偏移总是固定的。...返回值是如何传递的 堆栈帧建立起后,函数的代码真正地开始执行,它会操作堆栈中的参数,操作堆栈中的局部变量,甚至在堆(Heap)上创建对象,balabala…....如果返回值为double或float型,函数将把返回值赋予浮点寄存器,通过浮点寄存器返回。 4. 如果返回值是一个大于8字节的数据,将如何传递返回值呢?

    85220

    C语言 | C++ 堆栈工作机制

    EBP 寄存器是用于访问堆栈中的数据的,它指向堆栈中间的某个位置(具体位置后文会具体讲解),函数的参数地址比 EBP 的值高,而函数的局部变量地址比 EBP 的值低,因此参数或局部变量总是通过 EBP...因此,通过 EBP 很容易查找函数是被谁调用的或者访问函数的参数(或局部变量)。 为局部变量分配地址 接着,foo 函数将为局部变量分配地址。...而在特定的堆栈帧中,每个参数或局部变量相对于 EBP 的地址偏移总是固定的。因此函数对参数和局部变量的的访问是通过 EBP 加上某个偏移量来访问的。...返回值是如何传递的 堆栈帧建立起后,函数的代码真正地开始执行,它会操作堆栈中的参数,操作堆栈中的局部变量,甚至在堆(Heap)上创建对象,balabala…....对的,堆栈帧是被销毁了,但是程序不会自动清理其中的值,因此 ReturnValuePointer 中的值还是有效的。

    8.3K88

    经典面试题(三)之栈详解

    我们常常说堆栈堆栈,但是堆和栈其实是完全不同的两个概念。栈其实完全是为了函数调用而设计的,那么函数调用如何通过栈实现的呢?不用函数调用方式,栈在行为上有什么区别呢?...(3)堆区:进程可以在堆区动态地请求一定大小的内存,并在用完之后归还给堆区。动态分配内存和回收内存是堆区的特点。...值得一提的是,栈除了扮演存放原料、半成品的仓库之外,它还是车间调度主任的办公室。 程序中所使用的缓冲区可以是堆区、栈区和存放静态变景的数据区。...这包括参数传递方式,参数入栈顺序是从右向左还是从左向古,函数返回时恢复堆栈平衡的操作在子函数中进行还是在母函数中进行。表2-1-1列出了几种调用方式之间的差异。 ?...具体包括: 在堆栈平衡的基础上,给ESP加上栈帧的大小,降低栈顶,回收当前栈帧的空间。 将当前栈帧底部保存的前栈帧EBP值弹入EBP寄存器,恢复出上一个栈帧。 将函数返回地址弹给EIP寄存器。

    1.5K30

    逆向工程——汇编基础

    通过堆栈窗口我们可以看到: 堆栈的结构是从下往上减少; 栈顶的位置是0021f7bc; 两个相邻的栈地址相差4h。 POP/PUSH操作 PUSH EAX: ?...如果需要,只能通过堆或栈自行实现。 参数的传递是靠寄存器或堆栈来完成的。高级语言中,子程序(函数/过程,或者类似概念的东西)依赖于堆和栈来传递。...子程序使用RET或RETF指令返回。此时,CPU将IP置为堆栈中保存的地址,并继续予以执行。 毋庸置疑,堆栈在整个过程中发挥着非常重要的作用。...不过,本质上对子程序最重要的还是返回地址,如果子程序不知道这个地址,那么系统将会崩溃。...可重入代码最主要的要求就是,程序不应使用某个指定的内存地址的内存(对于高级语言来说,这通常是全局变量,或对象的成员)。如果可能的话,应使用寄存器,或其他方式来解决。

    1.5K10

    【编程基础】C函数的调用过程

    这几天在看GCC Inline Assembly,在C代码中通过asm或__asm__嵌入一些汇编代码,如进行系统调用,使用寄存器以提高性能能,需要对函数调用过程中的堆栈帧(Stack Frame)、CPU...32位虚拟地址空间的高1GB的空间是留给操作系统内核的,栈由高地址到低地址向下增长,堆由低地址到高地址向上增长。 C中如 malloc 等分配的内存在堆中分配。...(3) 保存调用方函数的EBP寄存器,即将调用方函数的EBP压入堆栈,并令EBP指向此栈中的地址:pushl %ebp; movl %esp, %ebp。由被调函数执行。...(4) 上下文:保存在函数调用过程中需要保持不变的寄存器(函数调用方的),如ebx,esi,edi等。由被调函数执行。 (5) 临时变量,如非静态局部变量。 下面是一个函数的堆栈帧结构图: ?...压入函数参数和返回地址的过程是由函数调用方在调用函数之前将其压入栈中,每个函数执行后首先要执行的就是把函数调用方的EBP寄存器压入栈中,之后是在栈上开辟一些空间存放局部变量,最后把要保存的寄存器压入栈中

    1.1K50

    jvm结构说明

    继上文 :jvm相关知识 ---- 感谢观看,获取“jvm相关学习资料”,请关注或私聊,回复"jvm"获取相关学习资源! ? ?...每一个栈帧都包括了局部变量表,操作数栈,动态连接,方法返回地址和一些额外的附加信息。 以上会在单独篇章详细描述! 基于栈指令集与基于寄存器的区别在哪?...基于栈指令集 可移植性好,不依赖硬件,可跨平台; 使用零地址指令方式分配,避免寄存器分配难题; 设计与实现简单,适合于资源有限的系统; 基于寄存器 可移植性差,指令集完全依赖硬件; 更少指令,执行高效,...性能高; 大部分情况下使用的指令是一址地指令、二址地指令、三址地指令; 个人理解 基于栈速度较慢,但是可移植性好,基于寄存器速度快,但是可移植性差。...OutOfMemoryError; 其他与虚拟机栈差不多; java堆 java堆(java Heap)属于虚拟机所管理最大的一块。

    61510
    领券