xref: /DragonOS/docs/kernel/core_api/kernel_api.md (revision 0435eb00b1651a9d82f129a580569905501d2fcb)
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#### `char *strcpy(char *dst, const char *src)`
174
175##### 描述
176
177  拷贝源字符串,返回dst字符串
178
179##### 参数
180
181**src**
182
183  源字符串
184
185**dst**
186
187  目标字符串
188
189#### `long strncpy_from_user(char *dst, const char *src, unsigned long size)`
190
191##### 描述
192
193  从用户空间拷贝长度为count个字节的字符串到内核空间,返回拷贝的字符串的大小
194
195  该函数会对字符串的地址空间进行校验,防止出现地址空间越界的问题。
196
197##### 参数
198
199**src**
200
201  源字符串
202
203**dst**
204
205  目标字符串
206
207**size**
208
209  要拷贝的源字符串的长度
210
211#### `int strcmp(char *FirstPart, char *SecondPart)`
212
213##### 描述
214
215  比较两个字符串的大小。
216
217***返回值***
218
219| 情况                      | 返回值 |
220| ----------------------- | --- |
221| FirstPart == SecondPart | 0   |
222| FirstPart > SecondPart  | 1   |
223| FirstPart < SecondPart  | -1  |
224
225##### 参数
226
227**FirstPart**
228
229&emsp;&emsp;第一个字符串
230
231**SecondPart**
232
233&emsp;&emsp;第二个字符串
234
235#### `printk(const char* fmt, ...)`
236
237##### 描述
238
239&emsp;&emsp;该宏能够在控制台上以黑底白字格式化输出字符串.
240
241##### 参数
242
243**fmt**
244
245&emsp;&emsp;源格式字符串
246
247**...**
248
249&emsp;&emsp;可变参数
250
251#### `printk_color(unsigned int FRcolor, unsigned int BKcolor, const char* fmt, ...)`
252
253##### 描述
254
255&emsp;&emsp;在控制台上以指定前景色和背景色格式化输出字符串.
256
257##### 参数
258
259**FRcolor**
260
261&emsp;&emsp;前景色
262
263**BKcolor**
264
265&emsp;&emsp;背景色
266
267**fmt**
268
269&emsp;&emsp;源格式字符串
270
271**...**
272
273&emsp;&emsp;可变参数
274
275#### `int vsprintf(char *buf, const char *fmt, va_list args)`
276
277##### 描述
278
279&emsp;&emsp;按照fmt格式化字符串,并将结果输出到buf中,返回写入buf的字符数量。
280
281##### 参数
282
283**buf**
284
285&emsp;&emsp;输出缓冲区
286
287**fmt**
288
289&emsp;&emsp;源格式字符串
290
291**args**
292
293&emsp;&emsp;可变参数列表
294
295#### `int sprintk(char *buf, const char *fmt, ...)`
296
297##### 描述
298
299&emsp;&emsp;按照fmt格式化字符串,并将结果输出到buf中,返回写入buf的字符数量。
300
301##### 参数
302
303**buf**
304
305&emsp;&emsp;输出缓冲区
306
307**fmt**
308
309&emsp;&emsp;源格式字符串
310
311**...**
312
313&emsp;&emsp;可变参数
314
315### 内存操作
316
317#### `void *memcpy(void *dst, const void *src, uint64_t size)`
318
319##### 描述
320
321&emsp;&emsp;将内存从src处拷贝到dst处。
322
323##### 参数
324
325**dst**
326
327&emsp;&emsp;指向目标地址的指针
328
329**src**
330
331&emsp;&emsp;指向源地址的指针
332
333**size**
334
335&emsp;&emsp;待拷贝的数据大小
336
337#### `void *memmove(void *dst, const void *src, uint64_t size)`
338
339##### 描述
340
341&emsp;&emsp;与`memcpy()`类似,但是在源数据区域与目标数据区域之间存在重合时,该函数能防止数据被错误的覆盖。
342
343##### 参数
344
345**dst**
346
347&emsp;&emsp;指向目标地址的指针
348
349**src**
350
351&emsp;&emsp;指向源地址的指针
352
353**size**
354
355&emsp;&emsp;待拷贝的数据大小
356