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  第一个字符串 214 215**SecondPart** 216 217  第二个字符串 218 219#### `printk(const char* fmt, ...)` 220 221##### 描述 222 223  该宏能够在控制台上以黑底白字格式化输出字符串. 224 225##### 参数 226 227**fmt** 228 229  源格式字符串 230 231**...** 232 233  可变参数 234 235#### `printk_color(unsigned int FRcolor, unsigned int BKcolor, const char* fmt, ...)` 236 237##### 描述 238 239  在控制台上以指定前景色和背景色格式化输出字符串. 240 241##### 参数 242 243**FRcolor** 244 245  前景色 246 247**BKcolor** 248 249  背景色 250 251**fmt** 252 253  源格式字符串 254 255**...** 256 257  可变参数 258 259#### `int vsprintf(char *buf, const char *fmt, va_list args)` 260 261##### 描述 262 263  按照fmt格式化字符串,并将结果输出到buf中,返回写入buf的字符数量。 264 265##### 参数 266 267**buf** 268 269  输出缓冲区 270 271**fmt** 272 273  源格式字符串 274 275**args** 276 277  可变参数列表 278 279#### `int sprintk(char *buf, const char *fmt, ...)` 280 281##### 描述 282 283  按照fmt格式化字符串,并将结果输出到buf中,返回写入buf的字符数量。 284 285##### 参数 286 287**buf** 288 289  输出缓冲区 290 291**fmt** 292 293  源格式字符串 294 295**...** 296 297  可变参数 298