gpt4 book ai didi

c - 子进程执行时,OS把argv和argc存放在哪里?

转载 作者:太空狗 更新时间:2023-10-29 14:54:56 25 4
gpt4 key购买 nike

我很难理解操作系统如何将数据从父进程的地址空间传递到子进程的地址空间。即,在 C 程序中,argc 和 argv 在传递给 main 时存储在哪里?

我理解 argv 本质上是一个双指针。我不明白的是操作系统在将它们加载到内核后如何处理这些值。在为子进程创建地址空间后,它是否将这些值压入新空间的堆栈?我们显然不想传递指向另一个地址空间的指针。

郑重声明,我正在使用 MIPS32 架构。

最佳答案

在 Linux 上,至少在我玩过的架构上,进程以 %esp 开始,指向如下内容:

argc | argv[0] | argv[1] | ... argv[argc - 1] | argv[argc] == NULL | envp[0] | envp[1] ... envp[?] == NULL

传统上调用的第一个函数名为 _start,它的工作是计算 (argc = %esp, argv = ((char *)%esp) + 1, envp = ( (char *)%esp) + argc + 2),然后使用适当的调用约定调用 main

在 x86 上,参数在堆栈上传递。

在 amd64 上,它们在寄存器 %rdi%rsi%rdx 中传递。

在 mips 上,Google 告诉我有几种不同的调用约定在使用 - 包括 O32、N32、N64 - 但它们都使用 $a0$a1$a2 首先。

关于c - 子进程执行时,OS把argv和argc存放在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26416678/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com