139a09ffdSfslongjin# DragonOS内核核心API 239a09ffdSfslongjin 339a09ffdSfslongjin## 循环链表管理函数 439a09ffdSfslongjin 5*53233d5eSfslongjin  循环链表是内核的重要的数据结构之一。包含在`kernel/common/list.h`中。 639a09ffdSfslongjin 739a09ffdSfslongjin### `void list_init(struct List *list)` 839a09ffdSfslongjin 939a09ffdSfslongjin#### 描述 1039a09ffdSfslongjin 1139a09ffdSfslongjin  初始化一个List结构体,使其prev和next指针指向自身 1239a09ffdSfslongjin 1339a09ffdSfslongjin#### 参数 1439a09ffdSfslongjin 1539a09ffdSfslongjin**list** 1639a09ffdSfslongjin 1739a09ffdSfslongjin  要被初始化的List结构体 1839a09ffdSfslongjin 1939a09ffdSfslongjin### `void list_add(struct List *entry, struct List *node)` 2039a09ffdSfslongjin 2139a09ffdSfslongjin#### 描述 2239a09ffdSfslongjin 2339a09ffdSfslongjin  将node插入到entry的后方 2439a09ffdSfslongjin 2539a09ffdSfslongjin#### 参数 2639a09ffdSfslongjin 2739a09ffdSfslongjin**entry** 2839a09ffdSfslongjin 2939a09ffdSfslongjin  已存在于循环链表中的一个结点 3039a09ffdSfslongjin 3139a09ffdSfslongjin**node** 3239a09ffdSfslongjin 3339a09ffdSfslongjin  待插入的结点 3439a09ffdSfslongjin 3539a09ffdSfslongjin### `void list_append(struct List *entry, struct List *node)` 3639a09ffdSfslongjin 3739a09ffdSfslongjin#### 描述 3839a09ffdSfslongjin 3939a09ffdSfslongjin  将node插入到entry的前方 4039a09ffdSfslongjin 4139a09ffdSfslongjin#### 参数 4239a09ffdSfslongjin 4339a09ffdSfslongjin**entry** 4439a09ffdSfslongjin 45b0474540Sfslongjin  已存在于循环链表中的一个结点 4639a09ffdSfslongjin 4739a09ffdSfslongjin**node** 4839a09ffdSfslongjin 49b0474540Sfslongjin  待插入的结点 5039a09ffdSfslongjin 5139a09ffdSfslongjin### `void list_del(struct List *entry)` 5239a09ffdSfslongjin 5339a09ffdSfslongjin#### 描述 5439a09ffdSfslongjin 5539a09ffdSfslongjin  从链表中删除结点entry 5639a09ffdSfslongjin 5739a09ffdSfslongjin#### 参数 5839a09ffdSfslongjin 5939a09ffdSfslongjin**entry** 6039a09ffdSfslongjin 6139a09ffdSfslongjin  待删除的结点 6239a09ffdSfslongjin 637087e9fbSfslongjin### `list_del_init(struct List *entry)` 647087e9fbSfslongjin 657087e9fbSfslongjin#### 描述 667087e9fbSfslongjin 677087e9fbSfslongjin  从链表中删除结点entry,并将这个entry使用list_init()进行重新初始化。 687087e9fbSfslongjin 697087e9fbSfslongjin#### 参数 707087e9fbSfslongjin 717087e9fbSfslongjin**entry** 727087e9fbSfslongjin 737087e9fbSfslongjin  待删除的结点 747087e9fbSfslongjin 7539a09ffdSfslongjin### `bool list_empty(struct List *entry)` 7639a09ffdSfslongjin 7739a09ffdSfslongjin#### 描述 7839a09ffdSfslongjin 7939a09ffdSfslongjin  判断链表是否为空 8039a09ffdSfslongjin 8139a09ffdSfslongjin#### 参数 8239a09ffdSfslongjin 8339a09ffdSfslongjin**entry** 8439a09ffdSfslongjin 8539a09ffdSfslongjin  链表中的一个结点 8639a09ffdSfslongjin 8739a09ffdSfslongjin### `struct List *list_prev(struct List *entry)` 8839a09ffdSfslongjin 8939a09ffdSfslongjin#### 描述 9039a09ffdSfslongjin 91b0474540Sfslongjin  获取entry的前一个结点 9239a09ffdSfslongjin 9339a09ffdSfslongjin#### 参数 9439a09ffdSfslongjin 9539a09ffdSfslongjin**entry** 9639a09ffdSfslongjin 97b0474540Sfslongjin  链表中的一个结点 9839a09ffdSfslongjin 9939a09ffdSfslongjin### `struct List *list_next(struct List *entry)` 10039a09ffdSfslongjin 10139a09ffdSfslongjin#### 描述 10239a09ffdSfslongjin 10339a09ffdSfslongjin  获取entry的后一个结点 10439a09ffdSfslongjin 10539a09ffdSfslongjin#### 参数 10639a09ffdSfslongjin 10739a09ffdSfslongjin**entry** 10839a09ffdSfslongjin 10939a09ffdSfslongjin  链表中的一个结点 11039a09ffdSfslongjin 1117087e9fbSfslongjin### `void list_replace(struct List *old, struct List *new)` 1127087e9fbSfslongjin 1137087e9fbSfslongjin#### 描述 1147087e9fbSfslongjin 1157087e9fbSfslongjin  将链表中的old结点替换成new结点 1167087e9fbSfslongjin 1177087e9fbSfslongjin#### 参数 1187087e9fbSfslongjin 1197087e9fbSfslongjin**old** 1207087e9fbSfslongjin 1217087e9fbSfslongjin  要被换下来的结点 1227087e9fbSfslongjin 1237087e9fbSfslongjin**new** 1247087e9fbSfslongjin 1257087e9fbSfslongjin  要被换入链表的新的结点 1267087e9fbSfslongjin 1277087e9fbSfslongjin(_list_entry)= 1287087e9fbSfslongjin 1297087e9fbSfslongjin### `list_entry(ptr, type, member)` 1307087e9fbSfslongjin 1317087e9fbSfslongjin#### 描述 1327087e9fbSfslongjin 1337087e9fbSfslongjin  该宏能通过ptr指向的List获取到List所处的结构体的地址 1347087e9fbSfslongjin 1357087e9fbSfslongjin#### 参数 1367087e9fbSfslongjin 1377087e9fbSfslongjin**ptr** 1387087e9fbSfslongjin 1397087e9fbSfslongjin  指向List结构体的指针 1407087e9fbSfslongjin 1417087e9fbSfslongjin**type** 1427087e9fbSfslongjin 1437087e9fbSfslongjin  要被换入链表的新的结点 1447087e9fbSfslongjin 1457087e9fbSfslongjin**member** 1467087e9fbSfslongjin 1477087e9fbSfslongjin  List结构体在上述的“包裹list结构体的结构体”中的变量名 1487087e9fbSfslongjin 1497087e9fbSfslongjin### `list_first_entry(ptr, type, member)` 1507087e9fbSfslongjin 1517087e9fbSfslongjin#### 描述 1527087e9fbSfslongjin 1537087e9fbSfslongjin  获取链表中的第一个元素。请注意,该宏要求链表非空,否则会出错。 1547087e9fbSfslongjin 1557087e9fbSfslongjin#### 参数 1567087e9fbSfslongjin 1577087e9fbSfslongjin  与{ref}`list_entry() <_list_entry>`相同 1587087e9fbSfslongjin 1597087e9fbSfslongjin### `list_first_entry_or_null(ptr, type, member)` 1607087e9fbSfslongjin 1617087e9fbSfslongjin#### 描述 1627087e9fbSfslongjin 1637087e9fbSfslongjin  获取链表中的第一个元素。若链表为空,则返回NULL。 1647087e9fbSfslongjin 1657087e9fbSfslongjin#### 参数 1667087e9fbSfslongjin 1677087e9fbSfslongjin  与{ref}`list_entry() <_list_entry>`相同 1687087e9fbSfslongjin 1697087e9fbSfslongjin### `list_last_entry(ptr, type, member)` 1707087e9fbSfslongjin 1717087e9fbSfslongjin#### 描述 1727087e9fbSfslongjin 1737087e9fbSfslongjin  获取链表中的最后一个元素。请注意,该宏要求链表非空,否则会出错。 1747087e9fbSfslongjin 1757087e9fbSfslongjin#### 参数 1767087e9fbSfslongjin 1777087e9fbSfslongjin  与{ref}`list_entry() <_list_entry>`相同 1787087e9fbSfslongjin 1797087e9fbSfslongjin### `list_last_entry_or_full(ptr, type, member)` 1807087e9fbSfslongjin 1817087e9fbSfslongjin#### 描述 1827087e9fbSfslongjin 1837087e9fbSfslongjin  获取链表中的最后一个元素。若链表为空,则返回NULL。 1847087e9fbSfslongjin 1857087e9fbSfslongjin#### 参数 1867087e9fbSfslongjin 1877087e9fbSfslongjin  与{ref}`list_entry() <_list_entry>`相同 1887087e9fbSfslongjin 1897087e9fbSfslongjin(_list_next_entry)= 1907087e9fbSfslongjin### `list_next_entry(pos, member)` 1917087e9fbSfslongjin 1927087e9fbSfslongjin#### 描述 1937087e9fbSfslongjin 1947087e9fbSfslongjin  获取链表中的下一个元素 1957087e9fbSfslongjin 1967087e9fbSfslongjin#### 参数 1977087e9fbSfslongjin 1987087e9fbSfslongjin**pos** 1997087e9fbSfslongjin 2007087e9fbSfslongjin  指向当前的外层结构体的指针 2017087e9fbSfslongjin 2027087e9fbSfslongjin**member** 2037087e9fbSfslongjin 2047087e9fbSfslongjin  链表结构体在外层结构体内的变量名 2057087e9fbSfslongjin 2067087e9fbSfslongjin### `list_prev_entry(pos, member)` 2077087e9fbSfslongjin 2087087e9fbSfslongjin#### 描述 2097087e9fbSfslongjin 2107087e9fbSfslongjin  获取链表中的上一个元素 2117087e9fbSfslongjin 2127087e9fbSfslongjin#### 参数 2137087e9fbSfslongjin 2147087e9fbSfslongjin  与{ref}`list_next_entry() <_list_next_entry>`相同 2157087e9fbSfslongjin 2167087e9fbSfslongjin(_list_for_each)= 2177087e9fbSfslongjin### `list_for_each(ptr, head)` 2187087e9fbSfslongjin 2197087e9fbSfslongjin#### 描述 2207087e9fbSfslongjin 2217087e9fbSfslongjin  遍历整个链表(从前往后) 2227087e9fbSfslongjin 2237087e9fbSfslongjin#### 参数 2247087e9fbSfslongjin 2257087e9fbSfslongjin**ptr** 2267087e9fbSfslongjin 2277087e9fbSfslongjin  指向List结构体的指针 2287087e9fbSfslongjin 2297087e9fbSfslongjin**head** 2307087e9fbSfslongjin 2317087e9fbSfslongjin  指向链表头结点的指针(struct List*) 2327087e9fbSfslongjin 2337087e9fbSfslongjin### `list_for_each_prev(ptr, head)` 2347087e9fbSfslongjin 2357087e9fbSfslongjin#### 描述 2367087e9fbSfslongjin 2377087e9fbSfslongjin  遍历整个链表(从后往前) 2387087e9fbSfslongjin 2397087e9fbSfslongjin#### 参数 2407087e9fbSfslongjin 2417087e9fbSfslongjin  与{ref}`list_for_each() <_list_for_each>`相同 2427087e9fbSfslongjin 2437087e9fbSfslongjin(_list_for_each_safe)= 2447087e9fbSfslongjin### `list_for_each_safe(ptr, n, head)` 2457087e9fbSfslongjin 2467087e9fbSfslongjin#### 描述 2477087e9fbSfslongjin 2487087e9fbSfslongjin  从前往后遍历整个链表(支持删除当前链表结点) 2497087e9fbSfslongjin 2507087e9fbSfslongjin  该宏通过暂存中间变量,防止在迭代链表的过程中,由于删除了当前ptr所指向的链表结点从而造成错误. 2517087e9fbSfslongjin 2527087e9fbSfslongjin#### 参数 2537087e9fbSfslongjin 2547087e9fbSfslongjin**ptr** 2557087e9fbSfslongjin 2567087e9fbSfslongjin  指向List结构体的指针 2577087e9fbSfslongjin 2587087e9fbSfslongjin**n** 2597087e9fbSfslongjin 2607087e9fbSfslongjin  用于存储临时值的List类型的指针 2617087e9fbSfslongjin 2627087e9fbSfslongjin**head** 2637087e9fbSfslongjin 2647087e9fbSfslongjin  指向链表头结点的指针(struct List*) 2657087e9fbSfslongjin 2667087e9fbSfslongjin### `list_for_each_prev_safe(ptr, n, head)` 2677087e9fbSfslongjin 2687087e9fbSfslongjin#### 描述 2697087e9fbSfslongjin 2707087e9fbSfslongjin  从后往前遍历整个链表.(支持删除当前链表结点) 2717087e9fbSfslongjin 2727087e9fbSfslongjin  该宏通过暂存中间变量,防止在迭代链表的过程中,由于删除了当前ptr所指向的链表结点从而造成错误. 2737087e9fbSfslongjin 2747087e9fbSfslongjin#### 参数 2757087e9fbSfslongjin 2767087e9fbSfslongjin  与{ref}`list_for_each_safe() <_list_for_each_safe>`相同 2777087e9fbSfslongjin 2787087e9fbSfslongjin(_list_for_each_entry)= 2797087e9fbSfslongjin### `list_for_each_entry(pos, head, member)` 2807087e9fbSfslongjin 2817087e9fbSfslongjin#### 描述 2827087e9fbSfslongjin 2837087e9fbSfslongjin  从头开始迭代给定类型的链表 2847087e9fbSfslongjin 2857087e9fbSfslongjin#### 参数 2867087e9fbSfslongjin 2877087e9fbSfslongjin**pos** 2887087e9fbSfslongjin 2897087e9fbSfslongjin  指向特定类型的结构体的指针 2907087e9fbSfslongjin 2917087e9fbSfslongjin**head** 2927087e9fbSfslongjin 2937087e9fbSfslongjin  指向链表头结点的指针(struct List*) 2947087e9fbSfslongjin 2957087e9fbSfslongjin**member** 2967087e9fbSfslongjin 2977087e9fbSfslongjin  struct List在pos的结构体中的成员变量名 2987087e9fbSfslongjin 2997087e9fbSfslongjin### `list_for_each_entry_reverse(pos, head, member)` 3007087e9fbSfslongjin 3017087e9fbSfslongjin#### 描述 3027087e9fbSfslongjin 3037087e9fbSfslongjin  逆序迭代给定类型的链表 3047087e9fbSfslongjin 3057087e9fbSfslongjin#### 参数 3067087e9fbSfslongjin 3077087e9fbSfslongjin  与{ref}`list_for_each_entry() <_list_for_each_entry>`相同 3087087e9fbSfslongjin 3097087e9fbSfslongjin### `list_for_each_entry_safe(pos, n, head, member)` 3107087e9fbSfslongjin 3117087e9fbSfslongjin#### 描述 3127087e9fbSfslongjin 3137087e9fbSfslongjin  从头开始迭代给定类型的链表(支持删除当前链表结点) 3147087e9fbSfslongjin 3157087e9fbSfslongjin#### 参数 3167087e9fbSfslongjin 3177087e9fbSfslongjin**pos** 3187087e9fbSfslongjin 3197087e9fbSfslongjin  指向特定类型的结构体的指针 3207087e9fbSfslongjin 3217087e9fbSfslongjin**n** 3227087e9fbSfslongjin 3237087e9fbSfslongjin  用于存储临时值的,和pos相同类型的指针 3247087e9fbSfslongjin 3257087e9fbSfslongjin**head** 3267087e9fbSfslongjin 3277087e9fbSfslongjin  指向链表头结点的指针(struct List*) 3287087e9fbSfslongjin 3297087e9fbSfslongjin**member** 3307087e9fbSfslongjin 3317087e9fbSfslongjin  struct List在pos的结构体中的成员变量名 3327087e9fbSfslongjin 3337087e9fbSfslongjin### `list_prepare_entry(pos, head, member)` 3347087e9fbSfslongjin 3357087e9fbSfslongjin#### 描述 3367087e9fbSfslongjin 3377087e9fbSfslongjin  为{ref}`list_for_each_entry_continue() <_list_for_each_entry_continue>`准备一个'pos'结构体 3387087e9fbSfslongjin 3397087e9fbSfslongjin#### 参数 3407087e9fbSfslongjin 3417087e9fbSfslongjin**pos** 3427087e9fbSfslongjin 3437087e9fbSfslongjin  指向特定类型的结构体的,用作迭代起点的指针 3447087e9fbSfslongjin 3457087e9fbSfslongjin**head** 3467087e9fbSfslongjin 3477087e9fbSfslongjin  指向要开始迭代的struct List结构体的指针 3487087e9fbSfslongjin 3497087e9fbSfslongjin**member** 3507087e9fbSfslongjin 3517087e9fbSfslongjin  struct List在pos的结构体中的成员变量名 3527087e9fbSfslongjin 3537087e9fbSfslongjin(_list_for_each_entry_continue)= 3547087e9fbSfslongjin### `list_for_each_entry_continue(pos, head, member)` 3557087e9fbSfslongjin 3567087e9fbSfslongjin#### 描述 3577087e9fbSfslongjin 3587087e9fbSfslongjin  从指定的位置的【下一个元素开始】,继续迭代给定的链表 3597087e9fbSfslongjin 3607087e9fbSfslongjin#### 参数 3617087e9fbSfslongjin 3627087e9fbSfslongjin**pos** 3637087e9fbSfslongjin 3647087e9fbSfslongjin  指向特定类型的结构体的指针。该指针用作迭代的指针。 3657087e9fbSfslongjin 3667087e9fbSfslongjin**head** 3677087e9fbSfslongjin 3687087e9fbSfslongjin  指向要开始迭代的struct List结构体的指针 3697087e9fbSfslongjin 3707087e9fbSfslongjin**member** 3717087e9fbSfslongjin 3727087e9fbSfslongjin  struct List在pos的结构体中的成员变量名 3737087e9fbSfslongjin 3747087e9fbSfslongjin### `list_for_each_entry_continue_reverse(pos, head, member)` 3757087e9fbSfslongjin 3767087e9fbSfslongjin#### 描述 3777087e9fbSfslongjin 3787087e9fbSfslongjin  从指定的位置的【上一个元素开始】,【逆序】迭代给定的链表 3797087e9fbSfslongjin 3807087e9fbSfslongjin#### 参数 3817087e9fbSfslongjin 3827087e9fbSfslongjin  与{ref}`list_for_each_entry_continue() <_list_for_each_entry_continue>`的相同 3837087e9fbSfslongjin 3847087e9fbSfslongjin### `list_for_each_entry_from(pos, head, member)` 3857087e9fbSfslongjin 3867087e9fbSfslongjin#### 描述 3877087e9fbSfslongjin 3887087e9fbSfslongjin  从指定的位置开始,继续迭代给定的链表 3897087e9fbSfslongjin 3907087e9fbSfslongjin#### 参数 3917087e9fbSfslongjin 3927087e9fbSfslongjin  与{ref}`list_for_each_entry_continue() <_list_for_each_entry_continue>`的相同 3937087e9fbSfslongjin 3947087e9fbSfslongjin(_list_for_each_entry_safe_continue)= 3957087e9fbSfslongjin### `list_for_each_entry_safe_continue(pos, n, head, member)` 3967087e9fbSfslongjin 3977087e9fbSfslongjin#### 描述 3987087e9fbSfslongjin 3997087e9fbSfslongjin  从指定的位置的【下一个元素开始】,继续迭代给定的链表.(支持删除当前链表结点) 4007087e9fbSfslongjin 4017087e9fbSfslongjin#### 参数 4027087e9fbSfslongjin 4037087e9fbSfslongjin**pos** 4047087e9fbSfslongjin 4057087e9fbSfslongjin  指向特定类型的结构体的指针。该指针用作迭代的指针。 4067087e9fbSfslongjin 4077087e9fbSfslongjin**n** 4087087e9fbSfslongjin 4097087e9fbSfslongjin  用于存储临时值的,和pos相同类型的指针 4107087e9fbSfslongjin 4117087e9fbSfslongjin**head** 4127087e9fbSfslongjin 4137087e9fbSfslongjin  指向要开始迭代的struct List结构体的指针 4147087e9fbSfslongjin 4157087e9fbSfslongjin**member** 4167087e9fbSfslongjin 4177087e9fbSfslongjin  struct List在pos的结构体中的成员变量名 4187087e9fbSfslongjin 4197087e9fbSfslongjin### `list_for_each_entry_safe_continue_reverse(pos, n, head, member)` 4207087e9fbSfslongjin 4217087e9fbSfslongjin#### 描述 4227087e9fbSfslongjin 4237087e9fbSfslongjin  从指定的位置的【上一个元素开始】,【逆序】迭代给定的链表。(支持删除当前链表结点) 4247087e9fbSfslongjin 4257087e9fbSfslongjin#### 参数 4267087e9fbSfslongjin 4277087e9fbSfslongjin  与{ref}`list_for_each_entry_safe_continue() <_list_for_each_entry_safe_continue>`的相同 4287087e9fbSfslongjin 4297087e9fbSfslongjin### `list_for_each_entry_safe_from(pos, n, head, member)` 4307087e9fbSfslongjin 4317087e9fbSfslongjin#### 描述 4327087e9fbSfslongjin 4337087e9fbSfslongjin  从指定的位置开始,继续迭代给定的链表.(支持删除当前链表结点) 4347087e9fbSfslongjin 4357087e9fbSfslongjin#### 参数 4367087e9fbSfslongjin 4377087e9fbSfslongjin  与{ref}`list_for_each_entry_safe_continue() <_list_for_each_entry_safe_continue>`的相同 4387087e9fbSfslongjin 43939a09ffdSfslongjin--- 44039a09ffdSfslongjin 44139a09ffdSfslongjin## 基础C函数库 44239a09ffdSfslongjin 44339a09ffdSfslongjin  内核编程与应用层编程不同,你将无法使用LibC中的函数来进行编程。为此,内核实现了一些常用的C语言函数,并尽量使其与标准C库中的函数行为相近。值得注意的是,这些函数的行为可能与标准C库函数不同,请在使用时仔细阅读以下文档,这将会为你带来帮助。 44439a09ffdSfslongjin 44539a09ffdSfslongjin### 字符串操作 44639a09ffdSfslongjin 44739a09ffdSfslongjin#### `int strlen(const char *s)` 44839a09ffdSfslongjin 44939a09ffdSfslongjin##### 描述 45039a09ffdSfslongjin 451b0474540Sfslongjin  测量并返回字符串长度。 45239a09ffdSfslongjin 45339a09ffdSfslongjin##### 参数 45439a09ffdSfslongjin 45539a09ffdSfslongjin**src** 45639a09ffdSfslongjin 457b0474540Sfslongjin  源字符串 45839a09ffdSfslongjin 45939a09ffdSfslongjin#### `long strnlen(const char *src, unsigned long maxlen)` 46039a09ffdSfslongjin 46139a09ffdSfslongjin##### 描述 46239a09ffdSfslongjin 46339a09ffdSfslongjin  测量并返回字符串长度。当字符串长度大于maxlen时,返回maxlen 46439a09ffdSfslongjin 46539a09ffdSfslongjin##### 参数 46639a09ffdSfslongjin 46739a09ffdSfslongjin**src** 46839a09ffdSfslongjin 46939a09ffdSfslongjin  源字符串 47039a09ffdSfslongjin 47139a09ffdSfslongjin**maxlen** 47239a09ffdSfslongjin 47339a09ffdSfslongjin  最大长度 47439a09ffdSfslongjin 47539a09ffdSfslongjin#### `long strnlen_user(const char *src, unsigned long maxlen)` 47639a09ffdSfslongjin 47739a09ffdSfslongjin##### 描述 47839a09ffdSfslongjin 479b0474540Sfslongjin  测量并返回字符串长度。当字符串长度大于maxlen时,返回maxlen。 48039a09ffdSfslongjin 48139a09ffdSfslongjin  该函数会进行地址空间校验,要求src字符串必须来自用户空间。当源字符串来自内核空间时,将返回0. 48239a09ffdSfslongjin 48339a09ffdSfslongjin##### 参数 48439a09ffdSfslongjin 48539a09ffdSfslongjin**src** 48639a09ffdSfslongjin 487b0474540Sfslongjin  源字符串,地址位于用户空间 48839a09ffdSfslongjin 48939a09ffdSfslongjin**maxlen** 49039a09ffdSfslongjin 491b0474540Sfslongjin  最大长度 49239a09ffdSfslongjin 49339a09ffdSfslongjin#### `char *strncpy(char *dst, const char *src, long count)` 49439a09ffdSfslongjin 49539a09ffdSfslongjin##### 描述 49639a09ffdSfslongjin 497b0474540Sfslongjin  拷贝长度为count个字节的字符串,返回dst字符串 49839a09ffdSfslongjin 49939a09ffdSfslongjin##### 参数 50039a09ffdSfslongjin 50139a09ffdSfslongjin**src** 50239a09ffdSfslongjin 503b0474540Sfslongjin  源字符串 50439a09ffdSfslongjin 50539a09ffdSfslongjin**dst** 50639a09ffdSfslongjin 50739a09ffdSfslongjin  目标字符串 50839a09ffdSfslongjin 50939a09ffdSfslongjin**count** 51039a09ffdSfslongjin 511b0474540Sfslongjin  要拷贝的源字符串的长度 51239a09ffdSfslongjin 513d9ee6ea8Sfslongjin#### `char *strcpy(char *dst, const char *src)` 514d9ee6ea8Sfslongjin 515d9ee6ea8Sfslongjin##### 描述 516d9ee6ea8Sfslongjin 517d9ee6ea8Sfslongjin  拷贝源字符串,返回dst字符串 518d9ee6ea8Sfslongjin 519d9ee6ea8Sfslongjin##### 参数 520d9ee6ea8Sfslongjin 521d9ee6ea8Sfslongjin**src** 522d9ee6ea8Sfslongjin 523d9ee6ea8Sfslongjin  源字符串 524d9ee6ea8Sfslongjin 525d9ee6ea8Sfslongjin**dst** 526d9ee6ea8Sfslongjin 527d9ee6ea8Sfslongjin  目标字符串 528d9ee6ea8Sfslongjin 52939a09ffdSfslongjin#### `long strncpy_from_user(char *dst, const char *src, unsigned long size)` 53039a09ffdSfslongjin 53139a09ffdSfslongjin##### 描述 53239a09ffdSfslongjin 53339a09ffdSfslongjin  从用户空间拷贝长度为count个字节的字符串到内核空间,返回拷贝的字符串的大小 53439a09ffdSfslongjin 53539a09ffdSfslongjin  该函数会对字符串的地址空间进行校验,防止出现地址空间越界的问题。 53639a09ffdSfslongjin 53739a09ffdSfslongjin##### 参数 53839a09ffdSfslongjin 53939a09ffdSfslongjin**src** 54039a09ffdSfslongjin 54139a09ffdSfslongjin  源字符串 54239a09ffdSfslongjin 54339a09ffdSfslongjin**dst** 54439a09ffdSfslongjin 545b0474540Sfslongjin  目标字符串 54639a09ffdSfslongjin 54739a09ffdSfslongjin**size** 54839a09ffdSfslongjin 54939a09ffdSfslongjin  要拷贝的源字符串的长度 55039a09ffdSfslongjin 55139a09ffdSfslongjin#### `int strcmp(char *FirstPart, char *SecondPart)` 55239a09ffdSfslongjin 55339a09ffdSfslongjin##### 描述 55439a09ffdSfslongjin 55539a09ffdSfslongjin 比较两个字符串的大小。 55639a09ffdSfslongjin 55739a09ffdSfslongjin***返回值*** 55839a09ffdSfslongjin 55939a09ffdSfslongjin| 情况 | 返回值 | 56039a09ffdSfslongjin| ----------------------- | --- | 56139a09ffdSfslongjin| FirstPart == SecondPart | 0 | 56239a09ffdSfslongjin| FirstPart > SecondPart | 1 | 56339a09ffdSfslongjin| FirstPart < SecondPart | -1 | 56439a09ffdSfslongjin 56539a09ffdSfslongjin##### 参数 56639a09ffdSfslongjin 56739a09ffdSfslongjin**FirstPart** 56839a09ffdSfslongjin 569b0474540Sfslongjin  第一个字符串 57039a09ffdSfslongjin 57139a09ffdSfslongjin**SecondPart** 57239a09ffdSfslongjin 57339a09ffdSfslongjin  第二个字符串 57439a09ffdSfslongjin 575b0474540Sfslongjin#### `printk(const char* fmt, ...)` 57639a09ffdSfslongjin 577b0474540Sfslongjin##### 描述 57839a09ffdSfslongjin 579b0474540Sfslongjin  该宏能够在控制台上以黑底白字格式化输出字符串. 58039a09ffdSfslongjin 581b0474540Sfslongjin##### 参数 582b0474540Sfslongjin 583b0474540Sfslongjin**fmt** 584b0474540Sfslongjin 585b0474540Sfslongjin  源格式字符串 586b0474540Sfslongjin 587b0474540Sfslongjin**...** 588b0474540Sfslongjin 589b0474540Sfslongjin  可变参数 590b0474540Sfslongjin 591b0474540Sfslongjin#### `printk_color(unsigned int FRcolor, unsigned int BKcolor, const char* fmt, ...)` 592b0474540Sfslongjin 593b0474540Sfslongjin##### 描述 594b0474540Sfslongjin 595b0474540Sfslongjin  在控制台上以指定前景色和背景色格式化输出字符串. 596b0474540Sfslongjin 597b0474540Sfslongjin##### 参数 598b0474540Sfslongjin 599b0474540Sfslongjin**FRcolor** 600b0474540Sfslongjin 601b0474540Sfslongjin  前景色 602b0474540Sfslongjin 603b0474540Sfslongjin**BKcolor** 604b0474540Sfslongjin 605b0474540Sfslongjin  背景色 606b0474540Sfslongjin 607b0474540Sfslongjin**fmt** 608b0474540Sfslongjin 609b0474540Sfslongjin  源格式字符串 610b0474540Sfslongjin 611b0474540Sfslongjin**...** 612b0474540Sfslongjin 613b0474540Sfslongjin  可变参数 614b0474540Sfslongjin 615b0474540Sfslongjin#### `int vsprintf(char *buf, const char *fmt, va_list args)` 616b0474540Sfslongjin 617b0474540Sfslongjin##### 描述 618b0474540Sfslongjin 619b0474540Sfslongjin  按照fmt格式化字符串,并将结果输出到buf中,返回写入buf的字符数量。 620b0474540Sfslongjin 621b0474540Sfslongjin##### 参数 622b0474540Sfslongjin 623b0474540Sfslongjin**buf** 624b0474540Sfslongjin 625b0474540Sfslongjin  输出缓冲区 626b0474540Sfslongjin 627b0474540Sfslongjin**fmt** 628b0474540Sfslongjin 629b0474540Sfslongjin  源格式字符串 630b0474540Sfslongjin 631b0474540Sfslongjin**args** 632b0474540Sfslongjin 633b0474540Sfslongjin  可变参数列表 634b0474540Sfslongjin 635b0474540Sfslongjin#### `int sprintk(char *buf, const char *fmt, ...)` 636b0474540Sfslongjin 637b0474540Sfslongjin##### 描述 638b0474540Sfslongjin 639b0474540Sfslongjin  按照fmt格式化字符串,并将结果输出到buf中,返回写入buf的字符数量。 640b0474540Sfslongjin 641b0474540Sfslongjin##### 参数 642b0474540Sfslongjin 643b0474540Sfslongjin**buf** 644b0474540Sfslongjin 645b0474540Sfslongjin  输出缓冲区 646b0474540Sfslongjin 647b0474540Sfslongjin**fmt** 648b0474540Sfslongjin 649b0474540Sfslongjin  源格式字符串 650b0474540Sfslongjin 651b0474540Sfslongjin**...** 652b0474540Sfslongjin 653b0474540Sfslongjin  可变参数 654357343b0Sfslongjin 655357343b0Sfslongjin### 内存操作 656357343b0Sfslongjin 657357343b0Sfslongjin#### `void *memcpy(void *dst, const void *src, uint64_t size)` 658357343b0Sfslongjin 659357343b0Sfslongjin##### 描述 660357343b0Sfslongjin 661357343b0Sfslongjin  将内存从src处拷贝到dst处。 662357343b0Sfslongjin 663357343b0Sfslongjin##### 参数 664357343b0Sfslongjin 665357343b0Sfslongjin**dst** 666357343b0Sfslongjin 667357343b0Sfslongjin  指向目标地址的指针 668357343b0Sfslongjin 669357343b0Sfslongjin**src** 670357343b0Sfslongjin 671357343b0Sfslongjin  指向源地址的指针 672357343b0Sfslongjin 673357343b0Sfslongjin**size** 674357343b0Sfslongjin 675357343b0Sfslongjin  待拷贝的数据大小 676357343b0Sfslongjin 677357343b0Sfslongjin#### `void *memmove(void *dst, const void *src, uint64_t size)` 678357343b0Sfslongjin 679357343b0Sfslongjin##### 描述 680357343b0Sfslongjin 681357343b0Sfslongjin  与`memcpy()`类似,但是在源数据区域与目标数据区域之间存在重合时,该函数能防止数据被错误的覆盖。 682357343b0Sfslongjin 683357343b0Sfslongjin##### 参数 684357343b0Sfslongjin 685357343b0Sfslongjin**dst** 686357343b0Sfslongjin 687357343b0Sfslongjin  指向目标地址的指针 688357343b0Sfslongjin 689357343b0Sfslongjin**src** 690357343b0Sfslongjin 691357343b0Sfslongjin  指向源地址的指针 692357343b0Sfslongjin 693357343b0Sfslongjin**size** 694357343b0Sfslongjin 695357343b0Sfslongjin  待拷贝的数据大小 696