OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【扩展组件】上
往期知识点记录:
- 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总
- 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~
- 子系统开发内核
- 轻量系统内核(LiteOS-M)
- 轻量系统内核(LiteOS-M)【中断管理】
- 轻量系统内核(LiteOS-M)【任务管理】
- 轻量系统内核(LiteOS-M)【内存管理】
- 轻量系统内核(LiteOS-M)【内核通信机制】
- 轻量系统内核(LiteOS-M)【时间管理】
- 轻量系统内核(LiteOS-M)【扩展组件】
- 轻量系统内核(LiteOS-M)【内存调测】
- 轻量系统内核(LiteOS-M)【异常调测】
- 轻量系统内核(LiteOS-M)【Trace调测】
- 轻量系统内核(LiteOS-M)【LMS调测】
- 轻量系统内核(LiteOS-M)【SHELL】
- 小型系统内核(LiteOS-A)【概述】
- 小型系统内核(LiteOS-A)【内核启动】
- 小型系统内核(LiteOS-A)【中断及异常处理】
- 标准系统内核(Linux)【New IP内核协议栈】
- 标准系统内核(Linux)【内核增强特性 > 任务调度】
- 持续更新中……
系统调用
基本概念
OpenHarmony LiteOS-A实现了用户态与内核态的区分隔离,用户态程序不能直接访问内核资源,而系统调用则为用户态程序提供了一种访问内核资源、与内核进行交互的通道。
运行机制
如图1所示,用户程序通过调用System API(系统API,通常是系统提供的POSIX接口)进行内核资源访问与交互请求,POSIX接口内部会触发SVC/SWI异常,完成系统从用户态到内核态的切换,然后对接到内核的Syscall Handler(系统调用统一处理接口)进行参数解析,最终分发至具体的内核处理函数。
图1 系统调用示意图

Syscall Handler的具体实现在kernel/liteos_a/syscall/los_syscall.c中OsArmA32SyscallHandle函数,在进入系统软中断异常时会调用此函数,并且按照kernel/liteos_a/syscall/syscall_lookup.h中的清单进行系统调用的入参解析,执行各系统调用最终对应的内核处理函数。
说明:
系统调用提供基础的用户态程序与内核的交互功能,不建议开发者直接使用系统调用接口,推荐使用内核提供的对外POSIX接口,若需要新增系统调用接口,详见开发指导。
内核向用户态提供的系统调用接口清单详见kernel/liteos_a/syscall/syscall_lookup.h,内核相应的系统调用对接函数清单详见kernel/liteos_a/syscall/los_syscall.h。
开发指导
开发流程
新增系统调用的典型开发流程如下:
- 在LibC库中确定并添加新增的系统调用号。
- 在LibC库中新增用户态的函数接口声明及实现。
- 在内核系统调用头文件中确定并添加新增的系统调用号及对应内核处理函数的声明。
- 在内核中新增该系统调用对应的内核处理函数。
编程实例
示例代码:
- 在LibC库syscall.h.in中新增系统调用号 如下所示,其中__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_pthread_join (__NR_OHOS_BEGIN + 1)#define __NR_pthread_deatch (__NR_OHOS_BEGIN + 2)#define __NR_create_user_thread (__NR_OHOS_BEGIN + 3)#define __NR_processcreate (__NR_OHOS_BEGIN + 4)#define __NR_processtart (__NR_OHOS_BEGIN + 5)#define __NR_printf (__NR_OHOS_BEGIN + 6)#define __NR_dumpmemory (__NR_OHOS_BEGIN + 13)#define __NR_mkfifo (__NR_OHOS_BEGIN + 14)#define __NR_mqclose (__NR_OHOS_BEGIN + 15)#define __NR_realpath (__NR_OHOS_BEGIN + 16)#define __NR_format (__NR_OHOS_BEGIN + 17)#define __NR_shellexec (__NR_OHOS_BEGIN + 18)#define __NR_ohoscapget (__NR_OHOS_BEGIN + 19)#define __NR_ohoscapset (__NR_OHOS_BEGIN + 20)#define __NR_new_syscall_sample (__NR_OHOS_BEGIN + 21) /* 新增的系统调用号 __NR_new_syscall_sample:521 */#define __NR_syscallend (__NR_OHOS_BEGIN + 22)...
- 在LibC库中新增用户态接口的声明与实现
#include "stdio_impl.h"#include "syscall.h".../* 新增系统调用用户态的接口实现 */void newSyscallSample(int num){printf("user mode: num = %d\n", num);__syscall(SYS_new_syscall_sample, num);return;}
- 在内核系统调用头文件中新增系统调用号 如下所示,在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_pthread_join (__NR_OHOS_BEGIN + 1)#define __NR_pthread_deatch (__NR_OHOS_BEGIN + 2)#define __NR_create_user_thread (__NR_OHOS_BEGIN + 3)#define __NR_processcreate (__NR_OHOS_BEGIN + 4)#define __NR_processtart (__NR_OHOS_BEGIN + 5)#define __NR_printf (__NR_OHOS_BEGIN + 6)#define __NR_dumpmemory (__NR_OHOS_BEGIN + 13)#define __NR_mkfifo (__NR_OHOS_BEGIN + 14)#define __NR_mqclose (__NR_OHOS_BEGIN + 15)#define __NR_realpath (__NR_OHOS_BEGIN + 16)#define __NR_format (__NR_OHOS_BEGIN + 17)#define __NR_shellexec (__NR_OHOS_BEGIN + 18)#define __NR_ohoscapget (__NR_OHOS_BEGIN + 19)#define __NR_ohoscapset (__NR_OHOS_BEGIN + 20)#define __NR_new_syscall_sample (__NR_OHOS_BEGIN + 21) /* 新增的系统调用号 __NR_new_syscall_sample:521 */#define __NR_syscallend (__NR_OHOS_BEGIN + 22)...
在kernel/liteos_a/syscall/syscall_lookup.h中,增加一行SYSCALL_HAND_DEF(__NR_new_syscall_sample, SysNewSyscallSample, void, ARG_NUM_1):
.../* 当前现有的系统调用清单 */SYSCALL_HAND_DEF(__NR_chown, SysChown, int, ARG_NUM_3)SYSCALL_HAND_DEF(__NR_chown32, SysChown, int, ARG_NUM_3)#ifdef LOSCFG_SECURITY_CAPABILITYSYSCALL_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)...
- 在内核中新增内核该系统调用对应的处理函数 如下所示,在kernel/liteos_a/syscall/los_syscall.h中,SysNewSyscallSample为新增系统调用的内核处理函数声明:
.../* 当前现有的系统调用内核处理函数声明清单 */extern int SysClockSettime64(clockid_t clockID, const struct timespec64 *tp);extern int SysClockGettime64(clockid_t clockID, struct timespec64 *tp);extern int SysClockGetres64(clockid_t clockID, struct timespec64 *tp);extern int SysClockNanoSleep64(clockid_t clk, int flags, const struct timespec64 *req, struct timespec64 *rem);extern int SysTimerGettime64(timer_t timerID, struct itimerspec64 *value);extern int SysTimerSettime64(timer_t timerID, int flags, const struct itimerspec64 *value, struct itimerspec64 *oldValue);/* 新增的系统调用内核处理函数声明 */extern void SysNewSyscallSample(int num);...
新增的系统调用的内核处理函数实现如下:
include "los_printf.h".../* 新增系统调用内核处理函数的实现 */void SysNewSyscallSample(int num){PRINTK("kernel mode: num = %d\n", num);return;}
结果验证:
用户态程序调用newSyscallSample(10)接口,得到输出结果如下:
/* 用户态接口与内核态接口均有输出,证明系统调用已使能 */
user mode: num = 10
kernel mode: num = 10
经常有很多小伙伴抱怨说:不知道学习鸿蒙开发哪些技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?
为了能够帮助到大家能够有规划的学习,这里特别整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习路线,包含了鸿蒙开发必掌握的核心知识要点,内容有(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、WebGL、元服务、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、OpenHarmony驱动开发、系统定制移植等等)鸿蒙(HarmonyOS NEXT)技术知识点。

《鸿蒙 (Harmony OS)开发学习手册》(共计892页):https://gitcode.com/HarmonyOS_MN/733GH/overview
如何快速入门?
1.基本概念
2.构建第一个ArkTS应用
3.……

鸿蒙开发面试真题(含参考答案):https://gitcode.com/HarmonyOS_MN/733GH/overview

《OpenHarmony源码解析》:
- 搭建开发环境
- Windows 开发环境的搭建
- Ubuntu 开发环境搭建
- Linux 与 Windows 之间的文件共享
- ……
- 系统架构分析
- 构建子系统
- 启动流程
- 子系统
- 分布式任务调度子系统
- 分布式通信子系统
- 驱动子系统
- ……

OpenHarmony 设备开发学习手册:https://gitcode.com/HarmonyOS_MN/733GH/overview


相关文章:
OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【扩展组件】上
往期知识点记录: 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~ 子系统开发内核 轻量系统内核(LiteOS-M) 轻量系统内核&#…...
Windows【环境 01】服务器系统重装后的服务恢复(ES\Redis\Jafka\Tomcat)环境变量和服务注册
服务器系统重装后的服务恢复 1.原因2.问题处理2.1 JDK2.2 Elasticsearch2.3 Redis2.4 Jafka2.5 Tomcat 3.总结 1.原因 Windows 服务器系统盘损坏,换了硬盘并重做了系统,其他磁盘未损坏但安装的服务无法正常运行了,包括: Elastic…...
发现编程的全新境界——明基RD280U显示器使用体验
前言 在大学的四年里,我几乎每天都泡在实验室,盯着电脑屏幕,一行行地码代码。那时,学校提供的显示器是非常基础的款式,功能简单,几乎没有任何特别之处,甚至配置也比较低。那个时候,…...
使用阿里OCR身份证识别
1、开通服务 免费试用 2、获取accesskay AccessKeyId和AccessKeySecret 要同时复制保存下来 因为后面好像看不AccessKeySecret了 3.Api 参考 https://help.aliyun.com/zh/ocr/developer-reference/api-ocr-api-2021-07-07-recognizeidcard?spma2c4g.11186623.0.0.7a9f4b1e5C…...
8. 详细描述一条 SQL 语句在 MySQL 中的执行过程。
一条SQL语句在MySQL中的执行过程包括多个步骤,从接收到SQL命令到返回结果,这些步骤涉及SQL解析、优化、执行以及最终的结果返回。以下是详细描述一条SQL语句在MySQL中的执行过程。 1. 客户端发送SQL请求 客户端应用程序:首先,客户…...
C++--类的实例化
一、实例化的概念 用类类型在屋里内存中创建对象的过程,称为类实例化出对象 类是对对象进行一种抽象描述,是一个模型一样的东西,限定了类有哪些成员变量,这些成员变量只是声明,没有分配空间,用类实例化出…...
Vue vs React vs Angular 的对比和选择
前端框架对比与选择指南 在前端开发的世界里,框架可谓是开发者手中的利器。无论是新手还是老手,面对 Vue、React、Angular 等主流前端框架的选择时,都会有一瞬间的犹豫:“我到底该选哪个框架?”选择一个合适的前端框架…...
Yolov8-pose关键点检测:一种新的自适应算法轻量级通道分割和变换(ALSS)模块,解决红外检测场景存在严重遮挡和重叠目标时的局限性
💡💡💡本文解决什么问题:红外检测场景存在严重遮挡和重叠目标时的局限性的问题点。 💡💡💡提出了一种新的自适应算法轻量级通道分割和变换(ALSS)模块。该模块采用自适应信道分裂策略优化特征提取,并集成信道变换机制增强信道间的信息交换。这改善了模糊特征的提…...
无人机飞手培训机构六旋翼训练无人机技术详解
六旋翼无人机作为多旋翼无人机的一种,以其独特的稳定性、灵活性和载重能力,在航拍、农业、救援、物流等多个领域展现出广泛的应用前景。它采用六个旋翼产生升力,通过复杂的飞行控制系统实现悬停、前后左右飞行、翻滚等复杂动作,为…...
CX8903:电动车手机充电器降压芯片,搭配协议实现快充
CX8903:一款专用于电动车手机充电器的降压芯片,搭配协议实现快充。 在城市的车水马龙中,电动自行车如灵动的精灵,便捷着我们的出行生活。在骑行的路上,随时保持连接,电动自行车手机充电器让手机电量满满。…...
leaflet加载GeoServer的WMS地图服务.md
leaflet加载GeoServer的WMS地图服务,该示例涵盖了涵盖了 “WMS图层加载、WMS图层动态投影、图层index顺序调整、图层添加、高德地图、腾讯地图OpenStreet地图”,WMS图层加载看代码中标注的核心代码部分即可。 <!DOCTYPE html> <html xmlns&qu…...
Shire 智能体市场:IDE 一键安装多智能体,协同打造集体智慧 Copilot
太长不看版:在新版本(0.8)的 Shire 中,你可以通过 Shire 智能体市场,一键下载和安装多个智能体,并直接在你的当前项目中使用。与此同时,你还可以 将你的 Shire 代码段或者智能体上传到 Shire 智…...
机器学习笔记(一)初识机器学习
1.定义 机器学习是一门多学科交叉专业,涵盖概率论知识,统计学知识,近似理论知识和复杂算法知识,使用计算机作为工具并致力于真实实时的模拟人类学习方式,并将现有内容进行知识结构划分来有效提高学习效率。 机器学习有…...
linux如何查看当前的目录所在位置
在Linux系统中,查看当前目录所在位置的常用命令是 pwd,它代表 "print working directory"(打印工作目录)。当你在终端中输入 pwd 并按下回车键时,它会显示当前所在的完整路径。 打开终端,然后输…...
【JavaEE】线程创建和终止,Thread类方法,变量捕获(7000字长文)
阿华代码,不是逆风,就是我疯,你们的点赞收藏是我前进最大的动力!!7000字长文,希望本文内容能够帮助到你! 目录 一:创建线程五种方式 方式一:继承Thread类,…...
[Python数据可视化] Plotly:交互式数据可视化的强大工具
引言: 在数据分析和可视化的世界中,Plotly 是一颗耀眼的明星。它是一个开源的交互式图表库,支持多种编程语言,包括 Python、R 和 JavaScript。Plotly 的强大之处在于它能够创建出既美观又具有高度交互性的图表,使得数据…...
Excel--DATEDIF函数的用法及参数含义
DATEDIF函数的用法为: DATEDIF(start_date,end_date,unit),start_date表示的是起始时间,end_date表示的是结束时间。unit表示的是返回的时间代码,是天、月、年等。如下: Datedif函数的参数含义unit参数返回值的意义"y"两个时间段之间的整年数…...
执行网络攻击模拟的 7 个步骤
在进攻和防守策略方面,我们可以从足球队和美式足球队身上学到很多东西。球员们会分析对方球队的策略,找出弱点,相应地调整进攻策略,最重要的是,练习、练习、再练习。作为最低要求,网络安全部门也应该这样做…...
技术成神之路:设计模式(十四)享元模式
介绍 享元模式(Flyweight Pattern)是一种结构性设计模式,旨在通过共享对象来有效地支持大量细粒度的对象。 1.定义 享元模式通过将对象状态分为内部状态(可以共享)和外部状态(不可共享)…...
使用systemctl实现开机自启动jar包
目录 1. 创建服务文件2. 配置服务文件3. 重新加载 systemd 配置4. 启动服务5. 查看服务状态 1. 创建服务文件 创建服务文件: 在 /etc/systemd/system/ 目录下创建一个新的服务文件 myapp.service。 sudo vim /etc/systemd/system/myapp.service2. 配置服务文件 按i…...
如何查看浏览器中当前存储的 Cookie?
如何查看浏览器中的 Cookie?为什么有些 Cookie 看不到?1. 引言:快递单号与隐私信封2. Cookie 是什么?(小白必备)3. 核心问题:为什么有些 Cookie“看不到”?4. 如何查看 Cookie&#…...
解决Ubuntu中libc6-dev:i386依赖问题的完整指南
1. 理解libc6-dev:i386依赖问题的本质 当你正在愉快地使用Ubuntu系统,突然在执行sudo apt-get upgrade时遇到一堆红色错误提示,特别是看到"libc6-dev:i386 : 依赖: libc6:i386 ( 2.31-0ubuntu9.14) 但无法安装它"这样的报错,是不是…...
学Simulink——基于Simulink的基于扰动观测器(DOB)的负载扰动补偿
目录 手把手教你学Simulink——基于Simulink的基于扰动观测器(DOB)的负载扰动补偿 摘要 一、背景与挑战 1.1 负载扰动补偿的痛点与传统控制局限 1.1.1 应用场景与核心指标 1.1.2 传统PI控制的缺陷 1.2 DOB负载扰动补偿的核心优势 1.3 设计目标 二、系…...
Comsol 单孔激光烧蚀:探索微观世界的烧蚀奥秘
comsol单孔激光烧蚀 在材料加工等众多领域,激光烧蚀技术凭借其高精度、非接触等优势备受瞩目。而 Comsol 作为一款强大的多物理场仿真软件,为我们深入研究激光烧蚀过程提供了有力工具。今天就来聊聊 Comsol 单孔激光烧蚀那些事儿。 Comsol 仿真原理 激…...
Linux平台微信小程序开发终极指南:免费搭建完整开发环境
Linux平台微信小程序开发终极指南:免费搭建完整开发环境 【免费下载链接】wechat-web-devtools-linux 适用于微信小程序的微信开发者工具 Linux移植版 项目地址: https://gitcode.com/gh_mirrors/we/wechat-web-devtools-linux 在Linux系统上进行微信小程序开…...
高性能Python爬虫数据预处理流水线:PyTorch 2.8与Dask并行计算实战
高性能Python爬虫数据预处理流水线:PyTorch 2.8与Dask并行计算实战 1. 爬虫数据处理的现实挑战 每天都有海量数据从互联网上被爬取下来,但很少有人告诉你这些原始数据有多"脏"。我曾经接手过一个电商评论分析项目,原始数据里混杂…...
Jetson Nano/Orin上离线语音识别的实战踩坑:从Whisper到Sherpa-onnx,我最终选了它
Jetson Nano/Orin离线语音识别实战:从Whisper到Sherpa-onnx的技术选型与避坑指南 在边缘计算设备上实现高质量的离线语音识别(ASR)一直是开发者面临的挑战。Jetson系列作为NVIDIA推出的边缘AI计算平台,凭借其强大的GPU加速能力和低…...
开源音乐解锁工具:浏览器端全平台音频解密解决方案
开源音乐解锁工具:浏览器端全平台音频解密解决方案 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地址: https://…...
拒绝“一眼AI”!硬核跑通Gemini去AIGC工作流:实测3组调优指令+3款工具,把99%硬生生打回10%
视角重构,打破“平铺直叙”的机械感 AI生成的最大特征是“正确但平庸的上帝视角”。要ai降ai,第一步不是改词,而是强行植入一个具有批判性的“人类观察者”视角,迫使模型重组叙事逻辑。 核心原理:通过引入“辩证法”…...
告别命令行恐惧:FastbootEnhance如何让Android刷机变得像点菜一样简单?
告别命令行恐惧:FastbootEnhance如何让Android刷机变得像点菜一样简单? 【免费下载链接】FastbootEnhance A user-friendly Fastboot ToolBox & Payload Dumper for Windows 项目地址: https://gitcode.com/gh_mirrors/fa/FastbootEnhance 还…...
