Linux kernel 将参数传递给自己的execv内核实现

Linux kernel 将参数传递给自己的execv内核实现,linux-kernel,operating-system,elf,abi,execve,Linux Kernel,Operating System,Elf,Abi,Execve,我目前正在我自己的内核中实现execv系统调用。但是,我设法计算了用户空间中的参数计数(argc),并通过系统调用将argc和argv传递给我的内核exec函数 实际上,我不知道现在如何将这两个变量传递给新的用户线程主函数。我分配了一个新的堆栈页,并将argc和argv按顺序存储在这个页面空间中。我的想法是将EDI或ESI用户寄存器指向第一个参数(argc),后跟argv数组 我不确定为此目的使用EDI或ESI是否正确。有人知道参数是如何在其他内核中传递的吗?您需要正确设置用户堆栈,然后ELF可

我目前正在我自己的内核中实现execv系统调用。但是,我设法计算了用户空间中的参数计数(argc),并通过系统调用将argc和argv传递给我的内核exec函数

实际上,我不知道现在如何将这两个变量传递给新的用户线程主函数。我分配了一个新的堆栈页,并将argc和argv按顺序存储在这个页面空间中。我的想法是将EDI或ESI用户寄存器指向第一个参数(argc),后跟argv数组


我不确定为此目的使用EDI或ESI是否正确。有人知道参数是如何在其他内核中传递的吗?

您需要正确设置用户堆栈,然后ELF可执行文件的入口点将负责定位堆栈上的
argc
argv
。Linux内核中负责设置堆栈的函数是。对于视觉表现,您可以从伟大的LWN.net文章中查看这个漂亮的数字:

------------------------------------------------------------- 0x7fff6c845000
 0x7fff6c844ff8: 0x0000000000000000
        _  4fec: './stackdump\0'                      <------+
  env  /   4fe2: 'ENVVAR2=2\0'                               |    <----+
       \_  4fd8: 'ENVVAR1=1\0'                               |   <---+ |
       /   4fd4: 'two\0'                                     |       | |     <----+
 args |    4fd0: 'one\0'                                     |       | |    <---+ |
       \_  4fcb: 'zero\0'                                    |       | |   <--+ | |
           3020: random gap padded to 16B boundary           |       | |      | | |
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -|       | |      | | |
           3019: 'x86_64\0'                        <-+       |       | |      | | |
 auxv      3009: random data: ed99b6...2adcc7        | <-+   |       | |      | | |
 data      3000: zero padding to align stack         |   |   |       | |      | | |
. . . . . . . . . . . . . . . . . . . . . . . . . . .|. .|. .|       | |      | | |
           2ff0: AT_NULL(0)=0                        |   |   |       | |      | | |
           2fe0: AT_PLATFORM(15)=0x7fff6c843019    --+   |   |       | |      | | |
           2fd0: AT_EXECFN(31)=0x7fff6c844fec      ------|---+       | |      | | |
           2fc0: AT_RANDOM(25)=0x7fff6c843009      ------+           | |      | | |
  ELF      2fb0: AT_SECURE(23)=0                                     | |      | | |
auxiliary  2fa0: AT_EGID(14)=1000                                    | |      | | |
 vector:   2f90: AT_GID(13)=1000                                     | |      | | |
(id,val)   2f80: AT_EUID(12)=1000                                    | |      | | |
  pairs    2f70: AT_UID(11)=1000                                     | |      | | |
           2f60: AT_ENTRY(9)=0x4010c0                                | |      | | |
           2f50: AT_FLAGS(8)=0                                       | |      | | |
           2f40: AT_BASE(7)=0x7ff6c1122000                           | |      | | |
           2f30: AT_PHNUM(5)=9                                       | |      | | |
           2f20: AT_PHENT(4)=56                                      | |      | | |
           2f10: AT_PHDR(3)=0x400040                                 | |      | | |
           2f00: AT_CLKTCK(17)=100                                   | |      | | |
           2ef0: AT_PAGESZ(6)=4096                                   | |      | | |
           2ee0: AT_HWCAP(16)=0xbfebfbff                             | |      | | |
           2ed0: AT_SYSINFO_EHDR(33)=0x7fff6c86b000                  | |      | | |
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .        | |      | | |
           2ec8: environ[2]=(nil)                                    | |      | | |
           2ec0: environ[1]=0x7fff6c844fe2         ------------------|-+      | | |
           2eb8: environ[0]=0x7fff6c844fd8         ------------------+        | | |
           2eb0: argv[3]=(nil)                                                | | |
           2ea8: argv[2]=0x7fff6c844fd4            ---------------------------|-|-+
           2ea0: argv[1]=0x7fff6c844fd0            ---------------------------|-+
           2e98: argv[0]=0x7fff6c844fcb            ---------------------------+
 0x7fff6c842e90: argc=3
----------------------------------------------------------------0x7fff6c845000
0x7fff6c844ff8:0x0000000000000000
_4fec:“./stackdump\0”