操作系统的堆栈在哪里?

时间:2021-07-04 15:46:49
看了很多操作系统和机器的书。里面有许多函数调用和中断。我不是很明白。要是有函数一定要有堆栈空间。所以问问各位大侠。操作系统核心堆栈在哪里。怎么分配的。

21 个解决方案

#1


如果在汇编中没有定义堆栈,也可以通过堆栈来传递参数,是不是用到了操作系统的堆栈?

#2


操作系统在生成一个线程时会从它管理的内存池中分配一块内存作为该线程的堆栈.所以,对操作系统来说分配堆栈和你在应用程序中申请内存是一样的,都是从内存管理模块申请一块空闲内存.
    至于汇编中没有定义堆栈,但因为线程有默认的堆栈大小,所以实际上还是有堆栈的.不过默认的堆栈较小,对于复杂调用,如递归调用,很容易导致堆栈益出

#3


.code stack 100h  

#4


操作系统的堆栈由操作系统自己指定,通常是一个或多个起始地址(最高地址)确定,大小确定的连续内存空间。

#5


kernel stack

#6


谢谢各位。我的问题是说。C编译出来的东西在调用时一定有堆栈。对于应用程序的堆栈我是知道的。这个是由核心调度程序分配的。问题是核心的堆栈在哪里?在核心的代码后面吗?还是有操作系统的初始化程序制定的?望请各位指点.

#7


核心的堆栈通常就在物理内存里,不一定使用独立的堆栈段,可能仅占用系统数据段的一个固定大小的部分(比如一个固定大小的数组),当然也可以独立分段,不同系统是不一样的。
通常放在物理内存中而不是参与虚拟内存管理是为了防止内核需要使用堆栈却无法把堆栈调入内存的情况(直接系统崩溃)。

#8


谢谢axx1611(long long *&ago) 你的回复我是知道的。我问题是核心的堆栈到底在哪里?因为在程序连接时要对系统进行分配。这个要影响配置文件的内容。

#9


你问的是线程在核心的堆栈还是核心线程的堆栈?

#10


大侠!操作系统的核心是没有线程的。线程是由核心调度的结果。核心的调度程序负责各个用户进程的调度。即使是windows它的核心也是没有的。核心态的程序和用户程序是不同的。核心态的程序是由中断和核心的调度程序负责。核心的调度程序负责用户任务的切换。
我问的是核心里的程序的堆栈!它在哪里!

#11


大侠,核心本来就是一个进程或线程,在硬件驱动和进程管理、存储管理等初始化后开始启动,没他你怎么用得了系统啊。

#12


再说一句,核心就是一个程序(当然某些OS可能是多个),它的堆栈往往就是我所说的核心线程的堆栈,当然在核心线程启动之前,核心也可能会使用别的临时堆栈。

#13


非常感谢axx1611的回复。我建议你多看一些操作系统原理的书。注意你的用语的准确性。一般操作系统有四种堆栈。一种是初始化的临时堆栈。二种是系统核心的堆栈。三种是用户程序的堆栈。四种是用户态程序使用的系统调用堆栈。我的问题是这些堆栈的具体分配情况是什么?怪我没有说清楚。

#14


1、系统初始化的堆栈理论上可以是任何有效的物理内存地址,在初始化进行到一定时候这个堆栈就被抛弃而切换到了新的堆栈。
2、系统核心的堆栈我不太明白是什么意思。是否是指核心态内核代码执行时使用的堆栈?
3、用户程序的堆栈准确地说是用户进程或线程的堆栈,在创建该进程/线程时由操作系统分配或指定。
4、根据操作系统的不同,进程进行系统调用时可以使用该进程的堆栈,或是内核的堆栈,或两者都有使用。
不同的操作系统这些堆栈的分配和使用有很大的不同,撇开操作系统的类型单纯讨论这些堆栈是没有意义的。

#15


堆栈主要是配合函数调用使用的,没有操作系统也可以有堆栈,当然如果一个操作系统可以不用函数调用,它也可以不使用堆栈 :)

#16


谢谢jason20042008的回复。你将我是知道的。我要问的是具体的策略是什么?
1 系统初始化堆栈是初始化程序使用的。在linux的引导中。要调用zip解压包。需要一个临时的堆栈。有些不用函数的初始化也可以不用堆栈。
2 核心的堆栈是指向中断调用等核心系统的堆栈。
3 用户程序的堆栈。是用户程序使用的私有堆栈。
4 内核调度用户进程。或用户调用系统核心时也要有堆栈。

#17


bigbat(大漠苍穹):
不太明白你指的策略指哪方面的策略。
从性能方面考虑,栈应该放在高速存储器中。
从安全方面考虑,内核的栈应该和用户线程的栈放在不同地址空间,不同线程的栈也可以通过放在不同地址空间加以保护。
从空间上考虑,堆栈的大小应根据实际使用情况设置,多了浪费,少了崩溃。
不同类型堆栈的划分和使用上也没有你说的4中堆栈那么绝对,有些操作系统的内核甚至中断都使用用户线程的栈。还是那句话,具体操作系统具体分析:) 。应该说每一种操作系统的设计都是面向目标经过深思熟虑的。

对我前面说的做一些补充:一般只要是处理器调度单元—线程(任务)—都有自己的栈,进程的概念比这个要大,因此我前面说“进程的堆栈”有些不太准确。堆和栈也是两个东西,栈是线程或内核私有的,而堆可以公有也可以私有,还可以有很多个。

#18


感谢jason20042008。我想问的是核心程序的栈是放到一个固定的地方好,还是放到核心程序的后面。mmu有一定的保护功能这个我知道。想实现一个简单的操作系统。所以问道了这个问题。只要是这方面的设计。我都愿意请教。
如果没有其它要说的。我就结了。祝你身体健康。

#19


我想你应该没有使用mmu吧,那么栈的位置应该放在一个固定的地方,我想没有那样的需求要求栈的位置变来变去吧。
栈的操作一般从高地址向低地址增长,如果把栈放在核心代码的后面,一旦堆栈溢出将覆盖代码区,后果很严重。如果把堆栈放在低地址空间这种危险性应该小一些吧。

#20


堆栈在哪里就不知道了,反正windows的代码进入ring0后,堆栈就只有8k(好像是这个数),一不小心就用完了

#21


为了鼓励大家,我先把贴结了。在开新帖。

#1


如果在汇编中没有定义堆栈,也可以通过堆栈来传递参数,是不是用到了操作系统的堆栈?

#2


操作系统在生成一个线程时会从它管理的内存池中分配一块内存作为该线程的堆栈.所以,对操作系统来说分配堆栈和你在应用程序中申请内存是一样的,都是从内存管理模块申请一块空闲内存.
    至于汇编中没有定义堆栈,但因为线程有默认的堆栈大小,所以实际上还是有堆栈的.不过默认的堆栈较小,对于复杂调用,如递归调用,很容易导致堆栈益出

#3


.code stack 100h  

#4


操作系统的堆栈由操作系统自己指定,通常是一个或多个起始地址(最高地址)确定,大小确定的连续内存空间。

#5


kernel stack

#6


谢谢各位。我的问题是说。C编译出来的东西在调用时一定有堆栈。对于应用程序的堆栈我是知道的。这个是由核心调度程序分配的。问题是核心的堆栈在哪里?在核心的代码后面吗?还是有操作系统的初始化程序制定的?望请各位指点.

#7


核心的堆栈通常就在物理内存里,不一定使用独立的堆栈段,可能仅占用系统数据段的一个固定大小的部分(比如一个固定大小的数组),当然也可以独立分段,不同系统是不一样的。
通常放在物理内存中而不是参与虚拟内存管理是为了防止内核需要使用堆栈却无法把堆栈调入内存的情况(直接系统崩溃)。

#8


谢谢axx1611(long long *&ago) 你的回复我是知道的。我问题是核心的堆栈到底在哪里?因为在程序连接时要对系统进行分配。这个要影响配置文件的内容。

#9


你问的是线程在核心的堆栈还是核心线程的堆栈?

#10


大侠!操作系统的核心是没有线程的。线程是由核心调度的结果。核心的调度程序负责各个用户进程的调度。即使是windows它的核心也是没有的。核心态的程序和用户程序是不同的。核心态的程序是由中断和核心的调度程序负责。核心的调度程序负责用户任务的切换。
我问的是核心里的程序的堆栈!它在哪里!

#11


大侠,核心本来就是一个进程或线程,在硬件驱动和进程管理、存储管理等初始化后开始启动,没他你怎么用得了系统啊。

#12


再说一句,核心就是一个程序(当然某些OS可能是多个),它的堆栈往往就是我所说的核心线程的堆栈,当然在核心线程启动之前,核心也可能会使用别的临时堆栈。

#13


非常感谢axx1611的回复。我建议你多看一些操作系统原理的书。注意你的用语的准确性。一般操作系统有四种堆栈。一种是初始化的临时堆栈。二种是系统核心的堆栈。三种是用户程序的堆栈。四种是用户态程序使用的系统调用堆栈。我的问题是这些堆栈的具体分配情况是什么?怪我没有说清楚。

#14


1、系统初始化的堆栈理论上可以是任何有效的物理内存地址,在初始化进行到一定时候这个堆栈就被抛弃而切换到了新的堆栈。
2、系统核心的堆栈我不太明白是什么意思。是否是指核心态内核代码执行时使用的堆栈?
3、用户程序的堆栈准确地说是用户进程或线程的堆栈,在创建该进程/线程时由操作系统分配或指定。
4、根据操作系统的不同,进程进行系统调用时可以使用该进程的堆栈,或是内核的堆栈,或两者都有使用。
不同的操作系统这些堆栈的分配和使用有很大的不同,撇开操作系统的类型单纯讨论这些堆栈是没有意义的。

#15


堆栈主要是配合函数调用使用的,没有操作系统也可以有堆栈,当然如果一个操作系统可以不用函数调用,它也可以不使用堆栈 :)

#16


谢谢jason20042008的回复。你将我是知道的。我要问的是具体的策略是什么?
1 系统初始化堆栈是初始化程序使用的。在linux的引导中。要调用zip解压包。需要一个临时的堆栈。有些不用函数的初始化也可以不用堆栈。
2 核心的堆栈是指向中断调用等核心系统的堆栈。
3 用户程序的堆栈。是用户程序使用的私有堆栈。
4 内核调度用户进程。或用户调用系统核心时也要有堆栈。

#17


bigbat(大漠苍穹):
不太明白你指的策略指哪方面的策略。
从性能方面考虑,栈应该放在高速存储器中。
从安全方面考虑,内核的栈应该和用户线程的栈放在不同地址空间,不同线程的栈也可以通过放在不同地址空间加以保护。
从空间上考虑,堆栈的大小应根据实际使用情况设置,多了浪费,少了崩溃。
不同类型堆栈的划分和使用上也没有你说的4中堆栈那么绝对,有些操作系统的内核甚至中断都使用用户线程的栈。还是那句话,具体操作系统具体分析:) 。应该说每一种操作系统的设计都是面向目标经过深思熟虑的。

对我前面说的做一些补充:一般只要是处理器调度单元—线程(任务)—都有自己的栈,进程的概念比这个要大,因此我前面说“进程的堆栈”有些不太准确。堆和栈也是两个东西,栈是线程或内核私有的,而堆可以公有也可以私有,还可以有很多个。

#18


感谢jason20042008。我想问的是核心程序的栈是放到一个固定的地方好,还是放到核心程序的后面。mmu有一定的保护功能这个我知道。想实现一个简单的操作系统。所以问道了这个问题。只要是这方面的设计。我都愿意请教。
如果没有其它要说的。我就结了。祝你身体健康。

#19


我想你应该没有使用mmu吧,那么栈的位置应该放在一个固定的地方,我想没有那样的需求要求栈的位置变来变去吧。
栈的操作一般从高地址向低地址增长,如果把栈放在核心代码的后面,一旦堆栈溢出将覆盖代码区,后果很严重。如果把堆栈放在低地址空间这种危险性应该小一些吧。

#20


堆栈在哪里就不知道了,反正windows的代码进入ring0后,堆栈就只有8k(好像是这个数),一不小心就用完了

#21


为了鼓励大家,我先把贴结了。在开新帖。