首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用程序栈涉及syscalls吗?

使用程序栈涉及syscalls吗?
EN

Stack Overflow用户
提问于 2021-12-12 13:46:09
回答 2查看 72关注 0票数 0

我正在学习操作系统理论,而且我知道堆分配涉及到一个特定的syscall,而且我知道编译器通常会为此进行优化,这比事先需要的更多。

但是我没有找到关于堆栈分配的信息。这是怎么回事?它涉及一个特定的syscall,每次您从其中读取或写入它时(例如,当您调用带有某些参数的函数时)?或者还有其他机制不涉及syscall?

EN

回答 2

Stack Overflow用户

发布于 2021-12-12 14:15:43

通常,当操作系统启动您的程序时,它会检查可执行文件的头,并为各种事情安排不同的区域(可执行文件代码的区域,以及可执行文件数据的区域等等)。这包括设置一个初始堆栈(还有更多--例如找到共享库和执行动态链接)。

在操作系统完成所有这些之后,您的可执行文件就会开始执行。此时,您已经有了堆栈的内存,并且可以在没有任何系统调用的情况下使用它。

注1:如果您创建线程,那么可能会有一个系统调用来创建线程,并且这个系统调用可能会为新线程的堆栈分配内存。

注2:通常有“虚拟内存”(程序看到的是什么)和“物理内存”(硬件看到的);而在这两者之间,操作系统通常会做很多技巧来提高性能,避免浪费物理内存,并隐藏资源限制(这样您就不必为耗尽物理内存而担心太多)。这些技巧之一是在不分配任何实际物理内存的情况下分配虚拟内存(例如,对于大型堆栈),然后如果/何时首次修改虚拟内存,则分配物理内存。其他技巧包括各种“交换空间”方案和内存映射文件。这些技巧依赖于CPU代表程序生成的请求(例如,页面错误异常),这些请求不是系统调用,而是具有类似(“要求内核做某事”)的特性。

注3:以上所有内容都取决于哪个操作系统。不同的操作系统会做不同的事情。我仔细地选择了单词。“典型”意味着大多数现代操作系统都像我所描述的那样工作(但“一般”并不意味着所有可能的操作系统都像我所描述的那样工作;有些操作系统不像我所描述的那样工作)。

票数 3
EN

Stack Overflow用户

发布于 2021-12-13 08:24:40

不,堆栈是正常的记忆。从进程的角度来看,没有什么不同(因此出现了严重的安全漏洞,您可以返回指向堆栈中数据的指针),但是堆栈现在已经改变了。

正如Brendan所写的,操作系统将在程序加载时为进程设置堆栈。但是如果您访问一个未分配的堆栈页(例如,如果您的堆栈正在增长),内核可能会自动为您分配一个新的堆栈页。(与尝试在堆中分配新内存时没有太大不同,程序空间上没有更多可用的内存:但在本例中,您显式地执行了syscall来告诉内核您需要更多的堆内存)。

您将注意到,堆栈通常朝一个方向移动,堆(已分配的内存)则朝另一个方向(通常是朝对方)移动。因此,如果您的程序需要更多的堆栈,您有空间,但如果您的程序不需要太多的堆栈,您可以使用内存,例如,巨大的数组。或者相反:如果您执行了大量的递归,则需要分配很多堆栈(但您可能需要更少的堆内存)。

另外两个考虑因素: CPU可能有特殊的堆栈指令。但是你可以把它们看作是语法糖(你可以用MOV模拟推和弹出)。使用JMP调用和RET (并模拟推送和POP)。

内核可能会为自己的目的使用一个特殊的堆栈(对于中断特别重要)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70324132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档