精华内容
下载资源
问答
  • 系统栈
    千次阅读
    2019-03-09 14:32:39

           系统栈又叫调用栈,栈。调用栈最经常被用于存放子程序的返回地址。在调用任何子程序时,主程序都必须暂存子程序运行完毕后应该返回到的地址。因此,如果被调用的子程序还要调用其他的子程序,其自身的返回地址就必须存入调用栈,在其自身运行完毕后再行取回。在递归程序中,每一层次递归都必须在调用栈上增加一条地址,因此如果程序出现无限递归(或仅仅是过多的递归层次),调用栈就会产生栈溢出

           栈溢出就是缓冲区溢出的一种。 由于缓冲区溢出而使得有用的存储单元被改写,往往会引发不可预料的后果。程序在运行过程中,为了临时存取数据的需要,一般都要分配一些内存空间,通常称这些空间为缓冲区。如果向缓冲区中写入超过其本身长度的数据,以致于缓冲区无法容纳,就会造成缓冲区以外的存储单元被改写,这种现象就称为缓冲区溢出。缓冲区长度一般与用户自己定义的缓冲变量的类型有关。

    栈溢出就是缓冲区溢出的一种。

    更多相关内容
  • 银行排队管理系统,用和队列实现银行的派队管理,vip派队功能等等
  • 嵌入式RTOS的 任务栈 和 系统栈

    千次阅读 2021-11-22 08:56:29
    对于初学者来说,对于FreeRTOS经常提到的任务和我们裸机编程说的经常傻傻分不清楚,是单独写一篇文章简单描述一下两者区别。
    对于初学者来说,对于RTOS经常提到的任务栈和我们裸机编程说的栈经常傻傻分不清楚
    虽然我其他博文在有些地方提到过他们的区别,但还是单独写一篇文章描述一下,本文以FreeRTOS为例
    ...更新一下 RT-Thread 分配空间的说明                             2022/4/1
    

    总结

    总结写在前面:

    FreeRTOS 任务栈 和 系统栈完全是两个不同的东西,在内存中的体现就是他们占用的是完全不同的内存区域。

    FreeRTOS 的所有任务是在 FreeRTOS 最开始申请的内存一大片空间上面TOTAL_HEAP_SIZE,再次给每个任务分配不同的小空间,这每个不同的小空间就是FreeRTOS 每个任务的任务栈,在RAM空间中,FreeRTOS申请的这大片空间属于.bss段。而系统栈,我们申请的_Min_Stack_Size在RAM空间中,位置是在最后的部分,按照顺序排列.data-.bss-Heap-Stack

    FreeRTOS 每个任务都有自己单独的栈空间,就是创建任务时候设置的大小,这个大小在内存中直接对应一篇内存空间 ,用来在任务切换的时候保存当前任务现场的内存空间,每一个任务都有一个自己的PSP指针。

    系统栈 也是用来保存现场的,但是他用于 中断,库函数调用(比如C库函数),所有的中断都使用同一个栈空间,对于系统栈来说,他们使用的都是MSP指针。

    额外说明,本文是以 FreeRTOS 为例,在 RT-Thread 系统中,不会预先定义堆的大小,他会把 .data 段 以及 系统 stack 占用的剩余所有空间都作为 堆,这个堆并不是系统堆,这个堆是受 RT-Thread 管理的"内存堆",RT-Thread 线程,申请动态空间都在这个内存堆空间中进行,统一管理。

    1、占用空间的区别

    下面来介绍一下,先来看一张图:
    在这里插入图片描述结合开头的总结,从上图可以看出来,FreeRTOS 的任务栈 和 系统栈 在RAM中的位置就是不一样的,如果跑的是裸机程序,上图中的 FreeRTOS任务空间 那部分的空间是没有的,其他部分还是一样的,如下图:
    在这里插入图片描述
    为什么是上面图示的样子,不理解的朋友先查看我另一篇博文关于内存问题的单独介绍 :STM32的内存管理相关(内存架构,内存管理,map文件分析)

    我们也可以直接查看程序编译后的 .map文件来证实上面的图片,我们先找到RAM区域,能看到和FreeRTOS有关的函数啊数据啊,所占用的RAM空间地址:
    在这里插入图片描述
    在.map文件的最后,有系统栈 的地址:
    在这里插入图片描述
    其实上面的图示就很好的告诉了我们,系统栈就是系统栈,FreeRTOS 任务栈先不管他是怎么运作的,不管他是什么机制,在RAM里面 和系统栈的位置都不一样,完全是两个东西。

    2、用途的区别

    所谓栈,就是用来保存“现场”的东西。

    FreeRTOS 的 任务栈

    每个任务都有自己的栈空间,用来保存每个任务自己的现场。 函数总有被打断的时候,可能是中断来了,也可能是任务调度,也可能是自己调用函数,这些情况都需要保存自己的现场,就需要用到自己的任务栈。

    (具体的分析,需要讲一大堆,在我其他的博文有些章节其实会有细说过相关知识,有时间的话,这里再来补充下)

    系统栈

    在裸机编程中,所有的“现场”保存都是用的系统栈,不管函数的调用,中断,中断嵌套。

    在FreeRTOS中,中断使用的是系统栈。每一个systick 中断都会使用到系统栈。

    以下是个人理解,在系统中,只要开始了任务调度,除了中断,所有的调用,肯定都是在任务中进行的,只要在任务中进行,那么所有的函数调用需要保存的都是各个任务的现场,是用的任务栈。只有发生中断的时候用的是系统栈。

    相关知识博文:

    FreeRTOS记录(三、FreeRTOS任务调度原理解析_Systick、PendSV、SVC)

    STM32的内存管理相关(内存架构,内存管理,map文件分析)

    展开全文
  • 用户栈 系统栈

    千次阅读 2018-01-04 13:23:37
    (3)PSW(Program Status Word)包含: 执行方式(系统状态(调度权利大)还是用户状态(权限 小)下执行),中断屏蔽标志(进程执行中 是否有中断屏蔽即是否允许被 剥夺CPU或被打断 1即不允许打断)

    我们知道PCB里面的CPU状态信息 有以下几种,大家可以复习一下

     (1)通用寄存器 8-32个,暂存信息
     (2)PC(指令计数器) 要访问下一条指令地址
     (3)PSW(Program Status Word)包含:执行方式(系统状态还是用户状态下执行),中断屏蔽标志(进程执行中 是否有中断屏蔽即是否允许被   剥夺CPU或被打断 1即不允许打断)
     (4)用户栈指针:用户进程拥有的系统栈,存放 过程和系统调用参数及调用地址
    
    
    简要说明下 第四点 用户栈和系统栈
    
    概念:
    用户栈:用户进程中一块区域,保存用户进程的一系列子进程相互协作时,调用的参数,返回值,返回点及子程序(函数)的局部变量等信息
    
    系统栈:(核心栈,内核栈):用于进程进入内核时使用的栈,主要涉及进程切换时保存用户态进程信息(寄存器值,一部分硬件上下文等),以及进程在内核执行时分配空间使用。
    
    现在的操作系统大部分都是将内核程序(如:中断处理程序)挂到正在运行的用户程序上的如下图:
    

    这里写图片描述

    核心程序的工作栈就是当前运行的用户进程的系统栈。每个进程都有自己的用户栈和系统栈。而且系统栈的大小是确定的(取决于系统允许的中断嵌套数量,即中断优先级个数)。
    

    这里写图片描述

    展开全文
  • ARM:FreeRTOS系统栈和任务栈

    千次阅读 多人点赞 2019-11-15 15:46:18
    ARM:FreeRTOS系统栈和任务栈 背景:ARM 有两个栈指针PSP和MSP, 通过Control 寄存器来决定SP(R13)使用哪个栈。我们下面谈论的系统栈和任务栈,就和这两个栈指针有关。 FreeRTOS 任务栈 FreeRTOS不同于裸机每个...

    ARM:FreeRTOS系统栈和任务栈

    背景:ARM 有两个栈指针PSP和MSP, 通过Control 寄存器来决定SP(R13)使用哪个栈。我们下面谈论的系统栈和任务栈,就和这两个栈指针有关。

    在这里插入图片描述

    FreeRTOS 任务栈

    FreeRTOS不同于裸机每个TASK都有一个任务栈。FreeRTOS的任务栈是在任务创建的时候从FreeRTOSConfig.h 定义的Heap 空间中申请:

    #define configTOTAL_HEAP_SIZE                   ((size_t)1024 * 9)
    

    具体任务栈创建的格式如下:(任务栈的大小是 usStackDepth*4)
    在这里插入图片描述
    注意:这种创建方式是动态创建栈的方式,所以会放在Heap 空间中申请。

    申请任务栈空间的code如下:

    在这里插入图片描述FreeRTOS会定义两个栈指针来表明任务栈的大小:
    1、 *pxTopOfStack栈顶指针
    2、*pxStack 栈的起始地址

    注意:pxTopOfStack-pxStack会小于分配的任务栈的大小,原因是arm和FreeRTOS系统会额外保存一些寄存器,用于TASK的切换和返回。

    具体形式如下(栈的生长方式可以设置,这边默认是从高往低):
    在这里插入图片描述

    在创建任务栈的过程中,FreeRTOS 会切换 arm 的栈指针,将栈指针切换到PSP,
    通过将Control [1] 置 1实现。


    FreeRTOS 系统栈

    上面跟大家讲解了什么是任务栈,这里的系统栈又是什么呢?裸机的情况下,我们在ld script 中定义一个栈空间,并在Startup.S 中将MSP指向这个栈空间,这个就是系统栈。

    arm-CM3 中系统复位后给MSP赋的初值就是我们定义的系统栈。
    系统栈使用MSP指针。

    在这里插入图片描述
    在 RTOS 下,任务栈是不使用这里的空间的。 既然任务栈不使用这里的栈空间,那么哪里要使用这里的栈空间呢?答案就在中断函数和中断嵌套。

    **之前讲过 arm M3 内核是具有双堆栈指针,MSP 主堆栈指针和 PSP 进程堆栈指针,或者叫 PSP任务堆栈指针也是可以的。

    在 FreeRTOS 操作系统中,主堆栈指针 MSP 是给系统栈空间使用的,进程堆栈指针 PSP 是给任务栈使用的。 也就是说,在 FreeRTOS 任务中,所有栈空间的使用都是通过PSP 指针进行指向的。 一旦进入了中断函数以及可能发生的中断嵌套都是用的 MSP 指针。

    在这里插入图片描述


    系统栈和任务栈的分配

    • 任务栈空间的分配

    FreeRTOS 中每个任务都需要自己的栈空间,栈空间的大小需要考虑如下几个方面:

    • 函数的嵌套调用:

    • 函数局部变量。

    • 函数形参,一般情况下函数的形参是直接使用的 CPU 寄存器,不需要使用栈空间,但是这个函数中如果还嵌套了一个函数的话,这个存储了函数形参的 CPU 寄存器内容是要入栈的。

    • 函数返回地址,arm中一般函数的返回地址是专门保存到 LR(LinkRegister)寄存器中的,如果这个函数里面还调用了一个函数的话,这个存储了函数返回地址的 LR 寄存器内容是要入栈的。

    • 函数内部的状态保存操作也需要额外的栈空间。

    • 任务切换,任务切换时所有的寄存器都需要入栈。

    • ARM 在任务执行过程中,如果发生中断:

    • M3 内核的 MCU 有 8 个寄存器是自动入栈的,这个栈是任务栈,进入中断以后其余寄存器入栈以及发生中断嵌套都是用的系统栈。

    • M4 内核的 MCU 有 8 个通用寄存器和 18 个浮点寄存器是自动入栈的,这个栈是任务栈,进入中断以后其余通用寄存器和浮点寄存器入栈以及发生中断嵌套都是用的系统栈。

    注意:进入中断以后使用的局部变量以及可能发生的中断嵌套都是用的系统栈。进入中断后系统会自动将栈指针切换到MSP,退出中断后再切回PSP。

    在这里插入图片描述

    • 系统栈空间的分配

    实际应用中系统栈空间分配多大,主要是看可能发生的中断嵌套层数,下面我们就按照最坏执行情况进行考虑,所有的寄存器都需要入栈,此时分为两种情况:
    (进入中断后,系统会自动将SP切到MSP)

    • 64 字节

    对于 Cortex-M3 内核和未使用 FPU(浮点运算单元)功能的 Cortex-M4 内核在发生中断时需要将 16 个通用寄存器全部入栈,每个寄存器占用 4 个字节,也就是 16*4 = 64 字节的空间。
    可能发生几次中断嵌套就是要 64 乘以几即可。 当然,这种是最坏执行情况,也就是所有的寄存器都入栈。

    (注:任务执行的过程中发生中断的话,有 8 个寄存器是自动入栈的,这个栈是任务栈,进入中断以后其余寄存器入栈以及发生中断嵌套都是用的系统栈

    • 200 字节

    对于具有 FPU(浮点运算单元)功能的 Cortex-M4 内核,如果在任务中进行了浮点运算,那么在发生中断的时候除了 16 个通用寄存器需要入栈,还有 34 个浮点寄存器也是要入栈的,也就是(16+34)*4 = 200 字节的空间。当然,这种是最坏执行情况,也就是所有的寄存器都入栈。
    (注:任务执行的过程中发送中断的话,有 8 个通用寄存器和 18 个浮点寄存器是自动入栈的,这个栈是任务栈,进入中断以后其余通用寄存器和浮点寄存器入栈以及发生中断嵌套都是用的系统栈


    FreeRTOS 中提供了一个比较好用的栈函数,可以计算出Task 使用了多少栈空间:

    uxTaskGetStackHighWaterMark 会显示出Task历史上使用的最大栈深度是多少,返回值是历史上该Task所剩余的最小栈空间的大小。

    在这里插入图片描述

    展开全文
  • 这时就需要手动调整系统栈大小了。以下转自Lynstery: 在用gcc/g++编译时指定参数 -Wl,–stack=size size是栈的大小,单位为字节。 比如我现在要编译一个名为hh的c++程序,栈的大小要16M,就这样如果是像本蒟蒻...
  • windows 环境下c++系统栈大小调整

    千次阅读 2017-10-22 13:21:29
    在用gcc/g++编译时指定参数 -Wl,--stack=size size是的大小,单位为字节。 比如我现在要编译一个名为hh的c++程序,的大小要16M,就这样 如果是像本蒟蒻一样用dev-c++的,那么可以 点编译选项,然后 就...
  • 实验3系统.doc

    2020-04-07 00:04:38
    验证性实验3系统 班级 H1001 学号 09 姓名 陆俊 实验日期 2011.09.28~10.12 1实验目的 1掌握的特点及其描述方法 2用链式存储结构实现一个 3掌握建的各种基本操作 4掌握的几个典型应用的算法 2实验内容 1...
  • LPC1768(cortex-m3核)MCU,要求8字节对齐,所以在用操作系统时,
  • windows 调整系统栈大小

    千次阅读 2016-03-15 11:55:09
    windows:在gcc(MinGW,devc++使用的编译器)编译时,指定参数 -Wl,--stack=size size是的大小,单位为字节,比如要16M就-Wl,--stack=16777216
  • 基于Linux的溢出攻击防护系统.pdf
  • 系统栈和用户栈

    千次阅读 2011-05-21 18:11:00
    系统栈(也叫核心栈、内核栈)是内存中属于操作系统 空间的一块区域,其主要用途为: (1)保存中断现场,对于嵌套中断,被中断程序的现场信息依次压入系统栈,中断返回时逆序弹出; (2)保存操作系统子程序间相互...
  • C++ 操作系统课设,内附课程设计报告,线程安全的,适用于大学内操作系统课设的学习。包含基本结构和读者写者线程的安全实现,
  • 1、区(stack) — 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的。2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与...
  • 系统栈与用户栈 以及 栈的内部实现

    千次阅读 2011-09-27 19:25:15
    系统栈(也叫核心栈、内核栈)是内存中属于操作系统空间的一块区域,其主要用途为:  (1)保存中断现场,对于嵌套中断,被中断程序的现场信息依次压入系统栈,中断返回时逆序弹出;  (2)保存操作系统子程序间相互...
  • 那接下来的问题就是如何用C在哪里会用到呢?稍微了解一点等一下,怎么比较两个变量的地址呢?“先声明的先入栈那就函数加个参数,比较参数和局部变量的位置,参数肯定先入栈。那为什么不能局部变量先入栈?第一...
  • 在调用函数时,也即当使用LCALL、ACALL等汇编指令时,PC指针会被自动入栈到SP指向的系统栈,随着函数调用链条不断加深,SP被吃掉的空间越来越多
  • 基于Spring Boot技术博客系统企业级前后端实战课程,带你围绕Spring Boot技术,所涉及的技术不仅限于某个领域,以整合多个技术点,搭建一个能够用于快速开发的框架,一步一步构建博客系统的各个功能,实现一个...
  • 操作系统课程中内存里面堆和的区别
  • 操作系统的堆和的区别

    千次阅读 2017-12-03 16:27:46
    操作系统 :由编译器分配,存放函数的参数值、临时变量值等,操作方式类似于数据结构中的。 堆:由程序员分配,若程序员不进行释放,堆会在程序结束后OS进行释放。与数据结构中的堆是两回事,分配方式类似于...
  • ZLIP协议是一种极小的TCP/IP协议,该协议是免费的开源协议,可以适用于8位或16位的微处理器搭建的嵌入式系统。本文介绍了将ZLIP结合嵌入式平台,实现将嵌入式系统作为客户端接入网络中的应用,对ZLIP协议...
  • 给大家分享一套课程——基于Spring Boot技术博客系统企业级前后端实战视频教程,希望对大家学习有帮助,给个五星好评哦。
  • 嗨,你为什么那么努力?...不同的任务复杂程度不同,需要的大小也不同,给多了浪费(毕竟单片机中的 RAM 贵的一匹),给少了更严重,溢出造成的后果会让整个系统崩溃。 所以,一个合适的大小.
  • 操作系统中堆和的区别

    万次阅读 多人点赞 2014-04-04 17:36:52
    其操作方式类似于数据结构中的使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是...
  • tcpip协议在嵌入式操作系统ucos上的实
  • 程序默认空间大小

    千次阅读 2021-05-27 14:05:11
    linux 下线程的默认大小是8M $ ulimit -s 8192 # 8 * 1024KB 查看单个进程暂用堆栈的信息 $ strace -f -p {PID} 临时改变空间的大小 ulimit -s 102400 # 改为100MB ulimit -s ulimited # 不限制 永久修改...
  • 停车场管理系统,用队列和实现车辆管理,记录车辆到达和离开时间
  • 溢出攻击之弹出计算器

    千次阅读 2017-04-15 01:20:59
    系统栈溢出原理函数栈帧及寄存器在高级语言中,当函数被调用时,系统栈会为这个函数开辟一个新的栈帧,并把它压入栈中。这个栈帧中的内存空间被它所属的函数独占,正常情况下是不会和别的函数共享的。当函数返回时,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 711,058
精华内容 284,423
关键字:

系统栈