Linux clone调用在RISC-V上的参数顺序
最近在给kobayashi-compiler补risc-v的线程管理功能,相当于要用汇编写一个迷你的runtime,提供__create_threads
和__join_threads
两个函数。但是问题来了,创建线程用的clone调用的raw syscall接口在不同架构上不一样(见manpage的C library/kernel differences部分),而它并没有提到risc-v上这个接口是啥样的。
经过一番查找后,发现这个接口在linux kernel中由CONFIG_CLONE_BACKWARDS
等几个宏控制(见https://github.com/torvalds/linux/blob/v5.17/kernel/fork.c#L2649),但我不熟悉linux内核,不知道内核怎么管理构建、怎么处理架构差异的,所以也不知道这些宏在哪定义。
查了一番,最终在这里找到了提示。在https://github.com/torvalds/linux/blob/v5.17/arch/riscv/Kconfig找到了CLONE_BACKWARDS
,说明risc-v上这个接口是
1 | long clone(unsigned long flags, void *stack, |
也就是manpage上提到的第二种。