OpenHarmony之系统调用

OpenHarmony之系统调用 | DD'NotesOpenHarmony之系统调用背景对于运行L0系统的硬件一般是mcu,资源有限,L0系统没有区分内核态和用户态,所有的代码都在内核态运行,所以不需要系统调用L2系统用的是Linux内核,所以系统调用跟Linux Kernel的是一样的。可以参见我之前的博文Linux之系统调用 所以我们主要来看看L1系统中系统调用机制的是怎么实现的。 后面的分析基于如下版本: OpenHarmony v3.3.icon-default.png?t=N7T8https://notes.z-dd.online/2023/11/06/OpenHarmony%E4%B9%8B%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8/

OpenHarmony之系统调用
背景
对于运行L0系统的硬件一般是mcu,资源有限,L0系统没有区分内核态和用户态,所有的代码都在内核态运行,所以不需要系统调用
L2系统用的是Linux内核,所以系统调用跟Linux Kernel的是一样的。可以参见我之前的博文Linux之系统调用

所以我们主要来看看L1系统中系统调用机制的是怎么实现的。

后面的分析基于如下版本:

O

OpenHarmony 系统中,NAPI(Native API)是一种用于构建原生模块的接口机制,允许开发者通过 C/C++ 编写模块,然后在 JS 层进行调用。SA(System Ability)是系统能力的抽象,代表系统提供的服务,例如音频、显示、设备管理等。NAPI 调用 SA 的实现流程主要涉及 JS 层、NAPI 桥接层和 SA 服务层的交互。 ### 实现步骤 #### 1. 定义 NAPI 模块接口 在 NAPI 层,需要定义一个模块接口,将 C/C++ 函数暴露给 JS 调用。通常通过 `napi_module` 结构体注册模块,并指定模块的入口函数。例如: ```cpp static napi_value Init(napi_env env, napi_value exports) { napi_property_descriptor descriptors[] = { { "invokeSA", nullptr, InvokeSA, nullptr, nullptr, napi_default, nullptr }, }; napi_define_properties(env, exports, sizeof(descriptors) / sizeof(descriptors[0]), descriptors); return exports; } EXTERN_C_START static napi_module g_module = { .nm_version = 1, .nm_flags = 0, .nm_filename = nullptr, .nm_register_func = Init, .nm_modname = "saInvoker", .nm_priv = ((void*)0), .reserved = { 0 }, }; EXTERN_C_END extern "C" __attribute__((constructor)) void RegisterModule(void) { napi_module_register(&g_module); } ``` #### 2. 实现 SA 调用逻辑 在 `InvokeSA` 函数中,通过 `SystemAbilityManager` 获取 SA 实例,并调用接口。例如: ```cpp napi_value InvokeSA(napi_env env, napi_callback_info info) { // 获取 SA 管理服务 sptr<ISystemAbilityManager> samgr = SystemAbilityManagerClient::GetInstance(); if (samgr == nullptr) { // 处理错误 } // 获取 SA 实例,假设 SA ID 为 1234 sptr<IRemoteObject> saObject = samgr->GetSystemAbility(1234); if (saObject == nullptr) { // 处理错误 } // 获取 SA 接口代理 sptr<ISystemAbility> saProxy = iface_cast<ISystemAbility>(saObject); if (saProxy == nullptr) { // 处理错误 } // 调用 SA 接口 int result = saProxy->DoSomething(); // 将结果返回给 JS 层 napi_value jsResult; napi_create_int32(env, result, &jsResult); return jsResult; } ``` #### 3. JS 层调用 NAPI 模块 在 JS 层,通过 `require` 加载 NAPI 模块,并调用其导出的函数: ```javascript const saInvoker = require('saInvoker'); saInvoker.invokeSA().then(result => { console.log(`SA 返回结果: ${result}`); }); ``` #### 4. SA 服务端实现 SA 服务端通常由系统服务提供者实现,继承 `SystemAbility` 类,并实现具体的接口逻辑。例如: ```cpp class MySystemAbility : public SystemAbility { public: MySystemAbility(int32_t systemAbilityId, bool runOnCreate) : SystemAbility(systemAbilityId, runOnCreate) {} int DoSomething() override { // 实现具体逻辑 return 0; } }; ``` SA 服务会在系统启动时注册到 `SystemAbilityManager`,供其他模块调用。 ### 注意事项 - **权限管理**:调用 SA 时,需要确保当前应用具有访问该 SA 的权限。部分 SA 可能需要特定的系统权限才能调用。 - **异步处理**:SA 调用通常是异步的,特别是在涉及跨进程通信(IPC)时。需要确保 NAPI 函数能够正确处理异步操作,避免阻塞主线程。 - **错误处理**:在 NAPI 和 SA 调用过程中,应充分考虑错误处理机制,确保系统的健壮性。 通过上述步骤,开发者可以在 OpenHarmony 中实现通过 NAPI 调用 SA 服务的功能,充分利用系统能力进行应用开发[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值