Skip to content

Commit eaa2ae9

Browse files
author
cyh21
committed
2025-3-16v1
1 parent c08d956 commit eaa2ae9

9 files changed

Lines changed: 161 additions & 0 deletions

File tree

_sidebar.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,5 +33,8 @@
3333
* [2025-3-10](./docs/日报/2025-3-10.md)
3434
* [2025-3-11](./docs/日报/2025-3-11.md)
3535
* [2025-3-12](./docs/日报/2025-3-12.md)
36+
* [2025-3-13](./docs/日报/2025-3-13.md)
37+
* [2025-3-15](./docs/日报/2025-3-15.md)
38+
* [2025-3-16](./docs/日报/2025-3-16.md)
3639

3740

docs/日报/2025-3-13.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
- CI测试
2+
![alt text](image.png)
3+
4+
- 本地测试
5+
![alt text](image-1.png)
6+
![alt text](image-2.png)
7+
![alt text](image-3.png)
8+
![alt text](image-4.png)

docs/日报/2025-3-15.md

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
- syscall分析
2+
3+
- prlimit64
4+
- 用于获取和设置进程的资源限制。它结合了 getrlimit 和 setrlimit 的功能,可以同时对指定进程的资源限制进行查询和设置
5+
- int prlimit(pid_t pid, int resource,
6+
const struct rlimit *_Nullable new_limit,
7+
struct rlimit *_Nullable old_limit);
8+
- 测例:argv
9+
- prlimit64(0, RLIMIT_STACK, NULL, {rlim_cur=8192*1024, rlim_max=RLIM64_INFINITY}) = 0
10+
- prlimit64(0, RLIMIT_STACK, {rlim_cur=100*1024, rlim_max=100*1024}, NULL) = 0
11+
12+
- clone3
13+
- 创建新进程的系统调用,类似于 fork,但提供了更多的灵活性。它允许创建线程或进程,并可以指定多种选项(如共享内存空间、文件描述符等)
14+
- 参数:
15+
- args:指向 struct clone_args 的指针,包含所有参数。
16+
- size:args 结构体的大小。
17+
- libctest中无
18+
19+
- fork
20+
- 创建一个新进程(子进程),该进程是调用 fork 的进程(父进程)的副本。子进程继承了父进程的大部分属性
21+
- 测例:argv
22+
- fork() = 144658
23+
24+
- set_robust_list
25+
- 用于注册线程的 robust futex 列表。Robust futex 是一种增强型的 futex(快速用户空间互斥锁),能够在持有锁的线程意外终止时,通知其他等待锁的线程锁的原所有者已经死亡
26+
- 将线程的 robust futex 列表的头部信息注册到内核中。
27+
- 测例:pthread_robust_detach
28+
29+
- mprotect
30+
- 改变内存区域的保护属性。
31+
- 参数:
32+
- `start` - usize:内存区域的起始地址。
33+
- `len` - usize:内存区域的长度。
34+
- `prot` - MMAPPROT:新的保护属性,如READ、WRITE
35+
- 测例:pthread_robust_detach
36+
- mprotect(0x7f955d73f000, 135168, PROT_READ|PROT_WRITE) = 0
37+
38+
- arch_prctl
39+
- 用于设置与架构相关的线程状态。它主要用于操作 x86-64 架构的特定寄存器,例如 FS 和 GS 寄存器
40+
- 设置和获取 FS/GS 寄存器的基地址:
41+
- 控制 CPUID 指令的使用
42+
- 测例:pthread_robust_detach
43+
- arch_prctl(ARCH_SET_FS, 0x60a8d8) = 0
44+
- syslog
45+
- 主要用于读取或写入内核日志缓冲区。它允许程序直接与内核日志系统交互,获取或设置日志相关的信息
46+
- libctest无
47+
48+
- sysinfo
49+
- 用于获取系统的总体统计信息,例如系统运行时间、内存使用情况、负载平均值等
50+
- libctest无

docs/日报/2025-3-16.md

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
# prlimit64分析
2+
3+
- Starry-Old实现
4+
```
5+
pub fn syscall_prlimit64(args: [usize; 6]) -> SyscallResult {
6+
let pid = args[0];
7+
let resource = args[1] as i32;
8+
let new_limit = args[2] as *const RLimit;
9+
let old_limit = args[3] as *mut RLimit;
10+
// 当pid不为0,其实没有权利去修改其他的进程的资源限制
11+
let curr_process = current_process();
12+
if pid == 0 || pid == curr_process.pid() as usize {
13+
match resource {
14+
// TODO: 改变了新创建的任务栈大小,但未实现当前任务的栈扩展
15+
RLIMIT_STACK => {
16+
let mut stack_limit: u64 = curr_process.get_stack_limit();
17+
if old_limit as usize != 0 {
18+
unsafe {
19+
*old_limit = RLimit {
20+
rlim_cur: stack_limit,
21+
rlim_max: stack_limit,
22+
};
23+
}
24+
}
25+
if new_limit as usize != 0 {
26+
let new_size = unsafe { (*new_limit).rlim_cur };
27+
if new_size > axconfig::TASK_STACK_SIZE as u64 {
28+
stack_limit = new_size;
29+
curr_process.set_stack_limit(stack_limit);
30+
}
31+
}
32+
}
33+
RLIMIT_NOFILE => {
34+
// 仅支持修改最大文件数
35+
if old_limit as usize != 0 {
36+
let limit = curr_process.fd_manager.get_limit();
37+
unsafe {
38+
*old_limit = RLimit {
39+
rlim_cur: limit as u64,
40+
rlim_max: limit as u64,
41+
};
42+
}
43+
}
44+
if new_limit as usize != 0 {
45+
let new_limit = unsafe { (*new_limit).rlim_cur };
46+
curr_process.fd_manager.set_limit(new_limit);
47+
}
48+
}
49+
RLIMIT_AS => {
50+
const USER_MEMORY_LIMIT: usize = 0xffff_ffff;
51+
if old_limit as usize != 0 {
52+
unsafe {
53+
*old_limit = RLimit {
54+
rlim_cur: USER_MEMORY_LIMIT as u64,
55+
rlim_max: USER_MEMORY_LIMIT as u64,
56+
};
57+
}
58+
}
59+
}
60+
_ => {}
61+
}
62+
}
63+
Ok(0)
64+
}
65+
```
66+
67+
- 使用方式
68+
- 测例:argv
69+
- prlimit64(0, RLIMIT_STACK, NULL, {rlim_cur=8192*1024, rlim_max=RLIM64_INFINITY}) = 0
70+
// 获取当前进程的栈资源限制。
71+
- prlimit64(0, RLIMIT_STACK, {rlim_cur=100*1024, rlim_max=100*1024}, NULL) = 0
72+
//设置当前进程的栈资源限制为 100KB。
73+
74+
- 官方文档信息
75+
- int prlimit(pid_t pid, int resource,
76+
const struct rlimit *_Nullable new_limit,
77+
struct rlimit *_Nullable old_limit);
78+
- 功能
79+
- new_limit不为NULL:为软硬限制设置新值
80+
- old_limit不为NULL:读取资源限制到old_limit中
81+
- pid:进程ID。pid=0,系统调用作用于调用者。设置或获取除自身以外的进程的资源,调用者必须在其资源限制正被更改的那个进程所在的用户命名空间中具备CAP_SYS_RESOURCE(系统资源管理)能力
82+
- ```
83+
struct rlimit {
84+
85+
86+
rlim_t rlim_cur; /* Soft limit */
87+
88+
89+
rlim_t rlim_max; /* Hard limit (ceiling for rlim_cur) */
90+
};
91+
```
92+
- 软限制是内核针对相应资源所强制执行的值。
93+
- 硬限制则作为软限制的上限:一个无特权的进程只能将其软限制设置为介于 0 到硬限制之间的某个值,并且可以(不可逆地)降低其硬限制。
94+
- 一个有特权的进程(在 Linux 系统中,指的是在初始用户命名空间中具备 CAP_SYS_RESOURCE 能力的进程)可以对这两种限制值进行任意修改。
95+
RLIM_INFINITY 这个值表示对资源没有限制(在 getrlimit() 函数返回的结构体中,以及传递给 setrlimit() 函数的结构体中都是如此)。
96+
- 返回值
97+
- 成功:0
98+
- 失败:-1,设置errno
99+
100+

docs/日报/image-1.png

48.5 KB
Loading

docs/日报/image-2.png

44.9 KB
Loading

docs/日报/image-3.png

42.7 KB
Loading

docs/日报/image-4.png

48.2 KB
Loading

docs/日报/image.png

295 KB
Loading

0 commit comments

Comments
 (0)