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

Rust 学习(前置:一)

这两个概念只是初略概念 我们深挖一下堆栈的设计原理: 栈 栈是程序运行的基础。每当一个函数被调用时,一块连续的内存就会在栈顶被分配出来,这块内存被称为帧(frame)。...所以,我们无法把字符串本身放在栈上,只能先将其放在堆上,然后在栈上分配对应的指针,引用堆上的内存。 放栈上的问题 从刚才的图中你也可以直观看到,栈上的内存分配是非常高效的。...过大的栈内存分配是导致栈溢出的原因之一,更广为人知的原因是递归函数没有妥善终止。一个递归函数会不断调用自己,每次调用都会形成一个新的帧,如果递归函数无法终止,最终就会导致栈溢出。...这时候就可能会访问野指针(野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)指针变量在定义时如果未初始化,其值是随机的,指针变量的值是别的变量的地址,意味着指针指向了一个地址是不确定的变量...,此时去解引用就是去访问了一个不确定的地址,所以结果是不可知的。)

63320

4.2.2 常见的数据寻址方式

2.立即(数)寻址 这种类型的指针的地址字段指出的不是操作数的地址么事操作数本身,又称为立即数。数据是用补码形式存放的。...7.相对寻址 相对寻址是把程序计数器PC的内容加上指令格式中的形式地址A而形成操作数的有效地址。即EA=(PC)+A,其中A是相对于当前地址的位移量,可正可负,补码表示。...变址寻址的优点是可扩大寻址范围(变址寄存器的位数大于形式地址A的位数),在数组处理过程中,可设定A为数组的首地址,不断改变变址寄存器IX的内容,便可很容易形成数组中任意数据的地址,特别适合编制循环程序。...10.堆栈寻址 堆栈是存储器(或专用寄存器组)中一块特定的按“先进后出(LIFO)”原则管理的存储区,该存储区中被读、写单元的地址是用特定的寄存器给出的,该寄存器称为堆栈指针(SP)。...堆栈可分为硬堆栈和软堆栈两种。 寄存器堆栈又称为硬堆栈。寄存器堆栈的成本比较高,不适合做大容量的堆栈;而从主存中划出一段区域来做堆栈是最合算且最常用的方法,这种堆栈称为软堆栈。

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

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

    具体包括: 取指令——根据CS寄存器和指令指针IP形成20位的物理地址,从相应的存储器单元中取出指令,暂存到指令队列中,等待EU取走并执行。...2.指针寄存器 指针寄存器有堆栈指针SP和基址指针BP 它们一般被用来存放16位地址,在形成20位的物理地址时常被作为偏移量使用。...三、指令指针IP CPU在从存储器取指令时,以段寄存器CS作为代码段的基址指针,以IP的内容作为偏移量,共同形成一条指令的存放地址。...字数据的表示范围为:-32768~+32767 注意:溢出与进位是两个完全不同的概念,不能相互混淆。...每个段的基址(段基址)必须是一个小节的首址。 段基址—一个段的起始地址。 在存储器中规定从0地址开始,每16个字节单元称为一个小节(Paragraph)。

    38220

    ARM-Cortex M核心的启动过程

    中断向量表中的第一个条目是初始堆栈指针(SP)的值,第二个条目是复位向量(Reset Handler)的地址。...在跳转到应用程序之前,需要关闭所有中断,以避免在跳转过程中发生中断导致不可预知的行为。 从应用程序的起始地址(即中断向量表的第一个条目)读取初始堆栈指针的值,并将其设置为当前堆栈指针。...从应用程序的起始地址+4的位置读取复位向量的地址,并将其强制转换为函数指针,然后跳转到该地址执行。...&0x2FFE0000:掩码操作,用于检查栈顶地址是否在RAM范围内(通常RAM的起始地址是 0x20000000)。...是这样 跳转到应用程序: jump2app():通过函数指针跳转到应用程序的复位中断地址,开始执行应用程序。 栈顶地址检查:确保应用程序的栈顶地址在合法的RAM范围内。

    12910

    空指针和野指针的区别和定义

    1.定义 空指针是指一个指针变量没有被初始化,即没有被赋予具体的内存地址。在程序中,空指针表示指向“空”的内存地址。 野指针是指一个指针变量指向一个无效的内存地址,即指针的值不是有效的内存地址。...3.空指针和野指针的形成方式: 空指针的形成: 在声明指针变量时,没有给它赋初值。此时指针变量的值是不确定的,称为空指针。 执行指针变量的值为NULL的赋值操作,将其设置为空指针。...野指针的形成: 在声明指针变量后,没有立即给它赋初值,而是直接使用它进行操作,此时指针变量的值是不确定的,可能指向任意的内存地址,这种指针就称为野指针。...在函数中返回局部变量的指针,因为局部变量会在函数结束后被销毁,返回的指针就变成了野指针。 需要注意的是,使用空指针或野指针进行操作都是不安全的,可能导致程序出错或发生不可预料的行为。...对野指针进行访问或者赋值操作会导致程序崩溃或者产生未定义的行为。 空指针: 空指针是指没有指向任何有效内存地址的指针,它的值为NULL。空指针常常在链表的初始化或者结束判断时使用。

    37810

    博主精心收集的计组重点知识点(一)

    目标转移地址的形成方式主要有三种:立即寻址(直接地址)、相对寻址(相对地址)和间接寻址(间接地址)。...不过,这里所讲的使用方式并不是绝对的,在实际的计算机设计中,可能会有不同的应用场合和使用方式。 23.什么是相对寻址方式? 答:相对寻址方式的有效地址形成方法如下:指令中的形式地址给出一个位移量D。...栈底固定不动,栈顶浮动,用一个专门的寄存器(SP)来作为栈顶指针。从堆栈生长的方向来分,可以有“自顶向下”和“自底向上”两种堆栈,它们在进、出栈时对栈指针的修改是不同的。...子程序的最后一条指令一定是返回指令。一般返回地址保存在堆栈中,所以返回指令中不需要明显给出返回地址,直接从栈顶取地址作为返回地址。...如果有些计算机不采用堆栈保存返回地址,而是存放到其他不确定的地方,则返回指令中必须有一个地址码,用来指出返回地址或指出返回地址的存放位置。 28.转移指令和转子(调用)指令的区别是什么?

    1.5K30

    调试coredump步骤(coredump原理)

    此外,程序崩溃引发系统记录coredump文件的原因是众多的,野指针、空指针访问只是其中一种,如堆栈溢出、内存越界等等都会引起coredump,利用好coredump文件,可以帮助我们解决实际项目中的异常问题...一个coredump文件主要包含了应用程序的内存信息、寄存器状态、堆栈地址、函数调用上下文,开发人员通过分析这些信息,确定程序异常发生时的调用位置,如果是堆栈溢出,还需分析多层函数的调用信息。   ...面对这种情况,我们是束手无策的,一方面是程序发生错误后没有记录到有参考意义的信息(当然,可以通过仿真器实时获取堆栈信息,但对于实际产品不不现实);另一方面是问题复现概率比较低,复现条件不确定。...【1】内存访问越界 数组下标越界 超出动态(malloc/new)内存申请范围 字符串没有结束符,一些函数依赖于字符串结束符,如 strcpy、strcmp、sprintf 【2】访问非法指针 空指针(...未申请内存) 野指针(已释放内存) 重复释放指针(内存) 指针强制转换,指针强制转换需特别谨慎,可能因为对齐、起始地址等问题引起内存访问错误 【3】堆栈溢出,分配大量局部变量、多重函数调用、较深的函数递归等可能导致堆栈溢出

    2.9K21

    缓冲区溢出与攻防博弈

    参考文献:msf魔鬼训练营,灰冒黑客 缓冲区溢出: 缓冲区溢出(Buffer Overflow),分为栈溢出与堆溢出,此类漏洞的原理是,程序由于缺乏对缓冲区的边界进行合理化的检测而引起的一种异常行为,通常是程序存在过滤不严格的输入点...,通过这些输入点攻击者可以向程序中写入超过了程序员预先定义好的缓冲边界,从而覆盖了相邻的内存区域,造成程序中的变量覆盖,甚至控制EIP指针,从而造成程序的非预期行为,而像 C/C++ 程序中本身就缺乏内在的内存安全分配与管理...指令从栈地址中弹出压入的返回地址,并将返回地址重新装载到EIP指令指针寄存器中,从而继续运行,然而将这种控制程序执行流程的地址保存到栈中,必然会给栈溢出攻击带来可行性。...SEHOP 地址空间布局随机化保护 ASLR 堆栈数据执行保护 DEP ---- 堆栈缓冲区溢出检测保护 GS (编译器) 保护原理: 该保护是通过编译器进行限制的,GS选项是微软堆栈检测仪概念的具体实现...堆栈 SEH 覆盖保护 SEHOP 保护原理: 随后防守方进一步提出了 SEHOP 技术,该技术默认从 Windows Vista 开始支持,而该技术在Win7-Win8系统上默认是关闭的,你可以通过注册表开启该选项

    85210

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

    :对于类定义的不同对象,其地址对应相应的值,即this指针的值是当前调用成员函数的对象的起始地址。..._thiscall调用约定 ①_thiscall只能够用在类的成员函数上。 ②参数从右向左压栈。...③如果参数个数确定,this指针通过ecx传递给被调用者,如果参数不确定,this指针在所有参数被压栈后压入堆栈。 ④对参数个数不定的,调用者清理堆栈,否则函数自己清理堆栈。...在call之前,编译器会把对应的对象地址放到eax中。this是通过函数参数的首参来传递的。this指针在调用之前生成,至于“类实例后函数”,没有这个说法。...静态成员函数并不是针对某个类的实例对象,而是属于整个类的,为所有的对象实例所共有。它在作用域的范围内是全局的,独立于类的对象之外的。它只对类内部的静态成员变量做操作。

    84820

    ARM cortexM4异常处理(2)

    中断向量表 有人会问,不是讲异常吗,怎么讲到中断向量表,其实我们在前面提高过,异常也是一种中断,在中断向量表中有他自己的位置,中断向量表包含堆栈指针的复位值,起始地址,也叫异常向量,中断向量表包含所有的异常向量如下图所示...系统复位后,中断向量表固定从0地址开始,特权模式下软件可以修改中断向量表的起始地址到其他地址,这个地址是有范围限制的,可以在0x00000080~0x3FFFFF80范围内修改。...Reset,HardFault,NMI异常的优先级是固定的且为负数,比其他的异常优先级要高,这点要注意。高优先级的异常可以抢占低优先级的异常处理。...返回: 异常返回发生在当处理器处于Handler模式并且执行指令装载EXC_RETURN到PC指针,EXC_RETURN是在异常入口时装载到链接寄存器LR中的值,异常机制依赖于这个值检测什么时候处理器完成了异常处理...EXC_RETURN低五位会提供堆栈返回和处理器模式的信息。异常返回的行为可以通过EXC_RETURN得值看出,具体的值如下图所示: ?

    83870

    分歧还是共存?详解Android内核安全

    具体可以检测到以下异常情况: 堆栈和堆缓冲区上溢/下溢 释放之后的堆使用情况 超出范围的堆栈使用情况 重复释放/错误释放 返回之后的堆栈使用情况 HWASan基于内存标记方法,在这种方法中,小的随机标记值同时与指针和内存地址范围相关联...五、KASAN Android包括内核地址排错程序(KASAN)。KASAN是内核与编译时修改的组合,形成了一个插桩系统,可以实现更简单的错误发现和根本原因分析。...KASAN可以检测内核中许多类型的内存违规行为。它还可以检测堆栈、堆和全局变量中的出界读取和写入操作,并可检测释放后再使用和双重释放错误。...ARM的内存标记扩展(MTE)可以帮助解决内存安全问题。MTE的工作原理是对堆栈、堆和全局变量上的每次内存分配的第 56到59个地址位加标记。...返回地址也存储在常规堆栈中,以便与展开程序兼容,但除此之外就没有用处。这样可以确保攻击行为(修改常规堆栈上的返回地址)不会对程序控制流造成任何影响。

    1.5K30

    5.1 缓冲区溢出与攻防博弈

    ,从而覆盖了相邻的内存区域,造成程序中的变量覆盖,甚至控制CPU中的EIP寄存器指针,从而造成程序的非预期行为,而像C/C++程序中本身就缺乏内在的内存安全分配与管理,因此缓冲区溢出漏洞大部分都出现在编译型语言中...,而函数执行完毕后,则会通过ret指令从栈地址中弹出压入的返回地址,并将返回地址重新装载到EIP指令指针寄存器中,从而继续运行,然而将这种控制程序执行流程的地址保存到栈中,必然会给栈溢出攻击带来可行性。...SEHOP4.地址空间布局随机化保护 ASLR5.堆栈数据执行保护 DEP5.1.1 GS堆栈缓冲区溢出检测保护保护机制实现原理GS(/GS)是微软针对缓冲区溢出攻击提出的一种保护机制,全称为"Buffer...GS保护机制是微软堆栈检测仪概念的具体实现,从Visual Studio系列的编译器上就加入了GS保护机制且默认开启,操作系统从WindowsXP开始就已经全面支持该选项了。...5.1.3 SEHOP堆栈SEH覆盖保护保护机制实现原理随后防守方进一步提出了SEHOP技术,该技术默认从Windows Vista开始支持,而该技术在Win7-Win8系统上默认是关闭的,你可以通过注册表开启该选项

    30920

    5.1 缓冲区溢出与攻防博弈

    ,从而覆盖了相邻的内存区域,造成程序中的变量覆盖,甚至控制CPU中的EIP寄存器指针,从而造成程序的非预期行为,而像C/C++程序中本身就缺乏内在的内存安全分配与管理,因此缓冲区溢出漏洞大部分都出现在编译型语言中...,而函数执行完毕后,则会通过ret指令从栈地址中弹出压入的返回地址,并将返回地址重新装载到EIP指令指针寄存器中,从而继续运行,然而将这种控制程序执行流程的地址保存到栈中,必然会给栈溢出攻击带来可行性。...覆盖保护 SEHOP 4.地址空间布局随机化保护 ASLR 5.堆栈数据执行保护 DEP 5.1.1 GS堆栈缓冲区溢出检测保护 保护机制实现原理 GS(/GS)是微软针对缓冲区溢出攻击提出的一种保护机制...GS保护机制是微软堆栈检测仪概念的具体实现,从Visual Studio系列的编译器上就加入了GS保护机制且默认开启,操作系统从WindowsXP开始就已经全面支持该选项了。...5.1.3 SEHOP堆栈SEH覆盖保护 保护机制实现原理 随后防守方进一步提出了SEHOP技术,该技术默认从Windows Vista开始支持,而该技术在Win7-Win8系统上默认是关闭的,你可以通过注册表开启该选项

    44240

    联盟链智能合约安全浅析

    错误的将函数地址当作函数、条件表达式、运算操作对象使用,甚至参与逻辑运算,将导致各种非预期的程序行为发生。...对空指针的解引用会导致未定义的行为。在很多平台上,解引用空指针可能会导致程序异常终止或拒绝服务。如:在 Linux 系统中访问空指针会产生 Segmentation fault 的错误。...当出现越界时,由于无法得知被访问空间存储的内容,所以会产生不确定的行为,可能是程序崩溃、运算结果非预期。 ? ?...因此,从数据库读取、写入或从合约返回的数据不应依赖于全局状态变量。 ? ?...如近期爆出的Filecoin测试网代码中的严重漏洞,原因是 transfer 函数中对转账双方 from, to 地址检查不到位,导致了FIL无限增发。

    2.2K10

    GC的前世与今生

    ,对象回收之后heap内存空间变得不连续,在heap中移动这些对象,使他们重新从heap基地址开始连续排列,类似于磁盘空间的碎片整理。...可以这样理解roots:heap中对象的引用关系错综复杂(交叉引用、循环引用),形成复杂的graph,roots是CLR在heap之外可以找到的各种入口点。   ...指针修复是因为compact过程移动了heap对象,对象地址发生变化,需要修复所有引用指针,包括stack、CPU register中的指针以及heap中其他对象的引用指针。...值类型在栈里,先进后出,值类型变量的生命有先后顺序,这个确保了值类型变量在退出作用域以前会释放资源。比引用类型更简单和高效。堆栈是从高地址往低地址分配内存。   ...6、你必须对非托管资源的释放负责。可以通过在类型中定义Finalizer来保证资源得到释放。   7、对象的Finalizer被执行的时间是在对象不再被引用后的某个不确定的时间。

    62530

    WebAssembly的一知半解

    线性内存与代码空间、执行堆栈和引擎的数据结构是分离的,因此,编译后的程序不能破坏它们的执行环境,不能跳转到任意位置,或执行其他未定义行为。...通过这种构造确保了控制流不会形成不可约减的循环,不会包含堆栈高度不对齐的块分支,或者不会分支到多字节指令的中间。这些属性允许在一次传递中验证 WebAssembly 代码,在一次传递中编译。...宿主函数:WebAssembly 程序可以调用本身不确定或者更改 WebAssembly 状态的宿主函数。当然,调用宿主函数的结果也超出了 WebAssembly 的语义范围。 2.6....这意味着没有类型安全的违规,如无效调用或非法访问局部变量,它保证了内存安全,并确保了代码地址或调用堆栈的不可访问性。...通过设计,可以通过动态边界检查保证 WebAssembly 中的所有内存访问是安全的,这相当于根据内存的当前大小检查地址。引擎将从进程中的某个基址开始,在一个很大的连续范围内分配内存。

    95620

    程序设计语言概述_c语言程序设计基本概念

    c) 堆栈段中地址偏移(C++的switch case中不能声明变量。共享内存) d) 静态段中地址 2....模块和函数的抽象(完成堆栈中保存恢复现场的工作) 3. 类型变量的管理(所有变量被替换成直接访问的地址,最快的访问速率) 4. 代码优化 变量是替换成可以直接访问地址的?...模块的堆栈操作 总之,经过优化的C程序执行码与汇编效率几乎相同。 因为从理论上来说,C并没有引入运行时的新机制。 我理解的C语言只是一种汇编的宏而已。...c) 从操作数堆栈获取所需的操作数。 d) 按照 JVM 规范执行操作。 e) 将结果写回堆栈。 JAVA是如何解决执行效率低下的问题呢?...非脚本语言 和 脚本语言 脚本语言,我理解是负责调度其他代码的语言。 例如shell脚本(调用命令),lua(调用C)。 但是也不确定,例如Python。 跨平台 跨平台分为哪些层次? 1.

    1.4K40

    C#垃圾回收机制(GC)

    ,使他们重新从heap基地址开始连续排列,类似于磁盘空间的碎片整理 Heap内存经过回收、压缩之后,可以继续采用前面的heap内存分配方法,即仅用一个指针记录heap分配的起始地址就可以...(交叉引用、循环引用),形成复杂的graph,roots是CLR在heap之外可以找到的各种入口点。...从roots出发可以创建reachable objectsgraph,剩余对象即为unreachable,可以被回收 指针修复是因为compact过程移动了heap对象,对象地址发生变化,需要修复所有引用指针...如图 值类型在栈里,先进后出,值类型变量的生命有先后顺序,这个确保了值类型变量在推出作用域以前会释放资源。比引用类型更简单和高效。堆栈是从高地址往低地址分配内存。...7、对象的Finalizer被执行的时间是在对象不再被引用后的某个不确定的时间。注意并非和C++中一样在对象超出声明周期时立即执行析构函数 8、Finalizer的使用有性能上的代价。

    80510

    反作弊如何检测系统仿真(2)

    LBR堆栈由存储最后一个分支源和目标地址的MSR对组成。下面列出了8个与此相关的MSR。...LBR堆栈顶部指针的MSR。...市场上当前的处理器中还没有实现某些MSR,但是它们具有有效的MSR地址。使用rdmsr平台查询时,通常会生成一般保护例外(#GP)。但是,在虚拟化环境中,读取未实现的地址可能会产生不确定的结果。...例如,在VMware上从MSR地址2到5进行读取将提供随机数据,并且不会产生异常。 对上述保留范围的探测以及任何未实现的MSR地址都可以用于确定当前系统是否已虚拟化。...CPUID Leaf比较 与保留的MSR地址范围类似的一种快速方法是CPUID对照其通常的值检查保留的响应。

    18.7K420

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

    在栈上存取数据比通过指针在堆上存取数据快些。一般大家说的堆栈和栈是一样的,就是栈(stack),而说堆时才是堆heap。栈是先入后出的,一般是由高地址向低地址生长。...由于进程的CPU运行级别小于等于为系统调用设置的陷阱门的准入级别3,所以可以畅通无阻的进入系统空间去执行为int80设置的函数指针system_call()。...ss0是任务内核态堆栈的段选择符,esp0是堆栈栈底指针。因此每当任务从用户代码转移进入内核代码中执行时,任务的内核态栈总是空的。...任务0和任务1的代码段和数据段相同,限长也都是640KB,但它们被映射到不同的线性地址范围中。任务0的段基地址从线性地址0开始,而任务1的段基地址从64MB开始。...但是它们全都映射到物理地址0~640KB范围中。这个地址范围也就是内核代码和基本数据所存放的地方。

    1.8K20
    领券