鸿蒙LiteOs读源码教程+向LiteOS中添加一个系统调用

本文分为2个部分:第1部分简要介绍如何读鸿蒙Liteos源码,第2部分是实验向LiteOS中添加一个系统调用的完整过程。

前置资料:

imx6ull开发板使用方式详解 + 源码下载 +编译运行简单程序 + Ubuntu虚拟机使用鸿蒙LiteOs操作系统常见错误汇总

一、鸿蒙Liteos读源码教程

鸿蒙的源码是放在openharmony文件夹下,openharmony下的kernel文件夹存放操作系统内核的相关代码和实现。

内核是操作系统的核心部分,所以像负责:资源管理、任务调度、内存管理、设备驱动、进程通信的源码都可以在kernel文件夹里看到。

进入到kernel文件夹下后会看到liteos_a和liteos_m,我们只需要知道liteos_a是针对嵌入式设备的,所以像我们实验用的开发板就是看liteos_a下的代码,而liteos_m是针对物联网设备设计的,所以我们暂时先不去看这个。

友情提示:ubuntu虚拟机是有可视化界面的,只需要在桌面上点击进入Files即可看到系统中的文件:

进入liteos_a后真正的核心代码同样是存储在kernel下的:

主要介绍3个比较重要的:

base:该文件夹包含操作系统内核的基础部分,如调度器,同步机制,内存管理等基础功能的实现。

include:该文件夹包含内核需要的所有头文件。

user:该文件夹包含一些用户级别的功能,如用户任务,用户接口等。

所以如果想查看有关内核的代码就进入base文件夹,想查看或者修改头文件就进入include文件夹。

假设我们现在进入到base文件夹:

接下来我逐一向大家简要介绍:

core:包含了内核的核心代码,比如初始化代码,启动代码等。

include:包含了base部分所有的头文件。

ipc:是inter-process communication的缩写,和进程相关,包含了实现进程间通信的代码。

mem:是内存缩写,包含了实现内存管理的代码,如内存分配、内存释放等。

misc:包含杂项代码,如工具函数,调试功能。

mp:包含多处理器相关的代码,如多核心调度,同步等。

om:包含LiteOS的运维相关代码。

sched:是调度缩写,包含了LiteOS的任务调度代码,包括任务的创建,删除,切换等。

vm:是虚拟内存的缩写,包含了实现虚拟内存管理的代码,如页表管理,地址转换等。

二、向LiteOS中添加一个系统调用

实验要求:

该实验需要分别在用户态和内核态完成两部分内容:

内容1:在用户态下要为新添加的系统调用增加相应的库函数作为接口。

内容2:在内核态下要添加与接口函数对应的系统调用。

编写一个应用程序,该应用程序通过调用第一步中添加的库函数接口,进而触发新添加的系统调用,从而验证新添加系统调用的正确性。

参考资料:

OpenHarmony LiteOS-A内核文档之学习--系统调用-开源基础软件社区-51CTO.COM

 第1步:在内核态添加系统调用号:

打开/home/book/openharmony/prebuits/lite/sysroot/usr/include/arm-liteos/bits/syscall.h文件,添加如下代码:

#define __NR_hxsyscall   (__NR_OHOS_BEGIN +21)

在同文件里的末尾添加如下代码:

#define SYS_hxsyscall    (__NR_OHOS_BEGIN + 21)

解释:定义一个名为__NR_hxsyscallSYS_hxsyscall的宏,其值为(__NR_OHOS_BEGIN + 21)自定义了系统调用的系统调用号。这样定义了宏之后,可以在代码中使用__NR_hxsyscallSYS_hxsyscall来代表自定义的系统调用号,以方便后续在代码中调用该系统调用。

两个宏实际上是等价的,只是提供了不同的命名选项。开发者可以根据需要选择使用SYS_hxsyscall或者__NR_hxsyscall

如果是在用户空间(用户态)代码中,可能会使用没有前缀的版本,而在内核(内核态)代码中则可能会使用有前缀的版本,但这完全取决于项目的具体代码风格和约定。

第2步:在用户态添加系统调用号:

在/openharmony/third_party/musl/kernel/obj/include/bits/syscall.h文件,添加如下代码:

#define __NR_hxsyscall    (__NR_OHOS_BEGIN + 21)

解释: /openharmony/third_party/musl/kernel/obj/include/bits/syscall.h文件是位于 musl libc 库的内核代码中,运行在用户态。

/home/book/openharmony/prebuits/lite/sysroot/usr/include/arm-liteos/bits/syscall.h文件是位于 OhOS Lite 操作系统的系统头文件中,运行在内核态。

所以第1步是在内核态添加系统调用号,第2步是在用户态添加系统调用号。

第3步:添加函数定义和实现

进入home/book/openharmony/kernel/liteos_a/syscall/los_syscall.h,新增系统调用函数的声明:

syscall同级目录添加.c文件,用于写入系统调用函数内容:

实现系统调用函数:

第4步:实现调用号和调用函数间的映射关系

打开/home/book/openharmony/kernel/liteos_a/syscall/syscall_lookup.h文件,新增系统调用号和系统调用函数之间的映射关系:

将用户态的系统调用宏__NR_hxsyscall和系统调用函数HxSyscall进行映射,相当于就是关联。

第5步:编写测试函数

在/home/book/doc_and_source_for_openharmony/apps下创建hxsyscall文件夹,再创建Makefile和hxsyscall.c文件(可以直接拷贝hello的内容进行修改):

修改hxsyscall.c内容,调用用户态的系统调用宏,传入参数:

说明:因为前面已经将SYS_hxsyscall这个宏与HxSyscall这个系统调用函数关联,所以“wake up”会作为一个参数传入下图的HxSyscall函数中,最终能够输出Hx call you to wake up!

然后修改Makefile的内容:

在同级目录下打开终端,输入make进行编译:

第6步:重新编译内核

这一步很关键,因为新增了一个系统调用号,必须要重新编译内核才能使调用号生效,并与系统调用函数进行关联。

首先删掉/openharmony/kernel/liteos_a/out/imx6ull的下面几个文件:

进入/openharmony/kernel/liteos_a然后进入命令栏,先输入下两行代码,确保操作万无一失:

cd  /home/book/openharmony/kernel/liteos_a
cp  tools/build/config/debug/imx6ull_clang.config .config  

再输入make clean:

然后输入make -j 8:

再输入make rootfs,编译根文件系统:

将out/imx6ull下的rootfs.img改名为rootfs.jffs2:

cp out/imx6ull/rootfs.img out/imx6ull/rootfs.jffs2

第7步:开发板运行

把apps下的hxsyscall下的hysyscall文件手动复制到home/openharmony/kernel/liteos_a/out/imx6ull/rootfs/bin目录下重新制作rootfs.jfss2

openharmony/kernel/liteos_a/out/imx6ull下打开终端,输入mkfs.jffs2 -s 0x10000 -e 0x10000 -d rootfs -o rootfs.jffs2

该命令创建了一个页面大小和擦除块大小均为64KB的JFFS2文件系统镜像,包含了rootfs目录下的所有内容,并将这个镜像保存为rootfs.jffs2文件。这个镜像随后可以被烧录到闪存中,为嵌入式设备提供一个初始的文件系统。

回到电脑,先删掉/doc_and_source_for_openharmony_imx6ull/IMX6ULL/开发板配套资料/软件/烧写工具/100ask_files_imx6ull烧写工具/file文件夹下已有的liteos.bin和rootfs.jffs2文件。

然后把新的liteos.bin和rootfs.jffs2复制该文件夹下:

先连接上开发板,然后打开MobaXterm连接上串口,然后点击下载到内存并启动。

按照第一次试验启动开发板,出现81000000,输入cd ./bin,再输入ls,可以看到文件和虚拟机里的文件一致:

输入./hxsyscall输出显示Hx call you to wake up!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/145816.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在Qt设计师(Qt Designer )控件面板加入自定义控件

目录 1. 问题的提出 2. 本次开发环境说明 3. 具体实现 4. 注意的问题 5. 参考链接 1. 问题的提出 在Qt开发中,经常利用Qt设计师(Qt Designer )把界面设计好,将界面放到ui文件中,将逻辑处理放到cpp文件中&#xff…

计算机视觉基础(9)——相机标定与对极几何

前言 本节我们将学习相机标定和对极几何两部分的内容。 在相机标定部分,我们将学习直接线性变换(Direct Linear Transform, DL),张正友标定法(Zhang’s Method)和 Perspective-n-Point (PnP) 这三种方法。 在对极几何部…

SpringJDBC模板类JdbcTemplate

Spring JdbcTemplate使用JdbcTemplate完成增删改查环境准备新增修改删除查询一个对象批量添加批量修改和批量删除使用德鲁伊连接池(之前数据源是用我们自己写的) JdbcTemplate JdbcTemplate是Spring提供的一个JDBC模板类,是对JDBC的封装&…

某60区块链安全之51%攻击实战学习记录

区块链安全 文章目录 区块链安全51%攻击实战实验目的实验环境实验工具实验原理攻击过程 51%攻击实战 实验目的 1.理解并掌握区块链基本概念及区块链原理 2.理解区块链分又问题 3.理解掌握区块链51%算力攻击原理与利用 4.找到题目漏洞进行分析并形成利用 实验环境 1.Ubuntu1…

2023数维杯国际赛数学建模竞赛选题建议及B题思路讲解

大家好呀,2023年第九届数维杯国际大学生数学建模挑战赛今天早上开赛啦,在这里先带来初步的选题建议及思路。 目前团队正在写B题和D题完整论文,后续还会持续更新哈,大家三连关注一下防止迷路。 注意,本文只是比较简略…

企业微信获取第三方应用凭证

上一篇介绍了如何配置通用开发参数及通过url回调验证, 本篇将通过服务商后台配置关联小程序应用配置和获取第三方凭证及如何配置企业可信IP。 当然上篇配置的回调设置也不会白费,在下方的指令和数据回调会用到。 第三方应用开发流程 官方企业微信第三方…

Beego之Bee工具使用

1、bee工具使用 bee 工具是一个为了协助快速开发 Beego 项目而创建的项目,通过 bee 你可以很容易的进行 Beego 项目的创 建、热编译、开发、测试、和部署。Bee工具可以使用的命令: [rootzsx ~]# bee 2023/02/18 18:17:26.196 [D] init global config…

van-dialog弹窗异步关闭-校验表单

van-dialog弹窗异步关闭 有时候我们需要通过弹窗去处理表单数据,在原生微信小程序配合vant组件中有多种方式实现,其中UI美观度最高的就是通过van-dialog嵌套表单实现。 通常表单涉及到是否必填,在van-dialog的确认事件中直接return是无法阻止…

软件测试面试-如何定位线上出现bug

其实无论是线上还是在测试出现bug,我们核心的还是要定位出bug出现的原因。 定位出bug的步骤: 1,如果是必现的bug,尽可能的复现出问题,找出引发问题的操作步骤。很多时候,一个bug的产生,很多时…

Java基础笔记

1.数据类型在java语言中包括两种: 第一种:基本数据类型 基本数据类型又可以划分为4大类8小种: 第一类:整数型 byte , short,int, long(没有小数的) 第二类:浮点型 float,aouble(带有小数的) 第三类:布尔型 boole…

计算机毕业设计 基于Vue的米家商城系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

React经典初级错误

文章 前言错误场景问题分析解决方案后言 前言 ✨✨ 他们是天生勇敢的开发者,我们创造bug,传播bug,毫不留情地消灭bug,在这个过程中我们创造了很多bug以供娱乐。 前端bug这里是博主总结的一些前端的bug以及解决方案,感兴…

FastAdmin表格顶部增加toolbar按钮

效果入下图&#xff0c;在表格顶部增加一个自定义按钮&#xff0c;点击确认后请求服务器接口 表格对应的index.html中 <div class"panel-body"><div id"myTabContent" class"tab-content"><div class"tab-pane fade active …

【开源】基于JAVA的服装店库存管理系统

项目编号&#xff1a; S 052 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S052&#xff0c;文末获取源码。} 项目编号&#xff1a;S052&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 角色管理模块2.3 服…

Go 语言变量类型和声明详解

在Go中&#xff0c;有不同的变量类型&#xff0c;例如&#xff1a; int 存储整数&#xff08;整数&#xff09;&#xff0c;例如123或-123float32 存储浮点数字&#xff0c;带小数&#xff0c;例如19.99或-19.99string - 存储文本&#xff0c;例如“ Hello World”。字符串值用…

微服务学习 | Ribbon负载均衡、Nacos注册中心、微服务技术对比

Ribbon负载均衡 负载均衡流程 负载均衡策略 通过定义IRule实现可以修改负载均衡规则&#xff0c;有两种方式&#xff1a; 1. 代码方式:在服务消费者order-service中的OrderApplication类中&#xff0c;定义一个新的IRule: 2.配置文件方式: 在order-service的application.yml…

【C++学习手札】模拟实现vector

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;くちなしの言葉—みゆな 0:37━━━━━━️&#x1f49f;──────── 5:28 &#x1f504; ◀️ ⏸ ▶️ ☰…

Verilog基础:三段式状态机与输出寄存

相关阅读 Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html 对于Verilog HDL而言&#xff0c;有限状态机(FSM)是一种重要而强大的模块&#xff0c;常见的有限状态机书写方式可以分为一段式&#xff0c;二段式和三段式&#xff0c;笔者强烈建议使用三…

进程信号(linux)

什么是信号 信号是一种用于进程之间通信或操作的一种手段&#xff0c;通常一个进程会在任意时刻接收到系统发送的信号&#xff0c;因此信号也可以看做是一种进程事件异步通知的手段。 一个进程可以对信号有三种操作&#xff1a; 默认操作&#xff1a;默认进行信号对应的操作…

【Python】【应用】Python应用之一行命令搭建HTTP、FTP服务器

&#x1f41a;作者简介&#xff1a;花神庙码农&#xff08;专注于Linux、WLAN、TCP/IP、Python等技术方向&#xff09;&#x1f433;博客主页&#xff1a;花神庙码农 &#xff0c;地址&#xff1a;https://blog.csdn.net/qxhgd&#x1f310;系列专栏&#xff1a;Python应用&…