
Linux 内核 API 全景指南从基础 C 库函数到同步原语的官方文档导读与源码解析【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux本指南以 Linux 内核文档 Documentation/core-api/kernel-api.rst 为骨架系统梳理内核为驱动与内核模块开发者提供的全部核心 API 家族——字符串转换与操作、位图与位操作、CRC 与数学函数、kfifo 环形缓冲、relay 数据通道、模块自动加载、DMA 与资源管理、块设备与时钟框架以及 RCU 同步原语。读完本文你将掌握每类 API 的适用场景、入口文件与关键函数签名并能在编写驱动时按图索骥定位到具体实现源码。该文档是内核 Core API 手册中历史最悠久、覆盖面最广的一篇“索引型”文档文档自身也承认它是 docbook 时代遗留的“大杂烩”见 Documentation/core-api/index.rst。它本身几乎不包含函数实现而是通过 kernel-doc 指令把各源码文件中带注释的导出函数逐一拉入渲染结果。因此要真正读懂这份文档必须沿着它列出的源码路径深入实现。下面按文档原有的章节顺序逐一展开并补充源码级细节。一、基础 C 库函数Basic C Library Functions内核运行在裸机环境驱动代码不能使用用户态 C 标准库如 glibc中的例程。内核为此挑选了一批“被证明普遍有用”的函数重写为内核版本。文档特别提醒这些函数的行为可能与 ANSI C 标准略有差异差异点均已在源码注释中标注。1.1 字符串转换String Conversions字符串 ↔ 数字转换是驱动解析模块参数、sysfs 属性、procfs 输入的刚需对应四组源码lib/vsprintf.c:export:——printf 家族格式化输出include/linux/kstrtox.h:functions: kstrtol kstrtoul——内联封装lib/kstrtox.c:export:——kstrto* 系列严格转换实现lib/string_helpers.c:export:——字符串辅助工具大小写转换、布尔解析等。printf 家族在 lib/vsprintf.c 中实现核心函数包括函数语义要点vsnprintf/snprintf写入长度受限的缓冲区返回本应写入的字符数可能大于缓冲长度需自行截断处理vscnprintf/scnprintf与上面类似但返回值被限制为实际写入长度更安全sprintf不检查缓冲区长度仅在对目标大小有绝对把握时使用sscanf反向解析格式化输入内核的vsnprintf除标准%d/%x/%s外还支持大量内核专用格式符%p家族指针格式、%pa物理地址等这部分由 Documentation/core-api/printk-formats.rst 单独成文。*kstrto严格转换**是文档点名强调要用的 API。以 include/linux/kstrtox.h 中kstrtoul的文档注释为准s以 NUL 结尾的字符串结尾前可带一个换行符用于解析来自 sysfs 的单行输入首字符可为无符号版本不允许-base最大支持 16。若传 0则按惯例自动识别进制——0x开头按十六进制大小写不敏感0开头按八进制否则按十进制res成功时写入结果返回值0成功-ERANGE溢出-EINVAL解析错误。源码注释明确写着“Preferred over simple_strtoul(). Return code must be checked.”优先于simple_strtoul()且必须检查返回值。kstrtoul/kstrtol是头文件里的static inline封装当unsigned long与unsigned long long位宽一致时会直接转发到kstrtoull避免一次函数调用见 include/linux/kstrtox.h。在 lib/kstrtox.c 中可以看到kstrtoull的真实实现先跳过前导随后由_parse_integer_fixup_radix()处理基数修正、_parse_integer()完成逐字符解析解析结果若带KSTRTOX_OVERFLOW标志返回-ERANGE尾部残留非\n字符则返回-EINVAL。kstrtoll则额外处理负号并对LONG_MIN边界做-tmp 0的溢出判断lib/kstrtox.c。从源码结构看lib/kstrtox.c还提供了kstrtouint、kstrtoint、kstrtobool、kstrto*_from_user等一系列变体全部EXPORT_SYMBOL导出可供模块直接调用。1.2 字符串操作String Manipulationinclude/linux/fortify-string.h:internal:——编译器加固的字符串/内存操作lib/string.c:export:——str*/mem*函数的核心实现include/linux/string.h:internal:——内联与声明mm/util.c:functions:限定——kstrdup家族内存复制函数。include/linux/fortify-string.h是内核自带的“缓冲区溢出静态检测”层它在编译期利用__builtin_object_size()推算目标缓冲区大小并对memcpy、memmove、memset、strcpy、strcat等操作做“写/读是否安全”的组合检查。文件中那张检查矩阵表include/linux/fortify-string.h清晰说明当目标与源大小均为已知常量时编译期即可拦截越界一旦涉及动态长度则可能退化为运行期B可能触发 fortify panic或V验证通过。这解释了为什么内核强烈推荐strscpy()——include/linux/string.h 中strscpy的注释表明它把源字符串拷入定长缓冲并保证 NUL 结尾返回值是拷贝的字符数或-E2BIG比strcpy安全得多。kstrdup 家族定义于 mm/util.c是“分配 复制”的一体化封装函数语义kstrdup(s, gfp)分配足够空间并复制字符串返回新副本失败返回 NULLmm/util.ckstrdup_const(s, gfp)若源字符串位于.rodata段is_kernel_rodata()判断则直接返回原指针、零拷贝否则回退kstrdup。配套必须用kfree_const()释放且不可传给krealloc()mm/util.ckstrndup(s, max, gfp)最多读max字符内部走strnlen__kmemdup_nulmm/util.ckmemdup(src, len, gfp)复制任意内存区域结果是物理连续的新副本用kfree()释放mm/util.ckmemdup_nul/memdup_user/vmemdup_user/strndup_user/memdup_user_nul分别用于“为无 NUL 数据补 NUL”和“从用户态安全复制”场景*_user版本会处理缺页与access_ok校验二、基础内核库函数Basic Kernel Library Functions2.1 位操作Bit Operations位操作由三个“instrumented插桩”头文件提供分别对应原子、非原子与加锁语义include/asm-generic/bitops/instrumented-atomic.h:internal:——set_bit、clear_bit、change_bit、test_and_set_bit等原子版本include/asm-generic/bitops/instrumented-non-atomic.h:internal:——__set_bit等非原子版本适合单线程或已加锁场景include/asm-generic/bitops/instrumented-lock.h:internal:——test_and_set_bit_lock等用于自旋锁实现的版本。“instrumented”意味着这些实现除了调用架构相关的arch_*位操作外还会叠加 KASAN内核地址消毒器与 KCSAN数据竞争检测检查——从命名可推断这是内核把位操作统一纳入内存检测体系的设计。2.2 位图操作Bitmap Operations位图是内核管理大量布尔状态如 CPU 在线掩码cpumask、内存节点掩码nodemask的基础数据结构lib/bitmap.c 的DOC: bitmap introduction开篇lib/bitmap.c说明位图本质是一个无符号长整型数组位宽可变include/linux/bitmap.h 提供三篇 DOCdeclare bitmapDECLARE_BITMAP宏的声明方式、bitmap overview概览与命名约定、bitmap bitops位操作语义随后的:export:与:internal:指令拉入全部导出/内部函数。常用 API 包括bitmap_set/clear批量置位/清位、bitmap_find_next_zero_area在 lib/bitmap.c 中实现用于在连续区域内寻找对齐的空闲区是分配器常用原语、bitmap_remap/bitmap_bitremap/bitmap_onto/bitmap_fold位图重映射与折叠、bitmap_from_arr32/to_arr32与u32数组互转见 lib/bitmap.c。头文件还提供了bitmap_alloc/kzalloc/free等便捷封装。2.3 命令行解析Command-line Parsinglib/cmdline.c:export:实现内核启动参数与模块参数的命令行解析原语核心函数包括get_option/get_options——从a,b,c形式的逗号分隔字符串中依次取出整数memparse——解析带K/M/G/T后缀的内存大小字符串如mem512Mparse_option_str——检查逗号分隔字符串中是否含指定选项。这些是early_param、__setup等启动参数框架的底层基础。2.4 错误指针Error Pointersinclude/linux/err.h:internal:实现内核独特的“错误即指针”约定内核把ERR_PTR(-EINVAL)之类的负错误码直接编码进指针的低位地址空间配合IS_ERR()、PTR_ERR()、IS_ERR_OR_NULL()、ERR_CAST()等内联函数让返回值为“指针或错误码”的函数免去额外的错误变量。使用时要求错误码必须落在-MAX_ERRNO到 0 的范围内约 -4095 到 0。2.5 排序Sortinglib/sort.c:export:——通用数组排序sort()函数接受元素大小、比较回调与可选的交换回调交换回调可用于特殊对齐或加锁需求lib/list_sort.c:export:——链表归并排序list_sort()专门针对内核双向链表struct list_head优化比把链表转数组再排序更省内存且无需额外存储。2.6 文本搜索Text Searchinglib/textsearch.c 提供内核态的模式匹配框架DOC: ts_introlib/textsearch.c 对应的 kernel-doc 段落说明其设计通过struct ts_config抽象出“KMP、BM、有限自动机”等不同匹配算法的统一接口。include/linux/textsearch.h 中明确导出的四个查询函数textsearch_find——从给定状态继续搜索下一个匹配textsearch_next——获取匹配上下文中的下一段textsearch_get_pattern——取回本次匹配的模式数据textsearch_get_pattern_len——取回模式长度。该框架常用于网络报文内容过滤如 netfilter 的字符串匹配等场景。三、CRC 与数学函数CRC and Math Functions in Linux3.1 算术溢出检查Arithmetic Overflow Checkinginclude/linux/overflow.h:internal:提供编译期/运行期结合的溢出安全运算check_add_overflow、check_sub_overflow、check_mul_overflow返回是否溢出size_add/size_mul等size_*系列则在溢出时返回SIZE_MAX是防整数溢出的标准工具广泛用于大小计算与边界检查。3.2 CRC 函数CRC Functions内核内置从 4 位到 64 位的完整 CRC 库全部在 lib/crc/ 目录下且均为:export:导出驱动可直接调用文件提供能力lib/crc/crc4.c4 位 CRC常用于小型协议帧校验lib/crc/crc7.c7 位 CRC典型如 MMC/SD 协议的命令 CRC7lib/crc/crc8.c8 位 CRC支持自定义多项式lib/crc/crc16.c16 位 CRCCCITT 等变体lib/crc/crc-ccitt.cCCITT 多项式 CRC如 X.25/HDLClib/crc/crc-itu-t.cITU-T 变体include/linux/crc32.hcrc32/crc32_be/crc32c等 32 位 CRC无 kernel-doc 指令属纯头文件接口include/linux/crc64.h64 位 CRC用于校验和增强场景如 bcachefs 等文件系统元数据校验3.3 2 的幂对数与幂函数Base 2 log and powerinclude/linux/log2.h:internal:提供编译期与运行期两套 2 的幂工具ilog2()取整后的以 2 为底对数、roundup_pow_of_two/rounddown_pow_of_two向上/向下对齐到 2 的幂、is_power_of_2判断是否为 2 的幂。部分实现是__builtin_constant_p优化的 constexpr可在编译期完成计算。3.4 整数对数与幂函数Integer log and powerinclude/linux/int_log.h——整数对数族扩展lib/math/int_pow.c:export:——int_pow()整数幂运算快速幂算法lib/math/int_sqrt.c:export:——int_sqrt()整数平方根无浮点依赖适合无 FPU 的嵌入式平台。3.5 除法函数Division Functionsinclude/asm-generic/div64.h 的do_div——64 位除以 32 位、结果写回被除数、返回余数。它设计为宏而非函数原因是 32 位平台上 64 位除法需要库函数辅助宏可避免返回值传递开销include/linux/math64.h:internal:——div64_u64、div_s64、mul_u64_u32_div等更通用的 64 位数学运算lib/math/gcd.c:export:——gcd()最大公约数欧几里得算法与lcm()最小公倍数。3.6 UUID/GUIDlib/uuid.c:export:实现 UUIDRFC 4122与 GUID 的解析与格式化uuid_parse/guid_parse文本转二进制、uuid_is_valid、以及%pU/%pG格式化辅助配合 vsprintf 使用。include/linux/uuid.h中定义了uuid_t/guid_t类型内核新代码应使用这些类型而非裸字节数组。四、内核 IPC 工具与 kfifo 环形缓冲4.1 IPC 实用程序IPC utilitiesipc/util.c:internal:是 System V IPC消息队列、信号量、共享内存的公共基础设施IPC 命名空间管理、ipc_addid/ipc_rmid等 ID 管理、权限检查ipcperms以及ipcget/ipcget_new等对象获取路径。kernel/ipc体系下的具体实现分别位于 ipc/msg.c、ipc/sem.c、ipc/shm.c。4.2 kfifo 接口kfifo interfaceinclude/linux/kfifo.h:internal:实现内核最常用的无锁单生产者/单消费者环形 FIFO全部为内联/宏实现无独立 .c 文件。核心 API定义与初始化DECLARE_KFIFO/INIT_KFIFO/kfifo_alloc/kfifo_init入队/出队kfifo_in/kfifo_out含_peek窥视、_user与用户态互拷版本kfifo_from_user/kfifo_to_user查询kfifo_is_empty/kfifo_is_full/kfifo_avail/kfifo_size/kfifo_len复位kfifo_reset。kfifo 要求缓冲区大小为 2 的幂宏内部通过(mask) (size) - 1的与运算实现环形索引这解释了为何DECLARE_KFIFO需要指定幂次。驱动中典型用于中断处理与内核线程之间的数据交接。五、relay 接口relay interface support文档明确给出 relay 接口的定位“为工具与设施提供从内核空间向用户空间高效中继大量数据的机制”。它在 kernel/relay.c 中实现export与internal两组 kernel-doc 分别覆盖公开 API 与内部机制公开 APIrelay_open创建通道并关联 debugfs 文件、relay_write/relay_reserve写入/预留、relay_close、relay_flush、relay_subbufs_consumed等工作机制每个 CPU 一个环形子缓冲区sub-buffer集合写满一个 sub-buffer 后通过回调通知用户态如通过 splice 或 mmap 读取从而在大量日志/跟踪数据的场景下避免每次写入都陷入系统调用。典型消费者如内核跟踪工具包括基于 relay 的早期 ftrace 通道。六、模块支持Module Support6.1 内核模块自动加载Kernel module auto-loadingkernel/module/kmod.c:export:实现模块按需加载的核心设施request_module——以modprobe方式请求加载指定模块最终调用/sbin/modprobe用户态助手request_module_nowait——不等待加载完成的异步变体适合中断上下文等不可睡眠路径__request_module——带格式串的低层实现。这套机制配合MODULE_ALIAS与 uevent 的MODALIAS字段实现了“设备插入 → 内核发 uevent → udev 调 modprobe → 模块自动加载”的完整闭环。文档最后补充说明模块间Inter Module支持细节请直接参阅 kernel/module/ 目录下的源文件——包括 kernel/module/main.c模块加载入口、kernel/module/kmod.c 等。6.2 模块调试统计Module debuggingkernel/module/stats.c 提供三篇 kernel-doc构成完整的模块加载失败诊断体系module debugging statistics overviewkernel/module/stats.c所有计数器均为增量式原子计数器用于统计模块加载失败的根因分布例如因内存不足ENOMEM失败多少次、因符号缺失失败多少次等dup_failed_modules - tracks duplicate failed moduleskernel/module/stats.c跟踪重复失败的模块——即多次尝试加载同一模块但持续失败的情况这类模块常暗示固件缺失或依赖未就绪module statistics debugfs counterskernel/module/stats.c这些计数器通过 debugfs 暴露kernel/module/stats.c 列出可供检查的调试计数器而 kernel/module/stats.c 展示了debugfs_create_ulong()创建只读计数器的模式。运维时可挂载 debugfs 后查看/sys/kernel/debug/modules/stats之类的节点来定位加载失败原因。七、硬件接口Hardware Interfaces7.1 DMA 通道DMA Channelskernel/dma.c:export:是 DMA 映射 API 的核心实现文件提供dma_map_single/dma_unmap_single、dma_map_sg/dma_unmap_sgSG 表批量映射、dma_alloc_coherent一致性内存分配等接口。完整的 DMA 使用教程见 Documentation/core-api/dma-api-howto.rst完整函数清单见 Documentation/core-api/dma-api.rst。7.2 资源管理Resources Managementkernel/resource.c 同时导出:internal:与:export:两组接口管理系统资源树I/O 端口、I/O 内存、IRQ 等公开 APIrequest_resource/release_resource注册/释放资源、allocate_resource在指定区间内分配、insert_resource/remove_resource内部实现以struct resource组成的树形结构iomem_resource、ioport_resource为根__request_region、__release_region等内部函数负责区间重叠检查与树操作。设备驱动中通过platform_get_resource/devm_ioremap_resource获取与映射资源的路径底层即依赖本文件。7.3 MTRR 处理MTRR Handlingarch/x86/kernel/cpu/mtrr/mtrr.c:export:提供 x86 特有的 MTRRMemory Type Range Registers内存类型范围寄存器管理接口如mtrr_add/mtrr_del。MTRR 用于为特定物理内存区间设置缓存属性WB/UC/WC 等在旧式 x86 平台上影响设备 MMIO 区域的缓存策略。注意该文件位于 x86 架构目录下仅对 x86 平台有意义。八、安全框架、审计接口与记账框架8.1 安全框架Security Frameworksecurity/security.c:internal:——LSMLinux Security Modules框架核心security_*系列钩子函数的统一分发层把capabilities、SELinux、AppArmor、Smack 等安全模块串联起来security/inode.c:export:——安全文件系统securityfs实现导出securityfs_create_file/securityfs_create_dir等接口供安全模块在用户态暴露配置节点。8.2 审计接口Audit Interfaces审计子系统Linux Audit的三个核心文件kernel/audit.c:export:——审计框架主体audit_log_start/audit_log_end/audit_log_format等日志接口审计规则接收与 netlink 通信kernel/auditsc.c:internal:——系统调用审计syscall auditing实现记录每个被审计系统调用的参数与结果kernel/auditfilter.c:internal:——审计规则过滤器的解析与匹配引擎。8.3 记账框架Accounting Frameworkkernel/acct.c:internal:实现进程记账BSD process accounting当进程退出时按acct()系统调用或内核启动参数开启的记账配置把进程的资源使用情况CPU 时间、内存峰值、退出状态等以struct acct记录追加到记账文件中。内核还提供了可选的CONFIG_BSD_PROCESS_ACCT_V3变体格式。九、块设备与字符设备9.1 块设备Block Devices块层是文档中源码引用最多的子系统覆盖从 BIO 结构到通用磁盘的完整链路文件覆盖内容include/linux/bvec.hbio_vec 段描述页、偏移、长度include/linux/bio.hBIO 结构定义与操作block/blk-core.c块层核心请求队列、submit_bio、I/O 调度入口export internalblock/blk-map.c用户/内核缓冲区到 BIO 的映射block/blk-sysfs.c请求队列的 sysfs 属性block/blk-settings.c队列参数最大扇区、对齐等设置block/blk-flush.c刷写flush与 FUA 语义block/blk-lib.cblkdev_issue_*批量操作discard/zeroout/write_sameblock/blk-integrity.cT10 PI 数据完整性DIF/DIXkernel/trace/blktrace.c块层 I/O 跟踪blktraceblock/genhd.c通用磁盘gendisk与分区管理export internalblock/bdev.c块设备block_device对象管理9.2 字符设备Char devicesfs/char_dev.c:export:提供字符设备注册核心接口register_chrdev_region/alloc_chrdev_region设备号分配、cdev_add/cdev_del字符设备对象挂载与卸载、unregister_chrdev_region释放设备号。字符设备驱动通常还会结合 fs/file_operations.c 中的 fops 结构与misc_register便捷框架使用。十、时钟框架Clock Framework文档对时钟框架给出了专门的大段说明这是本文件中少数带完整文字描述的部分核心结论如下定位为“软件管理系统时钟树”提供编程接口广泛用于 SoC 平台支撑电源管理与需要自定义时钟频率的设备与 RTC 无关文档特别澄清这里的“clock”与时间保持timekeeping或实时时钟RTC无关——RTC 与 timekeeping 各有独立框架。这里的struct clk实例管理的是如 96 MHz 的外设移位时钟这类功能时钟电源管理语义通过显式软件时钟门控实现省电——未使用的时钟被禁用避免晶体管在无意义的状态翻转中耗电部分平台还有硬件门控软件不关闭但硬件自动门控被断电但未时钟化的芯片区块可保持最后状态即retention mode保留模式。文档提醒保留模式仍有漏电流尤其在更细的电路制程下而 CMOS 电路功耗主要来自时钟化的状态翻转驱动编写要求电源感知power-aware驱动只在设备活跃使用时使能其时钟睡眠状态与时钟域系统睡眠状态常因活跃的时钟域而异——“standby”可能允许从多个活跃域唤醒而 “mem”suspend-to-RAM通常需要更彻底地关闭源自高速 PLL 与振荡器的时钟从而限制可用的唤醒源数量驱动suspend方法需要感知目标睡眠态下的系统时钟约束可编程时钟发生器部分平台支持可编程时钟发生器供外部芯片其他 CPU、多媒体编解码器、对接严格接口时序的设备使用。对应的完整接口文档由 include/linux/clk.h:internal:提供包括clk_get/clk_enable/clk_disable/clk_set_rate/clk_round_rate/clk_get_rate等。更详细的框架说明可参阅 Documentation/driver-api/clk.rst。十一、同步原语RCU 家族Synchronization Primitives文档最后用最大篇幅罗列了 RCURead-Copy Update读-复制-更新的完整源码清单这也是内核最核心的并发原语。按“通用 RCU → SRCU → 链表变体 → 任务级 RCU → 辅助设施”的层次梳理如下核心 RCU 与树形实现include/linux/rcupdate.h——RCU 主头文件rcu_read_lock/rcu_read_unlock、synchronize_rcu、call_rcu等核心 API 的声明与文档kernel/rcu/tree.c——树形 RCUTree RCU实现主体包括宽限期grace period推进、CPU 状态跟踪kernel/rcu/tree_exp.h——快速宽限期expedited grace period实现用于synchronize_rcu_expedited等低延迟路径kernel/rcu/update.c——RCU 更新侧辅助函数与synchronize_rcu的通用入口。SRCUSleepable RCUinclude/linux/srcu.h 与 kernel/rcu/srcutree.c——可睡眠 RCUsrcu_read_lock/srcu_read_unlock允许在读侧临界区睡眠适合读侧耗时的场景如文件系统路径查找。RCU 链表变体include/linux/rculist.h——RCU 安全的普通链表遍历/插入/删除include/linux/rculist_bl.h——针对 NULL 结尾与低位标志位优化的位锁链表变体include/linux/rculist_nulls.h——带 NULLS 标记的链表用指针低位编码哈希链编号用于需要避免“ABA 式误判”的哈希表场景如 UDP/TCP 查找。RCU 同步辅助include/linux/rcu_sync.h 与 kernel/rcu/sync.c——rcu_sync原语在“几乎不更新”与“频繁更新”两种模式间切换降低同步开销include/linux/rcupdate_trace.h——RCU-Tasks-Trace 变体面向 BPF 程序等场景include/linux/rcupdate_wait.h——RCU 等待辅助include/linux/rcuref.h——基于 RCU 的引用计数原语include/linux/rcutree.h——Tree RCU 内部数据结构声明非通用 API。任务级 RCU 与卡死检测kernel/rcu/tasks.h——RCU Tasks 变体Tasks、Tasks-Rude、Tasks-Trace实现用于追踪空闲任务kernel/rcu/tree_stall.h——宽限期卡死stall检测与报告逻辑当某 CPU 长时间不经历静止态时输出告警信息。RCU 的系统性讲解可参见 Documentation/RCU/ 目录其中 Documentation/RCU/whatisRCU.rst 是入门首选。结语如何用好这份 API 索引kernel-api.rst的独特价值在于它是一张“按子系统组织的源码导航图”文档中每一个 kernel-doc 指令都指向仓库中的真实文件而:export:表示拉取该文件所有带EXPORT_SYMBOL导出的函数文档:internal:表示拉取内部函数:functions:则是精挑个别函数:doc:专门提取DOC:注释段落。因此阅读本文后若需深挖某个 API最有效的路径是先按本文给出的文件链接打开源码找到对应函数的 kernel-doc 注释块通常位于函数定义正上方那里包含最权威的参数说明、返回值语义与使用注意事项再结合 Documentation/core-api/index.rst 中列出的专题文档如 Documentation/core-api/printk-formats.rst、Documentation/core-api/kfifo 相关章节 等获得更详细的用法示例。在编写驱动或内核模块时建议优先选择本文中标注“Preferred”如kstrto*之于simple_strto*或带_nul/_user后缀的强化版本 API它们在内核中经过了安全加固与语义修正是长期维护的推荐接口。【免费下载链接】linuxLinux kernel source tree项目地址: https://gitcode.com/GitHub_Trending/li/linux创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考