鸿蒙轻内核M核源码分析系列十九 Musl LibC

LiteOS-M内核LibC实现有2种,可以根据需求进行二选一,分别是musl libC和newlibc。本文先学习下Musl LibC的实现代码。文中所涉及的源码,均可以在开源站点 https://gitee.com/openharmony/kernel_liteos_m 获取。LiteOS-M内核提供了和内核相关的文件系统、内存申请释放接口,其他接口可以直接使用Musl提供的。我们分别来看下内核提供的接口部分。


1、Musl LibC文件系统

在使用Musl LibC并且使能支持POSIX FS API时,可以使用文件kal\libc\musl\fs.c中定义的文件系统操作接口。这些是标准的POSIX接口,如果想了解其用法,可以参考 Section 2: system calls 。可以在网页上搜索,也可以直接把上述网址和函数名称进行拼接,如对于mount()函数,可以直接访问 https://linux.die.net/man/2/mount 。opendir等部分函数需要在 Section 3: library functions 网页上查看。下文快速记录下各个函数的使用方法。

1.1 函数mount

函数mount会挂载source参数(通常是设备名称,也可以是目录)指定的文件系统到target参数指定的目录。文件系统类型LiteOS-M内核支持"fat"和"littlefs"两种类型。"littlefs"文件系统不需要挂载选项参数mountflags。对于fat文件类型,挂载选项参数定义在文件third_party\musl\porting\liteos_m\kernel\include\sys\mount.h中,如MS_RDONLY、MS_NOSUID、MS_REMOUNT等等。参数data由文件系统进行解析,fat文件类型不需要该参数;"littlefs"文件系统需要传入的data参数应该为 (struct lfs_config*)指针类型。

该函数会调用components\fs\vfs\los_fs.c中的函数LOS_FsMount,后文会专门讲解FS VFS。

int mount(const char *source, const char *target,
              const char *filesystemtype, unsigned long mountflags,
              const void *data)
{
    return LOS_FsMount(source, target, filesystemtype, mountflags, data);
}

1.2 函数umount和umount2

函数umount, umount2用于unmount卸载文件系统。参数target指定要卸载的文件系统。函数umount2除了卸载,还可以指定flag参数来控制卸载行为。支持的参数定义在third_party\musl\porting\liteos_m\kernel\include\sys\mount.h,如MNT_FORCE、MNT_DETACH、MNT_EXPIRE和UMOUNT_NOFOLLOW。

int umount(const char *target)
{
    return LOS_FsUmount(target);
}

int umount2(const char *target, int flag)
{
    return LOS_FsUmount2(target, flag);
}

1.3 函数open、close和unlink

函数open用于打开一个文件或设备,可能会先创建文件或设备。参数path指定文件或设备的路径,参数oflag需要使用下面的访问模式O_RDONLY, O_WRONLY, O_RDWR中的一个,这几个定义在文件third_party\musl\porting\liteos_m\kernel\include\fcntl.h。third_party\musl\porting\liteos_m\kernel\include\bits

musl libc 是一个量级、高效且可移植的 C 标准库实现,专为嵌入式系统和资源受限环境设计。它与 GNU C Library (glibc) 不同,强调小体积和高性能,同时保持对 POSIX 标准的良好兼容性。 ### 功能 musl libc 提供了完整的 C 标准库功能,包括但不限于字符串处理、内存管理、文件 I/O、网络编程接口等[^2]。此外,它还支持线程安全和异步信号安全的函数调用,适合多线程应用程序开发。 ### 特点 - **量化**:相比 glibcmusl libc 的二进制大小显著更小,这使得它非常适合用于嵌入式设备和容器化应用。 - **性能优化**:在某些场景下,musl libc 的执行效率高于 glibc,尤其是在启动时间和内存占用方面表现优异[^1]。 - **安全性增强**:默认启用 Position Independent Executables (PIE) 和 stack-smashing protection 等安全机制,有助于提升系统的整体安全性[^3]。 - **高度可移植**:musl libc 支持多种架构和操作系统内核,能够松地在不同平台上编译和运行。 ### 使用场景 - **嵌入式系统**:由于其小巧的体积和低资源消耗,musl libc 常被应用于嵌入式设备中,如路由器、智能家电等。 - **容器镜像构建**:在 Docker 或其他容器技术中,使用 musl libc 可以创建非常小的基础镜像,加快部署速度并减少攻击面。 - **静态链接**:当开发者希望生成完全静态链接的应用程序时,musl libc 提供了一个很好的选择,因为它可以很容易地与其他组件静态链接而不引入额外依赖。 - **需要高安全性的环境**:通过内置的安全特性,musl libc 适用于那些对安全性有较高要求的应用场景。 ```c // 示例代码 - 简单的 "Hello, world!" 程序 #include <stdio.h> int main(void) { printf("Hello, world!\n"); return 0; } ``` 上述示例展示了如何使用 musl libc 编写一个简单的 C 程序。这个程序利用了标准输入输出库 `stdio.h` 来打印一条消息到控制台。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值