OpenHarmony LiteOS-A内核文档之学习--系统调用(2)
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. 官网参考资料
【#开发板漂流计划#】
- 点赞
- 收藏
- 关注作者
评论(0)