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

news2024/11/29 4:50:47

本文分为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.coloradmin.cn/o/1218336.html

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

相关文章

二进制的形式在内存中绘制一个对象实例

一、引用类型实例的内存布局 从内存布局的角度来看,一个引用类型的实例由如下图所示的三部分组成:ObjHeader TypeHandle Fields。前置的ObjHeader用来缓存哈希值和同步状态,TypeHandle部分存储类型对应方法表(Method Table&…

2023年亚太杯数学建模思路 - 复盘:光照强度计算的优化模型

文章目录 0 赛题思路1 问题要求2 假设约定3 符号约定4 建立模型5 模型求解6 实现代码 建模资料 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 问题要求 现在已知一个教室长为15米,宽为12米&…

Golang 协程、主线程

Go协程、Go主线程 1)Go主线程(有程序员直接称为线程/也可以理解成进程):一个Go线程上,可以起多个协程,你可以这样理解,协程是轻量级的线程。 2)Go协程的特点 有独立的栈空间 共享程序堆空间 调度由用户控制 协程是轻量级的线程 go线程-…

[CSS] 文本折行

文本折行一般分为两种情况: CJK(Chinese/Japanese/Korean) 字符和非 CJK 字符。一般非 CJK 字符折行发生在两个单词的空格中间,见下图: 图中文本 “hello world” 包裹容器的宽度为 2rem,但是 hello 并没有…

RocketMQ的适用场景有哪些?

程序员的公众号:源1024,获取更多资料,无加密无套路! 最近整理了一波电子书籍资料,包含《Effective Java中文版 第2版》《深入JAVA虚拟机》,《重构改善既有代码设计》,《MySQL高性能-第3版》&…

基于单片机的自动循迹小车(论文+源码)

1.系统设计 此次基于单片机的自动循迹小车的设计系统,结合循迹模块来共同完成本次设计,实现小车的循迹功能,其其整体框架如图2.1所示。其中,采用STC89C52单片机来作为核心控制器,负责将各个传感器等模块链接起来&…

qt槽函数的四种写法

槽函数的四种写法 一,Qt4写法 不推荐这种写法,如果SLGNAL写错了,或者信号名字,槽函数名字写错了.编译器检查不出来,导致程序无响应,引起不必要的误解 connect(ui.btnOpen,SLGNAL(clicked),this,SLOT(open()));二,Qt5写法 推荐使用这种写法,信号名字、槽函数名字…

uniapp使用Canvas实现电子签名

来源: 公司的一个需求,需要给新注册的会员和客商需要增加签署协议功能; 之前的思路: 1、使用vue-signature-pad来实现电子签名,但是安卓手机不兼容; 2、uniapp插件市场来实现,但是对HBuilderX…

2023年09月 Python(六级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 以下选项中,不是tkinter变量类型的是?( ) A: IntVar() B: StringVar() C: DoubleVar() D: FloatVar() 答案:D tkinter 无 FloatVar()变量类型。 第2题 关于tkinter,以下说…

web3资讯及远程工作

各位如果想了解区块链相关的消息可以通过如下网址了解,里面还会有相关职位招聘(包括远程工作),还可以在里面进行发帖,进入即可获得1000积分,后期可以兑换一些礼品Cryptosquare

小型机房380V断电报警门磁开关状态检测远程控制RTU

在现代社会中,小型机房起到了至关重要的作用,为各种系统和设备提供稳定的电力供应。然而,由于各种原因,如供电故障、设备故障或非法侵入等,机房的正常运行可能会受到威胁。为了保障机房的安全和可靠性,我们…

Java GUI实现五子棋游戏

五子棋是一种双人对弈的棋类游戏,通常在棋盘上进行。棋盘为 1515 的方格,黑白双方各执棋子,轮流在棋盘的格点上落子,先在横、竖、斜线上形成五个相连的同色棋子者获胜。五子棋规则简单,易学难精,兼具攻防和…

疑似openAI的BUG

Chat gpt 4.0 『最新数据2023年』 Chat gpt 3.5 智商不在线『最近数据2021年9月左右』 发现了疑似openAI的一个bug 通过固定连接访问就可以用chatgpt4.0 4.0版本的费用为20美金一个月 https://chat.openai.com/?modelgpt-4-gizmo

03-关系和非关系型数据库对比

关系和非关系型数据库对比 关系型数据库(RDBMS):MySQL、Oracl、DB2、SQLServer 非关系型数据库(NoSql):Redis、Mongo DB、MemCached 插入数据结构的区别 传统关系型数据库是结构化数据,向表中插入数据时都需要严格的约束信息(如字段名,字段数据类型,字…

GO语言的由来与发展历程

Go语言,也称为Golang,是由Google公司的Robert Griesemer、Ken Thompson和Rob Pike三个大牛于2007年开始设计发明,并于2009年正式对外发布的开源编程语言。 三名初始人的目标是设计一种适应网络和多核时代的C语言,Go语言从C继承了…

简单回顾矩阵的相乘(点乘)230101

[[1 0 1][1 1 0]] [[3 0 0 3][2 2 1 3][1 3 1 1]] [[4. 3. 1. 4.][5. 2. 1. 6.]]乘以 c11 a11*b11 a12*b21 a13*b31 1*3 0*2 1*1 4 c12 a11*b12 a12*b22 a13*b32 1*0 0*2 1*3 3 c13a11*b13 a12*b23a13*b33 c14a11*b14 a12*b24a13*b34 c21a21*b11 a22*b21 a23*b…

windows11编译ffmpeg

安装msys2,直接https://www.msys2.org/上下载exe安装即可,默认路径; 选择msys2-mingw64启动,将下载源替换为中科大 sed -i "s#mirror.msys2.org/#mirrors.ustc.edu.cn/msys2/#g" /etc/pacman.d/mirrorlist*pacman -S…

免费的快速手机文件解压APP,快冲

各位小伙伴们大家好,今天我要介绍一款手机上必备的神奇工具!你有没有经常遇到需要解压文件情况呢?还在为不知道用哪个软件而烦恼吗?别担心,我给你带来了解决方案 ,就是这一款免费的解压精灵。 解压精灵是一…

git撤销未git commit的文件

目录 一、问题描述 二、方式1:git命令撤销(更专业) 1、文件已git add,未git commit 2、本地修改,未git add (1)撤销处于unstage的文件,即删除已有变动 (2&#xff…

C语言查找幸运数字(ZZULIOJ1056:幸运数字)

题目描述 小明对某些数字有偏爱,例如,他喜欢7的倍数,而不喜欢4的倍数,如果一个整数是7的倍数,而不是4的倍数,小明会认为这个数字是他的幸运数字。现在给定两个整数m和n,请你帮小明找m到n范围内的…