Skip to content

Commit b66b484

Browse files
author
cyh21
committed
2025-4-14v6
1 parent bcff0b6 commit b66b484

1 file changed

Lines changed: 55 additions & 0 deletions

File tree

docs/日报/2025-4-14.md

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,61 @@
22

33
## 简单移植了Starry-Old的实现
44

5+
```rust
6+
#[apply(syscall_instrument)]
7+
pub fn sys_clone3(clone_args: UserConstPtr<usize>, size: u64) -> LinuxResult<isize> {
8+
// warn!("sys_clone3 not implemented");
9+
if size < size_of::<CloneArgs>() {
10+
return Err(LinuxError::EINVAL);
11+
}
12+
let curr_process = current();
13+
// check if the pointer is valid
14+
if clone_args.address().as_ptr() as usize == 0 {
15+
return Err(LinuxError::EFAULT);
16+
}
17+
// get the clone_args
18+
let clone_args = unsafe { &*(clone_args.address().as_ptr() as *const CloneArgs) };
19+
20+
let clone_flag = CloneFlags::from_bits(clone_args.flags).unwrap();
21+
if (clone_flag.contains(CloneFlags::CLONE_THREAD) || clone_flag.contains(CloneFlags::CLONE_PARENT))
22+
&& clone_args.exit_signal != 0
23+
{
24+
return Err(LinuxError::EINVAL);
25+
26+
}
27+
if clone_flags.contains(CloneFlags::CLONE_SIGHAND)
28+
&& !clone_flags.contains(CloneFlags::CLONE_VM)
29+
{
30+
// Error when CLONE_SIGHAND was specified in the flags mask, but CLONE_VM was not.
31+
return Err(LinuxError::EINVAL);
32+
}
33+
let stack = if clone_args.stack == 0 {
34+
None
35+
} else {
36+
Some((clone_args.stack + clone_args.stack_size) as usize)
37+
};
38+
// let sig_child = if clone_args.exit_signal != 0 {
39+
// Some(SignalNo::from(clone_args.exit_signal as usize))
40+
// } else {
41+
// None
42+
// };
43+
let sig_child = None;
44+
45+
if clone_args.stack != 0 && (clone_args.stack % 16 != 0 || clone_args.stack_size == 0) {
46+
return Err(LinuxError::EINVAL);
47+
}
48+
if let Ok(new_task_id) = curr_process.task_ext().clone_task(clone_flag, stack, clone_args.parent_tid, clone_args.tls, sig_child){
49+
// let new_task_id = curr_process.task_ext().clone_task(clone_flag, stack, clone_args.parent_tid, sig_child);
50+
// let new_task_id = curr_process.task_ext().clone_task(clone_flag, stack, clone_args.parent_tid, sig_child);
51+
return Ok(new_task_id as isize);
52+
} else {
53+
return Err(LinuxError::ENOMEM);
54+
}
55+
56+
Ok(0);
57+
}
58+
```
59+
560
希望进一步通过测例来观察和调整
661

762
## 编写简单测例

0 commit comments

Comments
 (0)