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

举报
zhushy 发表于 2021/10/24 10:46:01 2021/10/24
【摘要】 2.3 在内核系统调用头文件中新增系统调用号在内核系统调用头文件中新增系统调用号,如下所示,在third_party/musl/porting/liteos_a/kernel/include/bits/syscall.h文件中,__NR_new_syscall_sample为新增系统调用号。用户态代码和内核态代码增加系统调用号方式相同,编号相同。/* OHOS customized sys...

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 <stdio.h>
#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;
}

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


3. 小结

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

4. 官网参考资料

【#开发板漂流计划#】

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。