鸿蒙LiteOs读源码教程+向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!

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
鸿蒙Linux定制版项目文档是关于鸿蒙Linux系统的开发项目的文档,它提供了有关项目目标、需求、设计、实现、测试等方面的详细说明。该文档通常包括以下几个主要部分: 1. 引言:介绍鸿蒙Linux定制版项目的背景和目的,包括项目的意义和预期结果。 2. 需求分析:对项目需求进行详细分析和规划,包括功能需求、性能需求、安全需求等。 3. 系统设计:描述鸿蒙Linux定制版系统的整体设计和架构,包括系统的各个模块和组件的功能和关系。 4. 模块设计:详细描述系统各个关键模块的设计和实现方法,包括模块的接口定义、数据结构、算法等。 5. 测试与验证:讨论系统开发过程的测试策略和方法,并描述如何验证系统是否满足需求。 6. 上线部署:介绍鸿蒙Linux定制版系统的部署过程和方法,包括软硬件环境要求、安装步骤和注意事项。 鸿蒙Linux定制版项目的开发工具通常是指用于开发和调试定制版系统的软件和硬件工具。这些工具可包括编译器、调试器、开发板、仿真器等。 HarmonyOS系统源码是指鸿蒙操作系统的开源代码,开发者可以通过获取和阅源代码来理解系统的实现原理和细节,并进行二次开发和定制。 在线开发地址是指提供在线开发环境和工具的网站或平台,开发者可以通过该地址进行基于鸿蒙Linux的定制版系统的开发工作,如代码编写、编译、调试等。 总之,鸿蒙Linux定制版项目文档、开发工具、HarmonyOS系统源码和在线开发地址都是鸿蒙Linux定制版系统开发的重要资源和支持,对于开发者来说,它们是进行开发、定制和部署工作的必备元素。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值