背景
当前M核编译时上层组件与内核统一使用musl-C,位于//third_party/musl/porting/liteos_m/kernel/
,内核当前的内部实现也是主要适配musl的结构体定义,但社区及三方厂商开发多使用公版工具链arm-none-eabi-gcc
加上私有定制优化进行编译,考虑我们内核的易用性提升,故支持公版arm-none-eabi-gcc
C库编译内核运行。
Newlib
-
newlib是小型C库,针对posix接口涉及系统调用的部分,newlib提供一些需要系统适配的钩子函数,例如
_exit()
,_open()
,_close()
,_gettimeofday()
等,操作系统适配这些钩子,就可以使用公版newlib工具链编译运行程序。 -
公版
arm-none-eabi-
工具链中带有通用newlib的C库头文件,在一份通用的C库头文件中,使用不同的宏开关来控制一些 宏、类型、结构体、函数的声明或者定义。这些宏有以下几种:1> 根据posix标准划分,例如:
_POSIX_TIMERS
,_POSIX_CPUTIME
,_POSIX_THREADS
等。2> 根据已支持的系统,例如:
__CYGWIN__
,__rtems__
,__unix__
等。3> 根据C库不同版本,例如:
_GNU_SOURCE
,_BSD_SOURCE
等。
方案
当前内核现状
-
LiteOS-M不区分用户态内核态,上层组件与内核共用一套基于musl的C库,虽然编译时使用
arm-none-eabi-gcc
,但只使用其工具链的编译功能,通过加上-nostdinc
与-nostdlib
强制使用我们自己改造后的musl-C。 -
内核提供了基于LOS_XXX适配实现pthread、mqeue、fs、semaphore、time等模块的posix接口(
//kernel/liteos_m/kal/posix
) -
内核提供的posix接口与musl中的标准C库接口共同组成LiteOS-M的LibC。