看法一:
一、在使用上
由 ss 与 esp 组成的栈结构已经可以算是硬件栈了,它们的 pop/push 行为都是由处理器去维护了。
软件栈:软件可以自己定义一个数据结构,pop/push 行为需由软件去维护,如:栈顶和栈底、栈空和栈满等的维护。
二、从物理上
若要从物理上去定义硬件栈结构,恐怕只有 X86 才有真正的硬件栈结构。那就是 x86 独特的浮点寄存器堆结构:
由 FR0 ~ FR7 浮点寄存器组成的一个浮点寄存栈结构。栈指针是:x87 的 status word 寄存器中有一个 top 域来指出栈顶,也就是逻辑上 ST(0) 就是栈顶,它可以对应 FR0~FR7 任一个寄存器。x87 的这个栈结构像一个圆形的环,栈满会自动回卷
看法二:
堆栈是一个区域,是用来存放数据的,这个区域本身没有任何特殊之处,就是内部RAM的一部份,特殊的是它存放和取用数据的方式,即所谓的'先进后出,后进先出’,并且堆栈有特殊的数据传输指令,即'PUSH’和'POP’,有一个特殊的专为其服务的单元,即堆栈指针SP,每当执一次PUSH指令时,SP就(在原来值的基础上)自动加1,每当执行一次POP指令,SP就(在原来值的基础上)自动减1。由于SP中的值可以用指令加以改变,所以只要在程序开始阶段更改了SP的值,就可以把堆栈设置在规定的内存单元中,如在程序开始时,用一条MOV SP,#5FH指令,就是把堆栈设置在从内存单元60H开始的单元中。一般程序的开头总有这么一条设置堆栈指针的指令,因为开机时,SP的初始值为07H,这样就使堆栈从08H单元开始往后,而08H到1FH这个区域正是8031的第二、三、四工作寄存器区,经常要被使用,这会造成数据的混乱。不同作者编写程序时,初始化堆栈指令也不完全相同,这是作者的习惯问题。当设置好堆栈区后,并不意味着该区域成为一种专用内存,它还是可以象普通内存区域一样使用,只是一般情况下编程者不会把它当成普通内存用了。
常识普及:
程序计数器PC
PC用于确定下一条指令的地址,以保证程序能够连续地执行下去,因此通常又被称为指令地址计数器。在程序开始执行前必须将程序的第一条指令的内存单元地址(即程序的首地址)送入PC,使它总是指向下一条要执行指令的地址。
1. 说明“栈”和“堆”的差别.
答:栈是一块按后进先出规则访问的存储区域,用来实现中断嵌套和子程序调用的参数和返回断点。
堆虽然是一块存储区域,但是对堆的访问是任意的,没有后进先出的要求,堆主要用来为动态变量分配存储空间。
2. 何谓系统栈? 何谓用户栈? 系统栈有何用途? 用户栈有何用途?
答:系统栈是内存中属于操作系统空间的一块固定区域,其主要用途为:(1)保存中断现场,对于嵌套中断,被中断程序的现场信息依次压入系统栈,中断返回时逆序弹出;(2)保存操作系统子程序间相互调用的参数、返回值、返回点、以及子程序的局部变量。用户栈是用户进程空间中的一块区域,用于保存用户进程的子程序间相互调用的参数、返回值、返回点、以及子程序的局部变量。
3. 用户堆栈段的长度为何无法确定?
答:用户堆栈段的长度主要取决于两个因素:(1)用户进程(线程)中子程序(函数)之间的嵌套调用深度;(2)子程序参数和局部变量的数量及类型。这些在进程(线程)运行前无法确定,由此导致用户堆栈段的长度无法确定。
4. 为什么嵌入式操作系统通常采用微内核结构?
答:嵌入式操作系统与一般操作系统相比具有比较明显的差别: (1)嵌入式操作系统规模一般较小,因为一般硬件配置较低,而且对操作系统提供的功能要求也不高。(2)应用领域差别大,对于不同的应用领域其硬件环境和设备配置情况有明显差别。所以,嵌入式操作系统一般采用微内核(micro kernel)结构。微内核包括如下基本成分:
(1)处理机调度;(2)基本内存管理;(3)通讯机制;(4)电源管理。