我正在使用一个新的初始化系统,#![no_std]
并extern crate rlibc
使用 asm 进行系统调用,目前也试图不分配内存。所以我拥有的可能工具的范围是有限的。
我需要调用 execve 系统调用,它需要 achar** argv
和 a char **envp
。我可以将 c 风格的字符串组合成带有零的字节数组,但是如何以空值终止静态声明的此类列表(最后一个指针为 NULL)?
睡在上面之后,我醒来时得到了答案,现在对我来说似乎很明显。使用整数切片并将最后一个设置为 0。
// Execute something as an example:
let filename: &[u8] = b"/usr/bin/sensors\x00"; // <-- Make c strings like this
let argv1: &[u8] = b"/usr/bin/sensors\x00";
let argv2: &[u8] = b"-h\x00";
let argv: &[int] = [ // <-- store them in this
::core::intrinsics::transmute(argv1.as_ptr()), // <-- transmuting
::core::intrinsics::transmute(argv2.as_ptr()),
0 // <-- and NULL terminate
];
let envp: &[int] = [0];
::linux64::execve(filename,argv,envp);