C程序是自己将局部变量推送到堆栈上,还是必须调用操作系统才能这样做?

C程序是自己将局部变量推送到堆栈上,还是必须调用操作系统才能这样做?,c,operating-system,compiler-construction,stack,C,Operating System,Compiler Construction,Stack,我的意思是,程序是直接使用硬件将局部变量推送到堆栈上,还是必须调用OS库才能做到这一点 顺便说一句,对于linux,在下面的代码中,编译时,“6”是否存储在任何ELF节中,类似于.data/.text节?当调用“func”时,CPU是否从任何部分获取“6”并将其推送到堆栈上 func(){ int a = 6; } 堆栈对于CPU上运行的每个进程都是唯一的,操作系统不会管理它们。程序可以随意使用其堆栈 第一个问题的答案是:不,程序在没有操作系统干预的情况下推送到堆栈。事实上,推送和弹出堆栈

我的意思是,程序是直接使用硬件将局部变量推送到堆栈上,还是必须调用OS库才能做到这一点

顺便说一句,对于linux,在下面的代码中,编译时,“6”是否存储在任何ELF节中,类似于.data/.text节?当调用“func”时,CPU是否从任何部分获取“6”并将其推送到堆栈上

func(){
  int a = 6;
}

堆栈对于CPU上运行的每个进程都是唯一的,操作系统不会管理它们。程序可以随意使用其堆栈

第一个问题的答案是:不,程序在没有操作系统干预的情况下推送到堆栈。事实上,推送和弹出堆栈是一种常见的操作,许多CPU体系结构都有专门的指令来完成这一操作。您不希望每次使用堆栈时都必须对操作系统进行调用,这将为执行增加令人难以置信的开销

至于问题的第二部分:所有局部变量都存储在堆栈上,而不是存储在ELF部分或其他全局内存中。实际上,堆栈的全部目的是存储局部变量。当使用堆栈上的局部变量时,它的值会像其他变量一样从内存中获取。堆栈不是一些特殊的内存或任何东西,它只是一块普通的RAM,程序恰好使用它作为堆栈。现在,也就是说,用于堆栈本身的内存由操作系统分配给程序。但是记忆本身呢?没什么特别的

你应该看看这个答案以便进一步阅读:

堆栈对于CPU上运行的每个进程都是唯一的,操作系统不管理它们。程序可以随意使用其堆栈

第一个问题的答案是:不,程序在没有操作系统干预的情况下推送到堆栈。事实上,推送和弹出堆栈是一种常见的操作,许多CPU体系结构都有专门的指令来完成这一操作。您不希望每次使用堆栈时都必须对操作系统进行调用,这将为执行增加令人难以置信的开销

至于问题的第二部分:所有局部变量都存储在堆栈上,而不是存储在ELF部分或其他全局内存中。实际上,堆栈的全部目的是存储局部变量。当使用堆栈上的局部变量时,它的值会像其他变量一样从内存中获取。堆栈不是一些特殊的内存或任何东西,它只是一块普通的RAM,程序恰好使用它作为堆栈。现在,也就是说,用于堆栈本身的内存由操作系统分配给程序。但是记忆本身呢?没什么特别的

你应该看看这个答案以便进一步阅读:

我认为更准确的说法是,局部变量可以存储在堆栈上,而不是“存储在堆栈上”。当然,它们通常存储在堆栈上,但语言并没有规定这一点。堆栈对于每个线程来说都是唯一的,运行在CPU核心上与否。当我们想要将局部变量推送到堆栈上时,即局部变量尚未在堆栈上,CPU从何处获取该局部变量的值?是精灵区吗@郑嘉诚, 您是在询问初始化值吗?例如,当您编写如下内容时:intx=10;在这种情况下,可以以几种不同的方式存储值10。小值可以直接存储在用于设置值的指令中,也可以存储在ELF部分,是的。我认为更准确的说法是,局部变量可以存储在堆栈上,而不是“存储在堆栈上”。当然,它们通常存储在堆栈上,但语言并没有规定这一点。堆栈对于每个线程来说都是唯一的,运行在CPU核心上与否。当我们想要将局部变量推送到堆栈上时,即局部变量尚未在堆栈上,CPU从何处获取该局部变量的值?是精灵区吗@郑嘉诚, 您是在询问初始化值吗?例如,当您编写如下内容时:intx=10;在这种情况下,可以以几种不同的方式存储值10。小值可以直接存储在用于设置值的指令中,也可以存储在ELF部分中,是的。