Skip to content

Commit 4343d32

Browse files
authored
[components][fs]sync procfs (#9206)
* add procfs * fix ref count check error
1 parent 0ae537e commit 4343d32

22 files changed

+3327
-0
lines changed

components/dfs/Kconfig

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,9 @@ if RT_USING_SMART
185185
bool "Using Pseudo-Teletype Filesystem (UNIX98 PTY)"
186186
depends on RT_USING_DFS_DEVFS
187187
default y
188+
config RT_USING_DFS_PROCFS
189+
bool "Enable proc file system"
190+
default n
188191
endif
189192

190193
config RT_USING_DFS_CROMFS
Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
# 进程文件系统 (procfs)
2+
3+
## 数据结构
4+
5+
```c
6+
struct proc_dentry
7+
{
8+
rt_uint32_t mode;
9+
rt_atomic_t ref_count;
10+
11+
struct proc_dentry *parent;
12+
struct dfs_vfs_node node;
13+
14+
const struct dfs_file_ops *fops;
15+
const struct proc_ops *ops;
16+
17+
char *name;
18+
void *data;
19+
};
20+
```
21+
22+
```log
23+
root { mode: S_IFDIR, ref_count: 1, parent: root, name: /, child->next: file1->node }
24+
|
25+
|—— file1 { mode: S_IFREG, ref_count: 1, parent: root, name: file1, node->next: link1->node }
26+
|—— link1 { mode: S_IFLNK, ref_count: 1, parent: root, name: link1, data: fullpath, node->next: dir1->node }
27+
|—— dir1 { mode: S_IFDIR, ref_count: 1, parent: root, name: dir1, node->next: file3->node, child->next: file2->node }
28+
| |
29+
| |—— dir2 { mode: S_IFDIR, ref_count: 1, parent: dir1, name: dir2, node->next: link2->node }
30+
| |—— link2 { mode: S_IFLNK, ref_count: 1, parent: dir1, name: link2, data: fullpath, node->next: file2->node }
31+
| |—— file2 { mode: S_IFREG, ref_count: 1, parent: dir1, name: file2 }
32+
|
33+
|—— file3 { mode: S_IFREG, ref_count: 1, parent: root, name: file3 }
34+
```
35+
36+
## API 介绍
37+
38+
```c
39+
struct proc_dentry *dfs_proc_find(const char *name);
40+
41+
struct proc_dentry *proc_mkdir_data(const char *name, mode_t mode, struct proc_dentry *parent,
42+
const struct dfs_file_ops *fops, void *data);
43+
struct proc_dentry *proc_mkdir_mode(const char *name, mode_t mode, struct proc_dentry *parent);
44+
struct proc_dentry *proc_mkdir(const char *name, struct proc_dentry *parent);
45+
46+
struct proc_dentry *proc_create_data(const char *name, mode_t mode, struct proc_dentry *parent,
47+
const struct dfs_file_ops *fops, void *data);
48+
49+
struct proc_dentry *proc_symlink(const char *name, struct proc_dentry *parent, const char *dest);
50+
51+
struct proc_dentry *proc_acquire(struct proc_dentry *dentry);
52+
void proc_release(struct proc_dentry *dentry);
53+
54+
void proc_remove(struct proc_dentry *dentry);
55+
```
56+
57+
- dfs_proc_find
58+
59+
查找指定节点,并返回节点数据指针
60+
61+
| 入参 | 说明 |
62+
| ---- | ---------------------------------------------------- |
63+
| name | 从 procfs 的 root 起始的完整路径,比如 “/dir1/file2” |
64+
65+
- proc_mkdir_data
66+
67+
创建一个目录,并返回节点数据指针
68+
69+
| 入参 | 说明 |
70+
| ------ | ------------------------------------------------------------ |
71+
| name | 从 procfs 的 root 起始的完整路径,比如 “/dir1/file2”<br />从 parent 起始的完整路径 |
72+
| mode | 权限配置 |
73+
| parent | 指定创建目录的起始节点 |
74+
| fops | 文件操作接口配置 |
75+
| data | 私有数据 |
76+
77+
- proc_mkdir_mode
78+
79+
创建一个目录,并返回节点数据指针
80+
81+
| 入参 | 说明 |
82+
| ------ | ------------------------------------------------------------ |
83+
| name | 从 procfs 的 root 起始的完整路径,比如 “/dir1/file2”<br />从 parent 起始的完整路径 |
84+
| mode | 权限配置 |
85+
| parent | 指定创建目录的起始节点 |
86+
87+
- proc_mkdir
88+
89+
创建一个目录,并返回节点数据指针
90+
91+
| 入参 | 说明 |
92+
| ---- | ------------------------------------------------------------ |
93+
| name | 从 procfs 的 root 起始的完整路径,比如 “/dir1/file2”<br />从 parent 起始的完整路径 |
94+
| mode | 权限配置 |
95+
96+
- proc_create_data
97+
98+
创建一个文件,并返回节点数据指针
99+
100+
| 入参 | 说明 |
101+
| ------ | ------------------------------------------------------------ |
102+
| name | 从 procfs 的 root 起始的完整路径,比如 “/dir1/file2”<br />从 parent 起始的完整路径 |
103+
| mode | 权限配置 |
104+
| parent | 指定创建文件的起始节点 |
105+
| fops | 文件操作接口配置 |
106+
| data | 私有数据 |
107+
108+
- proc_symlink
109+
110+
创建一个符号链接,并返回节点数据指针
111+
112+
| 入参 | 说明 |
113+
| ------ | ------------------------------------------------------------ |
114+
| name | 从 procfs 的 root 起始的完整路径,比如 “/dir1/file2”<br />从 parent 起始的完整路径 |
115+
| parent | 指定创建文件的起始节点 |
116+
| dest | 链接的目标文件完整路径 |
117+
118+
- proc_acquire
119+
120+
引用一个节点,并返回节点数据指针
121+
122+
| 入参 | 说明 |
123+
| ------ | -------------- |
124+
| dentry | 需要引用的节点 |
125+
126+
- proc_release
127+
128+
释放一个节点
129+
130+
| 入参 | 说明 |
131+
| ------ | -------------- |
132+
| dentry | 需要释放的节点 |
133+
134+
- proc_remove
135+
136+
删除一个节点包含子节点
137+
138+
| 入参 | 说明 |
139+
| ------ | -------------- |
140+
| dentry | 需要删除的节点 |
141+
142+
## msh 调试命令
143+
144+
- proc_dump
145+
146+
遍历打印指定节点含子节点的信息(名称、引用计数),比如 `proc_dump /dir1` 或者 `proc_dump`
147+
148+
- proc_remove
149+
150+
删除指定节点含子节点,比如 `proc_remove /dir1` 或者 `proc_remove /file3`
151+
152+
- proc_symlink
153+
154+
创建一个符号链接,`proc_symlink /link3 /mnt`
155+
156+
- proc_echo
157+
158+
创建一个空文件,`proc_echo /file4`
159+
160+
- proc_mkdir
161+
162+
创建一个空目录,`proc_mkdir /dir3`
163+
164+
- proc_pid
165+
166+
创建一个 pid 目录,`proc_pid /101`
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# RT-Thread building script for component
2+
3+
from building import *
4+
5+
cwd = GetCurrentDir()
6+
src = Glob('*.c')
7+
CPPPATH = [cwd]
8+
9+
group = DefineGroup('Filesystem', src, depend = ['RT_USING_DFS', 'RT_USING_DFS_PROCFS'], CPPPATH = CPPPATH)
10+
11+
Return('group')

0 commit comments

Comments
 (0)