当前位置: 首页 > 科技观察

OpenHarmonyLiteOS-A内核文档学习--系统调用

时间:2023-03-13 20:36:30 科技观察

更多内容请访问:与华为官方共建的鸿蒙技术社区https://harmonyos.51cto.comOpenHarmonyLiteOS-A内核实现状态与内核模式区分和孤立。用户态程序不能直接访问内核资源,而系统调用为用户态程序提供了访问内核资源和与内核交互的通道。如下图所示,用户程序调用SystemAPI(系统API,通常是系统提供的POSIX接口)进行内核资源访问和交互请求。POSIX接口会触发SVC/SWI异常,完成系统从用户态到内核态的转换。Switch,然后解析连接到内核的SyscallHandler(系统调用统一处理接口)的参数,最后分发给具体的内核处理函数。SyscallHandler的具体实现在kernel/liteos_a/syscall/los_syscall.c中的OsArmA32SyscallHandle函数中。该函数会在系统软中断异常时被调用,系统调用的入口根据kernel/liteos_a/syscall/syscall_lookup.h中的list进行参数解析,执行每个系统调用最终对应的内核处理函数.1、涉及的系统调用的文件目录介绍首先介绍系统调用相关的内核态代码和用户态代码所在的文件目录。1.1syscall/syscall_lookup.h文件kernel/liteos_a/syscall/syscall_lookup.h文件维护了内核提供给用户态的系统调用接口。该文件包含虚拟文件系统VFS的系统调用接口,DYNLOAD、PIPE、SHELL、LWIP、SECURITY_CAPABILITY等模块的动态加载,文件内容如下。每个系统调用都由宏函数SYSCALL_HAND_DEF定义,包括系统调用号、系统调用处理函数、返回值类型、系统调用处理参数个数,下面详细介绍。...SYSCALL_HAND_DEF(__NR_write,SysWrite,ssize_t,ARG_NUM_3)SYSCALL_HAND_DEF(__NR_open,SysOpen,int,ARG_NUM_7)SYSCALL_HAND_DEF(__NR_close,SysClose,int,ARG_NUM_1)SYSCALL_HAND_DEF(__NR_creat,int,....Nsyscall..文件syscall_lookup.h是由文件syscall/los_syscall.c中的系统调用初始化函数OsSyscallHandleInit调用的,调用代码如下,可见第一个参数为系统调用函数号,定义在文件中third_party/musl/porting/liteos_a/kernel/include/bits/syscall.h;其次是系统调用函数,函数原型声明在文件kernel/liteos_a/syscall/los_syscall.h中,函数实现一般为实现在kernel/liteos_a/syscall目录下的源代码文件中;第三个是返回值类型,暂时用不到;第四个函数是系统调用函数的参数个数,我们来看一下代码宏函数.(1)ma在全局数组g_syscallHandle中保留定义的系统调用函数。(2)由于参数个数不会特别多,记录系统调用处理函数参数个数的全局数组g_syscallNArgs的类型为UINT8,每4位维护一个系统调用的参数个数。...staticUINTPTRg_syscallHandle[SYS_CALL_NUM]={0};staticUINT8g_syscallNArgs[(SYS_CALL_NUM+1)/NARG_PER_BYTE]={0};...voidOsSyscallHandleInit(void){#defineSYSCALL_HAND_DEF(id,fun,rType,nArg)\if(id)#include"syscall.h"/*新的系统调用用户态接口实现*/voidnewSyscallSample(intnum){printf("usermode:num=%d\n",num);__syscall(SYS_new_syscall_sample,num);return;}intmain(intargc,char**argv){printf("\n***************************************************\n");printf("\n\t\tHelloOHOS!\n");printf("\n*******************************************************\n\n");newSyscallSample(10);return0;}在工程根目录下,选择设置了hb的产品ipcamera_hispark_taurus,然后用hbbuild构建,用DeviceTool烧录Hi3516开发板,在串口运行得到输出结果如下。用户态界面和内核态界面都有输出,证明启用了系统调用。3.总结本文学习小系统内核开发-系统调用官网文档,并在Hi3516开发板上实际验证运行,通过动手操作更好的掌握系统调用。更多信息请访问:Harmonyos.51cto.com,与华为官方合作打造的鸿蒙技术社区