xref: /DragonOS/docs/kernel/core_api/kernel_api.md (revision b0474540d4b874888471843b1954a7fbafce5d12)
1# DragonOS内核核心API
2
3## 循环链表管理函数
4
5  循环链表是内核的重要的数据结构之一。包含在`kernel/common/glib.h`中。
6
7### `void list_init(struct List *list)`
8
9#### 描述
10
11  初始化一个List结构体,使其prev和next指针指向自身
12
13#### 参数
14
15**list**
16
17  要被初始化的List结构体
18
19### `void list_add(struct List *entry, struct List *node)`
20
21#### 描述
22
23  将node插入到entry的后方
24
25#### 参数
26
27**entry**
28
29  已存在于循环链表中的一个结点
30
31**node**
32
33  待插入的结点
34
35### `void list_append(struct List *entry, struct List *node)`
36
37#### 描述
38
39  将node插入到entry的前方
40
41#### 参数
42
43**entry**
44
45  已存在于循环链表中的一个结点
46
47**node**
48
49  待插入的结点
50
51### `void list_del(struct List *entry)`
52
53#### 描述
54
55  从链表中删除结点entry
56
57#### 参数
58
59**entry**
60
61  待删除的结点
62
63### `bool list_empty(struct List *entry)`
64
65#### 描述
66
67  判断链表是否为空
68
69#### 参数
70
71**entry**
72
73  链表中的一个结点
74
75### `struct List *list_prev(struct List *entry)`
76
77#### 描述
78
79  获取entry的前一个结点
80
81#### 参数
82
83**entry**
84
85  链表中的一个结点
86
87### `struct List *list_next(struct List *entry)`
88
89#### 描述
90
91  获取entry的后一个结点
92
93#### 参数
94
95**entry**
96
97  链表中的一个结点
98
99---
100
101## 基础C函数库
102
103  内核编程与应用层编程不同,你将无法使用LibC中的函数来进行编程。为此,内核实现了一些常用的C语言函数,并尽量使其与标准C库中的函数行为相近。值得注意的是,这些函数的行为可能与标准C库函数不同,请在使用时仔细阅读以下文档,这将会为你带来帮助。
104
105### 字符串操作
106
107#### `int strlen(const char *s)`
108
109##### 描述
110
111  测量并返回字符串长度。
112
113##### 参数
114
115**src**
116
117  源字符串
118
119#### `long strnlen(const char *src, unsigned long maxlen)`
120
121##### 描述
122
123  测量并返回字符串长度。当字符串长度大于maxlen时,返回maxlen
124
125##### 参数
126
127**src**
128
129  源字符串
130
131**maxlen**
132
133  最大长度
134
135#### `long strnlen_user(const char *src, unsigned long maxlen)`
136
137##### 描述
138
139  测量并返回字符串长度。当字符串长度大于maxlen时,返回maxlen。
140
141  该函数会进行地址空间校验,要求src字符串必须来自用户空间。当源字符串来自内核空间时,将返回0.
142
143##### 参数
144
145**src**
146
147  源字符串,地址位于用户空间
148
149**maxlen**
150
151  最大长度
152
153#### `char *strncpy(char *dst, const char *src, long count)`
154
155##### 描述
156
157  拷贝长度为count个字节的字符串,返回dst字符串
158
159##### 参数
160
161**src**
162
163  源字符串
164
165**dst**
166
167  目标字符串
168
169**count**
170
171  要拷贝的源字符串的长度
172
173#### `long strncpy_from_user(char *dst, const char *src, unsigned long size)`
174
175##### 描述
176
177  从用户空间拷贝长度为count个字节的字符串到内核空间,返回拷贝的字符串的大小
178
179  该函数会对字符串的地址空间进行校验,防止出现地址空间越界的问题。
180
181##### 参数
182
183**src**
184
185  源字符串
186
187**dst**
188
189  目标字符串
190
191**size**
192
193  要拷贝的源字符串的长度
194
195#### `int strcmp(char *FirstPart, char *SecondPart)`
196
197##### 描述
198
199  比较两个字符串的大小。
200
201***返回值***
202
203| 情况                      | 返回值 |
204| ----------------------- | --- |
205| FirstPart == SecondPart | 0   |
206| FirstPart > SecondPart  | 1   |
207| FirstPart < SecondPart  | -1  |
208
209##### 参数
210
211**FirstPart**
212
213&emsp;&emsp;第一个字符串
214
215**SecondPart**
216
217&emsp;&emsp;第二个字符串
218
219#### `printk(const char* fmt, ...)`
220
221##### 描述
222
223&emsp;&emsp;该宏能够在控制台上以黑底白字格式化输出字符串.
224
225##### 参数
226
227**fmt**
228
229&emsp;&emsp;源格式字符串
230
231**...**
232
233&emsp;&emsp;可变参数
234
235#### `printk_color(unsigned int FRcolor, unsigned int BKcolor, const char* fmt, ...)`
236
237##### 描述
238
239&emsp;&emsp;在控制台上以指定前景色和背景色格式化输出字符串.
240
241##### 参数
242
243**FRcolor**
244
245&emsp;&emsp;前景色
246
247**BKcolor**
248
249&emsp;&emsp;背景色
250
251**fmt**
252
253&emsp;&emsp;源格式字符串
254
255**...**
256
257&emsp;&emsp;可变参数
258
259#### `int vsprintf(char *buf, const char *fmt, va_list args)`
260
261##### 描述
262
263&emsp;&emsp;按照fmt格式化字符串,并将结果输出到buf中,返回写入buf的字符数量。
264
265##### 参数
266
267**buf**
268
269&emsp;&emsp;输出缓冲区
270
271**fmt**
272
273&emsp;&emsp;源格式字符串
274
275**args**
276
277&emsp;&emsp;可变参数列表
278
279#### `int sprintk(char *buf, const char *fmt, ...)`
280
281##### 描述
282
283&emsp;&emsp;按照fmt格式化字符串,并将结果输出到buf中,返回写入buf的字符数量。
284
285##### 参数
286
287**buf**
288
289&emsp;&emsp;输出缓冲区
290
291**fmt**
292
293&emsp;&emsp;源格式字符串
294
295**...**
296
297&emsp;&emsp;可变参数
298