xref: /DragonOS/docs/kernel/core_api/kernel_api.md (revision c3dc6f2ff9169c309d1cbf47dcb9e4528d509b2f)
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&emsp;&emsp;与{ref}`list_entry() <_list_entry>`相同
1587087e9fbSfslongjin
1597087e9fbSfslongjin### `list_first_entry_or_null(ptr, type, member)`
1607087e9fbSfslongjin
1617087e9fbSfslongjin#### 描述
1627087e9fbSfslongjin
1637087e9fbSfslongjin&emsp;&emsp;获取链表中的第一个元素。若链表为空,则返回NULL。
1647087e9fbSfslongjin
1657087e9fbSfslongjin#### 参数
1667087e9fbSfslongjin
1677087e9fbSfslongjin&emsp;&emsp;与{ref}`list_entry() <_list_entry>`相同
1687087e9fbSfslongjin
1697087e9fbSfslongjin### `list_last_entry(ptr, type, member)`
1707087e9fbSfslongjin
1717087e9fbSfslongjin#### 描述
1727087e9fbSfslongjin
1737087e9fbSfslongjin&emsp;&emsp;获取链表中的最后一个元素。请注意,该宏要求链表非空,否则会出错。
1747087e9fbSfslongjin
1757087e9fbSfslongjin#### 参数
1767087e9fbSfslongjin
1777087e9fbSfslongjin&emsp;&emsp;与{ref}`list_entry() <_list_entry>`相同
1787087e9fbSfslongjin
1797087e9fbSfslongjin### `list_last_entry_or_full(ptr, type, member)`
1807087e9fbSfslongjin
1817087e9fbSfslongjin#### 描述
1827087e9fbSfslongjin
1837087e9fbSfslongjin&emsp;&emsp;获取链表中的最后一个元素。若链表为空,则返回NULL。
1847087e9fbSfslongjin
1857087e9fbSfslongjin#### 参数
1867087e9fbSfslongjin
1877087e9fbSfslongjin&emsp;&emsp;与{ref}`list_entry() <_list_entry>`相同
1887087e9fbSfslongjin
1897087e9fbSfslongjin(_list_next_entry)=
1907087e9fbSfslongjin### `list_next_entry(pos, member)`
1917087e9fbSfslongjin
1927087e9fbSfslongjin#### 描述
1937087e9fbSfslongjin
1947087e9fbSfslongjin&emsp;&emsp;获取链表中的下一个元素
1957087e9fbSfslongjin
1967087e9fbSfslongjin#### 参数
1977087e9fbSfslongjin
1987087e9fbSfslongjin**pos**
1997087e9fbSfslongjin
2007087e9fbSfslongjin&emsp;&emsp;指向当前的外层结构体的指针
2017087e9fbSfslongjin
2027087e9fbSfslongjin**member**
2037087e9fbSfslongjin
2047087e9fbSfslongjin&emsp;&emsp;链表结构体在外层结构体内的变量名
2057087e9fbSfslongjin
2067087e9fbSfslongjin### `list_prev_entry(pos, member)`
2077087e9fbSfslongjin
2087087e9fbSfslongjin#### 描述
2097087e9fbSfslongjin
2107087e9fbSfslongjin&emsp;&emsp;获取链表中的上一个元素
2117087e9fbSfslongjin
2127087e9fbSfslongjin#### 参数
2137087e9fbSfslongjin
2147087e9fbSfslongjin&emsp;&emsp;与{ref}`list_next_entry() <_list_next_entry>`相同
2157087e9fbSfslongjin
2167087e9fbSfslongjin(_list_for_each)=
2177087e9fbSfslongjin### `list_for_each(ptr, head)`
2187087e9fbSfslongjin
2197087e9fbSfslongjin#### 描述
2207087e9fbSfslongjin
2217087e9fbSfslongjin&emsp;&emsp;遍历整个链表(从前往后)
2227087e9fbSfslongjin
2237087e9fbSfslongjin#### 参数
2247087e9fbSfslongjin
2257087e9fbSfslongjin**ptr**
2267087e9fbSfslongjin
2277087e9fbSfslongjin&emsp;&emsp;指向List结构体的指针
2287087e9fbSfslongjin
2297087e9fbSfslongjin**head**
2307087e9fbSfslongjin
2317087e9fbSfslongjin&emsp;&emsp;指向链表头结点的指针(struct List*)
2327087e9fbSfslongjin
2337087e9fbSfslongjin### `list_for_each_prev(ptr, head)`
2347087e9fbSfslongjin
2357087e9fbSfslongjin#### 描述
2367087e9fbSfslongjin
2377087e9fbSfslongjin&emsp;&emsp;遍历整个链表(从后往前)
2387087e9fbSfslongjin
2397087e9fbSfslongjin#### 参数
2407087e9fbSfslongjin
2417087e9fbSfslongjin&emsp;&emsp;与{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&emsp;&emsp;从前往后遍历整个链表(支持删除当前链表结点)
2497087e9fbSfslongjin
2507087e9fbSfslongjin&emsp;&emsp;该宏通过暂存中间变量,防止在迭代链表的过程中,由于删除了当前ptr所指向的链表结点从而造成错误.
2517087e9fbSfslongjin
2527087e9fbSfslongjin#### 参数
2537087e9fbSfslongjin
2547087e9fbSfslongjin**ptr**
2557087e9fbSfslongjin
2567087e9fbSfslongjin&emsp;&emsp;指向List结构体的指针
2577087e9fbSfslongjin
2587087e9fbSfslongjin**n**
2597087e9fbSfslongjin
2607087e9fbSfslongjin&emsp;&emsp;用于存储临时值的List类型的指针
2617087e9fbSfslongjin
2627087e9fbSfslongjin**head**
2637087e9fbSfslongjin
2647087e9fbSfslongjin&emsp;&emsp;指向链表头结点的指针(struct List*)
2657087e9fbSfslongjin
2667087e9fbSfslongjin### `list_for_each_prev_safe(ptr, n, head)`
2677087e9fbSfslongjin
2687087e9fbSfslongjin#### 描述
2697087e9fbSfslongjin
2707087e9fbSfslongjin&emsp;&emsp;从后往前遍历整个链表.(支持删除当前链表结点)
2717087e9fbSfslongjin
2727087e9fbSfslongjin&emsp;&emsp;该宏通过暂存中间变量,防止在迭代链表的过程中,由于删除了当前ptr所指向的链表结点从而造成错误.
2737087e9fbSfslongjin
2747087e9fbSfslongjin#### 参数
2757087e9fbSfslongjin
2767087e9fbSfslongjin&emsp;&emsp;与{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&emsp;&emsp;从头开始迭代给定类型的链表
2847087e9fbSfslongjin
2857087e9fbSfslongjin#### 参数
2867087e9fbSfslongjin
2877087e9fbSfslongjin**pos**
2887087e9fbSfslongjin
2897087e9fbSfslongjin&emsp;&emsp;指向特定类型的结构体的指针
2907087e9fbSfslongjin
2917087e9fbSfslongjin**head**
2927087e9fbSfslongjin
2937087e9fbSfslongjin&emsp;&emsp;指向链表头结点的指针(struct List*)
2947087e9fbSfslongjin
2957087e9fbSfslongjin**member**
2967087e9fbSfslongjin
2977087e9fbSfslongjin&emsp;&emsp;struct List在pos的结构体中的成员变量名
2987087e9fbSfslongjin
2997087e9fbSfslongjin### `list_for_each_entry_reverse(pos, head, member)`
3007087e9fbSfslongjin
3017087e9fbSfslongjin#### 描述
3027087e9fbSfslongjin
3037087e9fbSfslongjin&emsp;&emsp;逆序迭代给定类型的链表
3047087e9fbSfslongjin
3057087e9fbSfslongjin#### 参数
3067087e9fbSfslongjin
3077087e9fbSfslongjin&emsp;&emsp;与{ref}`list_for_each_entry() <_list_for_each_entry>`相同
3087087e9fbSfslongjin
3097087e9fbSfslongjin### `list_for_each_entry_safe(pos, n, head, member)`
3107087e9fbSfslongjin
3117087e9fbSfslongjin#### 描述
3127087e9fbSfslongjin
3137087e9fbSfslongjin&emsp;&emsp;从头开始迭代给定类型的链表(支持删除当前链表结点)
3147087e9fbSfslongjin
3157087e9fbSfslongjin#### 参数
3167087e9fbSfslongjin
3177087e9fbSfslongjin**pos**
3187087e9fbSfslongjin
3197087e9fbSfslongjin&emsp;&emsp;指向特定类型的结构体的指针
3207087e9fbSfslongjin
3217087e9fbSfslongjin**n**
3227087e9fbSfslongjin
3237087e9fbSfslongjin&emsp;&emsp;用于存储临时值的,和pos相同类型的指针
3247087e9fbSfslongjin
3257087e9fbSfslongjin**head**
3267087e9fbSfslongjin
3277087e9fbSfslongjin&emsp;&emsp;指向链表头结点的指针(struct List*)
3287087e9fbSfslongjin
3297087e9fbSfslongjin**member**
3307087e9fbSfslongjin
3317087e9fbSfslongjin&emsp;&emsp;struct List在pos的结构体中的成员变量名
3327087e9fbSfslongjin
3337087e9fbSfslongjin### `list_prepare_entry(pos, head, member)`
3347087e9fbSfslongjin
3357087e9fbSfslongjin#### 描述
3367087e9fbSfslongjin
3377087e9fbSfslongjin&emsp;&emsp;为{ref}`list_for_each_entry_continue() <_list_for_each_entry_continue>`准备一个'pos'结构体
3387087e9fbSfslongjin
3397087e9fbSfslongjin#### 参数
3407087e9fbSfslongjin
3417087e9fbSfslongjin**pos**
3427087e9fbSfslongjin
3437087e9fbSfslongjin&emsp;&emsp;指向特定类型的结构体的,用作迭代起点的指针
3447087e9fbSfslongjin
3457087e9fbSfslongjin**head**
3467087e9fbSfslongjin
3477087e9fbSfslongjin&emsp;&emsp;指向要开始迭代的struct List结构体的指针
3487087e9fbSfslongjin
3497087e9fbSfslongjin**member**
3507087e9fbSfslongjin
3517087e9fbSfslongjin&emsp;&emsp;struct List在pos的结构体中的成员变量名
3527087e9fbSfslongjin
3537087e9fbSfslongjin(_list_for_each_entry_continue)=
3547087e9fbSfslongjin### `list_for_each_entry_continue(pos, head, member)`
3557087e9fbSfslongjin
3567087e9fbSfslongjin#### 描述
3577087e9fbSfslongjin
3587087e9fbSfslongjin&emsp;&emsp;从指定的位置的【下一个元素开始】,继续迭代给定的链表
3597087e9fbSfslongjin
3607087e9fbSfslongjin#### 参数
3617087e9fbSfslongjin
3627087e9fbSfslongjin**pos**
3637087e9fbSfslongjin
3647087e9fbSfslongjin&emsp;&emsp;指向特定类型的结构体的指针。该指针用作迭代的指针。
3657087e9fbSfslongjin
3667087e9fbSfslongjin**head**
3677087e9fbSfslongjin
3687087e9fbSfslongjin&emsp;&emsp;指向要开始迭代的struct List结构体的指针
3697087e9fbSfslongjin
3707087e9fbSfslongjin**member**
3717087e9fbSfslongjin
3727087e9fbSfslongjin&emsp;&emsp;struct List在pos的结构体中的成员变量名
3737087e9fbSfslongjin
3747087e9fbSfslongjin### `list_for_each_entry_continue_reverse(pos, head, member)`
3757087e9fbSfslongjin
3767087e9fbSfslongjin#### 描述
3777087e9fbSfslongjin
3787087e9fbSfslongjin&emsp;&emsp;从指定的位置的【上一个元素开始】,【逆序】迭代给定的链表
3797087e9fbSfslongjin
3807087e9fbSfslongjin#### 参数
3817087e9fbSfslongjin
3827087e9fbSfslongjin&emsp;&emsp;与{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&emsp;&emsp;从指定的位置开始,继续迭代给定的链表
3897087e9fbSfslongjin
3907087e9fbSfslongjin#### 参数
3917087e9fbSfslongjin
3927087e9fbSfslongjin&emsp;&emsp;与{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&emsp;&emsp;从指定的位置的【下一个元素开始】,继续迭代给定的链表.(支持删除当前链表结点)
4007087e9fbSfslongjin
4017087e9fbSfslongjin#### 参数
4027087e9fbSfslongjin
4037087e9fbSfslongjin**pos**
4047087e9fbSfslongjin
4057087e9fbSfslongjin&emsp;&emsp;指向特定类型的结构体的指针。该指针用作迭代的指针。
4067087e9fbSfslongjin
4077087e9fbSfslongjin**n**
4087087e9fbSfslongjin
4097087e9fbSfslongjin&emsp;&emsp;用于存储临时值的,和pos相同类型的指针
4107087e9fbSfslongjin
4117087e9fbSfslongjin**head**
4127087e9fbSfslongjin
4137087e9fbSfslongjin&emsp;&emsp;指向要开始迭代的struct List结构体的指针
4147087e9fbSfslongjin
4157087e9fbSfslongjin**member**
4167087e9fbSfslongjin
4177087e9fbSfslongjin&emsp;&emsp;struct List在pos的结构体中的成员变量名
4187087e9fbSfslongjin
4197087e9fbSfslongjin### `list_for_each_entry_safe_continue_reverse(pos, n, head, member)`
4207087e9fbSfslongjin
4217087e9fbSfslongjin#### 描述
4227087e9fbSfslongjin
4237087e9fbSfslongjin&emsp;&emsp;从指定的位置的【上一个元素开始】,【逆序】迭代给定的链表。(支持删除当前链表结点)
4247087e9fbSfslongjin
4257087e9fbSfslongjin#### 参数
4267087e9fbSfslongjin
4277087e9fbSfslongjin&emsp;&emsp;与{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&emsp;&emsp;从指定的位置开始,继续迭代给定的链表.(支持删除当前链表结点)
4347087e9fbSfslongjin
4357087e9fbSfslongjin#### 参数
4367087e9fbSfslongjin
4377087e9fbSfslongjin&emsp;&emsp;与{ref}`list_for_each_entry_safe_continue() <_list_for_each_entry_safe_continue>`的相同
4387087e9fbSfslongjin
43939a09ffdSfslongjin---
44039a09ffdSfslongjin
44139a09ffdSfslongjin## 基础C函数库
44239a09ffdSfslongjin
44339a09ffdSfslongjin&emsp;&emsp;内核编程与应用层编程不同,你将无法使用LibC中的函数来进行编程。为此,内核实现了一些常用的C语言函数,并尽量使其与标准C库中的函数行为相近。值得注意的是,这些函数的行为可能与标准C库函数不同,请在使用时仔细阅读以下文档,这将会为你带来帮助。
44439a09ffdSfslongjin
44539a09ffdSfslongjin### 字符串操作
44639a09ffdSfslongjin
44739a09ffdSfslongjin#### `int strlen(const char *s)`
44839a09ffdSfslongjin
44939a09ffdSfslongjin##### 描述
45039a09ffdSfslongjin
451b0474540Sfslongjin&emsp;&emsp;测量并返回字符串长度。
45239a09ffdSfslongjin
45339a09ffdSfslongjin##### 参数
45439a09ffdSfslongjin
45539a09ffdSfslongjin**src**
45639a09ffdSfslongjin
457b0474540Sfslongjin&emsp;&emsp;源字符串
45839a09ffdSfslongjin
45939a09ffdSfslongjin#### `long strnlen(const char *src, unsigned long maxlen)`
46039a09ffdSfslongjin
46139a09ffdSfslongjin##### 描述
46239a09ffdSfslongjin
46339a09ffdSfslongjin&emsp;&emsp;测量并返回字符串长度。当字符串长度大于maxlen时,返回maxlen
46439a09ffdSfslongjin
46539a09ffdSfslongjin##### 参数
46639a09ffdSfslongjin
46739a09ffdSfslongjin**src**
46839a09ffdSfslongjin
46939a09ffdSfslongjin&emsp;&emsp;源字符串
47039a09ffdSfslongjin
47139a09ffdSfslongjin**maxlen**
47239a09ffdSfslongjin
47339a09ffdSfslongjin&emsp;&emsp;最大长度
47439a09ffdSfslongjin
47539a09ffdSfslongjin#### `long strnlen_user(const char *src, unsigned long maxlen)`
47639a09ffdSfslongjin
47739a09ffdSfslongjin##### 描述
47839a09ffdSfslongjin
479b0474540Sfslongjin&emsp;&emsp;测量并返回字符串长度。当字符串长度大于maxlen时,返回maxlen。
48039a09ffdSfslongjin
48139a09ffdSfslongjin&emsp;&emsp;该函数会进行地址空间校验,要求src字符串必须来自用户空间。当源字符串来自内核空间时,将返回0.
48239a09ffdSfslongjin
48339a09ffdSfslongjin##### 参数
48439a09ffdSfslongjin
48539a09ffdSfslongjin**src**
48639a09ffdSfslongjin
487b0474540Sfslongjin&emsp;&emsp;源字符串,地址位于用户空间
48839a09ffdSfslongjin
48939a09ffdSfslongjin**maxlen**
49039a09ffdSfslongjin
491b0474540Sfslongjin&emsp;&emsp;最大长度
49239a09ffdSfslongjin
49339a09ffdSfslongjin#### `char *strncpy(char *dst, const char *src, long count)`
49439a09ffdSfslongjin
49539a09ffdSfslongjin##### 描述
49639a09ffdSfslongjin
497b0474540Sfslongjin&emsp;&emsp;拷贝长度为count个字节的字符串,返回dst字符串
49839a09ffdSfslongjin
49939a09ffdSfslongjin##### 参数
50039a09ffdSfslongjin
50139a09ffdSfslongjin**src**
50239a09ffdSfslongjin
503b0474540Sfslongjin&emsp;&emsp;源字符串
50439a09ffdSfslongjin
50539a09ffdSfslongjin**dst**
50639a09ffdSfslongjin
50739a09ffdSfslongjin&emsp;&emsp;目标字符串
50839a09ffdSfslongjin
50939a09ffdSfslongjin**count**
51039a09ffdSfslongjin
511b0474540Sfslongjin&emsp;&emsp;要拷贝的源字符串的长度
51239a09ffdSfslongjin
513d9ee6ea8Sfslongjin#### `char *strcpy(char *dst, const char *src)`
514d9ee6ea8Sfslongjin
515d9ee6ea8Sfslongjin##### 描述
516d9ee6ea8Sfslongjin
517d9ee6ea8Sfslongjin&emsp;&emsp;拷贝源字符串,返回dst字符串
518d9ee6ea8Sfslongjin
519d9ee6ea8Sfslongjin##### 参数
520d9ee6ea8Sfslongjin
521d9ee6ea8Sfslongjin**src**
522d9ee6ea8Sfslongjin
523d9ee6ea8Sfslongjin&emsp;&emsp;源字符串
524d9ee6ea8Sfslongjin
525d9ee6ea8Sfslongjin**dst**
526d9ee6ea8Sfslongjin
527d9ee6ea8Sfslongjin&emsp;&emsp;目标字符串
528d9ee6ea8Sfslongjin
52939a09ffdSfslongjin#### `long strncpy_from_user(char *dst, const char *src, unsigned long size)`
53039a09ffdSfslongjin
53139a09ffdSfslongjin##### 描述
53239a09ffdSfslongjin
53339a09ffdSfslongjin&emsp;&emsp;从用户空间拷贝长度为count个字节的字符串到内核空间,返回拷贝的字符串的大小
53439a09ffdSfslongjin
53539a09ffdSfslongjin&emsp;&emsp;该函数会对字符串的地址空间进行校验,防止出现地址空间越界的问题。
53639a09ffdSfslongjin
53739a09ffdSfslongjin##### 参数
53839a09ffdSfslongjin
53939a09ffdSfslongjin**src**
54039a09ffdSfslongjin
54139a09ffdSfslongjin&emsp;&emsp;源字符串
54239a09ffdSfslongjin
54339a09ffdSfslongjin**dst**
54439a09ffdSfslongjin
545b0474540Sfslongjin&emsp;&emsp;目标字符串
54639a09ffdSfslongjin
54739a09ffdSfslongjin**size**
54839a09ffdSfslongjin
54939a09ffdSfslongjin&emsp;&emsp;要拷贝的源字符串的长度
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&emsp;&emsp;第一个字符串
57039a09ffdSfslongjin
57139a09ffdSfslongjin**SecondPart**
57239a09ffdSfslongjin
57339a09ffdSfslongjin&emsp;&emsp;第二个字符串
57439a09ffdSfslongjin
575b0474540Sfslongjin#### `printk(const char* fmt, ...)`
57639a09ffdSfslongjin
577b0474540Sfslongjin##### 描述
57839a09ffdSfslongjin
579b0474540Sfslongjin&emsp;&emsp;该宏能够在控制台上以黑底白字格式化输出字符串.
58039a09ffdSfslongjin
581b0474540Sfslongjin##### 参数
582b0474540Sfslongjin
583b0474540Sfslongjin**fmt**
584b0474540Sfslongjin
585b0474540Sfslongjin&emsp;&emsp;源格式字符串
586b0474540Sfslongjin
587b0474540Sfslongjin**...**
588b0474540Sfslongjin
589b0474540Sfslongjin&emsp;&emsp;可变参数
590b0474540Sfslongjin
591b0474540Sfslongjin#### `printk_color(unsigned int FRcolor, unsigned int BKcolor, const char* fmt, ...)`
592b0474540Sfslongjin
593b0474540Sfslongjin##### 描述
594b0474540Sfslongjin
595b0474540Sfslongjin&emsp;&emsp;在控制台上以指定前景色和背景色格式化输出字符串.
596b0474540Sfslongjin
597b0474540Sfslongjin##### 参数
598b0474540Sfslongjin
599b0474540Sfslongjin**FRcolor**
600b0474540Sfslongjin
601b0474540Sfslongjin&emsp;&emsp;前景色
602b0474540Sfslongjin
603b0474540Sfslongjin**BKcolor**
604b0474540Sfslongjin
605b0474540Sfslongjin&emsp;&emsp;背景色
606b0474540Sfslongjin
607b0474540Sfslongjin**fmt**
608b0474540Sfslongjin
609b0474540Sfslongjin&emsp;&emsp;源格式字符串
610b0474540Sfslongjin
611b0474540Sfslongjin**...**
612b0474540Sfslongjin
613b0474540Sfslongjin&emsp;&emsp;可变参数
614b0474540Sfslongjin
615b0474540Sfslongjin#### `int vsprintf(char *buf, const char *fmt, va_list args)`
616b0474540Sfslongjin
617b0474540Sfslongjin##### 描述
618b0474540Sfslongjin
619b0474540Sfslongjin&emsp;&emsp;按照fmt格式化字符串,并将结果输出到buf中,返回写入buf的字符数量。
620b0474540Sfslongjin
621b0474540Sfslongjin##### 参数
622b0474540Sfslongjin
623b0474540Sfslongjin**buf**
624b0474540Sfslongjin
625b0474540Sfslongjin&emsp;&emsp;输出缓冲区
626b0474540Sfslongjin
627b0474540Sfslongjin**fmt**
628b0474540Sfslongjin
629b0474540Sfslongjin&emsp;&emsp;源格式字符串
630b0474540Sfslongjin
631b0474540Sfslongjin**args**
632b0474540Sfslongjin
633b0474540Sfslongjin&emsp;&emsp;可变参数列表
634b0474540Sfslongjin
635b0474540Sfslongjin#### `int sprintk(char *buf, const char *fmt, ...)`
636b0474540Sfslongjin
637b0474540Sfslongjin##### 描述
638b0474540Sfslongjin
639b0474540Sfslongjin&emsp;&emsp;按照fmt格式化字符串,并将结果输出到buf中,返回写入buf的字符数量。
640b0474540Sfslongjin
641b0474540Sfslongjin##### 参数
642b0474540Sfslongjin
643b0474540Sfslongjin**buf**
644b0474540Sfslongjin
645b0474540Sfslongjin&emsp;&emsp;输出缓冲区
646b0474540Sfslongjin
647b0474540Sfslongjin**fmt**
648b0474540Sfslongjin
649b0474540Sfslongjin&emsp;&emsp;源格式字符串
650b0474540Sfslongjin
651b0474540Sfslongjin**...**
652b0474540Sfslongjin
653b0474540Sfslongjin&emsp;&emsp;可变参数
654357343b0Sfslongjin
655357343b0Sfslongjin### 内存操作
656357343b0Sfslongjin
657357343b0Sfslongjin#### `void *memcpy(void *dst, const void *src, uint64_t size)`
658357343b0Sfslongjin
659357343b0Sfslongjin##### 描述
660357343b0Sfslongjin
661357343b0Sfslongjin&emsp;&emsp;将内存从src处拷贝到dst处。
662357343b0Sfslongjin
663357343b0Sfslongjin##### 参数
664357343b0Sfslongjin
665357343b0Sfslongjin**dst**
666357343b0Sfslongjin
667357343b0Sfslongjin&emsp;&emsp;指向目标地址的指针
668357343b0Sfslongjin
669357343b0Sfslongjin**src**
670357343b0Sfslongjin
671357343b0Sfslongjin&emsp;&emsp;指向源地址的指针
672357343b0Sfslongjin
673357343b0Sfslongjin**size**
674357343b0Sfslongjin
675357343b0Sfslongjin&emsp;&emsp;待拷贝的数据大小
676357343b0Sfslongjin
677357343b0Sfslongjin#### `void *memmove(void *dst, const void *src, uint64_t size)`
678357343b0Sfslongjin
679357343b0Sfslongjin##### 描述
680357343b0Sfslongjin
681357343b0Sfslongjin&emsp;&emsp;与`memcpy()`类似,但是在源数据区域与目标数据区域之间存在重合时,该函数能防止数据被错误的覆盖。
682357343b0Sfslongjin
683357343b0Sfslongjin##### 参数
684357343b0Sfslongjin
685357343b0Sfslongjin**dst**
686357343b0Sfslongjin
687357343b0Sfslongjin&emsp;&emsp;指向目标地址的指针
688357343b0Sfslongjin
689357343b0Sfslongjin**src**
690357343b0Sfslongjin
691357343b0Sfslongjin&emsp;&emsp;指向源地址的指针
692357343b0Sfslongjin
693357343b0Sfslongjin**size**
694357343b0Sfslongjin
695357343b0Sfslongjin&emsp;&emsp;待拷贝的数据大小
696