OpenHarmony LiteOS-A内核文档之学习--系统调用(2)

网友投稿 976 2022-05-29

2.3 在内核系统调用头文件中新增系统调用号

在内核系统调用头文件中新增系统调用号,如下所示,在third_party/musl/porting/liteos_a/kernel/include/bits/syscall.h文件中,__NR_new_syscall_sample为新增系统调用号。用户态代码和内核态代码增加系统调用号方式相同,编号相同。

/* OHOS customized syscalls, not compatible with ARM EABI */ #define __NR_OHOS_BEGIN 500 #define __NR_pthread_set_detach (__NR_OHOS_BEGIN + 0) ... #define __NR_sysconf (__NR_OHOS_BEGIN + 21) #define __NR_new_syscall_sample (__NR_OHOS_BEGIN + 22) /* 新增的系统调用号 __NR_new_syscall_sample:522 */ #define __NR_syscallend (__NR_OHOS_BEGIN + 23) ...

在kernel/liteos_a/syscall/syscall_lookup.h中,增加一行,如下。

... /* 当前现有的系统调用清单 */ SYSCALL_HAND_DEF(__NR_chown, SysChown, int, ARG_NUM_3) SYSCALL_HAND_DEF(__NR_chown32, SysChown, int, ARG_NUM_3) #ifdef LOSCFG_SECURITY_CAPABILITY SYSCALL_HAND_DEF(__NR_ohoscapget, SysCapGet, UINT32, ARG_NUM_2) SYSCALL_HAND_DEF(__NR_ohoscapset, SysCapSet, UINT32, ARG_NUM_1) #endif /* 新增系统调用 */ SYSCALL_HAND_DEF(__NR_new_syscall_sample, SysNewSyscallSample, void, ARG_NUM_1) ...

2.4 在内核中新增系统调用对应的处理函数

需要在内核中新增系统调用函数声明及函数实现,并加入编译构建文件。首先,如下所示,在kernel/liteos_a/syscall/los_syscall.h中,SysNewSyscallSample为新增系统调用的内核处理函数声明。

... /* 当前现有的系统调用内核处理函数声明清单 */ ... extern int SysTimerGettime64(timer_t timerID, struct itimerspec64 *value); ... /* 新增的系统调用内核处理函数声明 */ extern void SysNewSyscallSample(int num); ...

然后在kernel/liteos_a/syscall目录下新建个源文件syscall_demo.c,新增系统调用的内核处理函数实现如下。

#include "los_printf.h" /* 新增系统调用内核处理函数的实现 */ void SysNewSyscallSample(int num) { PRINTK("kernel mode: num = %d\n", num); return; }

最后,在文件kernel/liteos_a/syscall/BUILD.gn中增加对syscall_demo.c源文件的编译管理。

import("//kernel/liteos_a/liteos.gni") module_switch = defined(LOSCFG_KERNEL_SYSCALL) module_name = get_path_info(rebase_path("."), "name") kernel_module(module_name) { sources = [ "fs_syscall.c", ...... "syscall_demo.c" ] }

2.5 调用并验证

参考官网Hello World示例,修改示例applications/sample/camera/apps/src/helloworld.c,增加系统调用内容newSyscallSample(10)。

#include #include "syscall.h" /* 新增系统调用用户态的接口实现 */ void newSyscallSample(int num) { printf("user mode: num = %d\n", num); __syscall(SYS_new_syscall_sample, num); return; } int main(int argc, char **argv) { printf("\n************************************************\n"); printf("\n\t\tHello OHOS!\n"); printf("\n************************************************\n\n"); newSyscallSample(10); return 0; }

OpenHarmony LiteOS-A内核文档之学习--系统调用(2)

在工程根目录,hb set选择产品ipcamera_hispark_taurus,然后hb build构建,使用Device Tool工具烧录Hi3516开发板,运行在串口得到输出结果如下。用户态接口与内核态接口均有输出,证明系统调用已使能。

3. 小结

本文学习小型系统内核开发-系统调用官网文档,并在Hi3516开发板上实际验证操作,通过动手更好的掌握了系统调用。感谢阅读,如有任何问题、建议,都可以博客下留言给我,谢谢。

4. 官网参考资料

小型系统内核开发-系统调用

快速入门-Hi3516开发板-运行Hello OHOS

【#开发板漂流计划#】

硬件开发 轻量级操作系统 LiteOS

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:用几个示例数据库解释 SQL 与 NoSQL 数据库的差异
下一篇:Nginx搭建LNMP架构
相关文章