一、 procfs介绍
procfs是类UNIX操作系统中进程文件系统(process file system)的缩写,主要用于通过内核访问进程信息和系统信息,以及可以修改内核参数改变系统行为。需要注意的是,procfs文件系统是一个虚拟文件系统,不存在硬盘当中,而是系统启动时动态生成的文件系统,储存在内存中。procfs文件系统通常挂载在/proc目录下。
LiteOS-A是OpenAtom OpenHarmony(以下简称“OpenHarmony”)系统中使用的轻量系统内核,实现了procfs文件系统。本文主要对LiteOS-A内核中的procfs文件系统的设计、实现和使用进行介绍和分析。
procfs文件系统是LiteOS-A内核文件系统的一个案例,通过了解procfs文件系统,能够熟悉LiteOS-A的文件系统框架,并很好地将内核信息通过文件系统反馈给使用者。
1. Linux系统中的procfs文件系统包含的内容
Ubuntu 20.04中的/proc文件信息如下:
图1:Ubuntu proc目录信息
2. OS-A系统的命令以及procfs文件系统的内容
LiteOS-A的命令集:
LiteOS-A的proc目录信息如下:
图2:liteOS-A proc目录信息
二、 procfs文件系统的设计
LiteOS-A中使用VFS作为各个文件系统的粘合层,而VFS在OpenHarmony内核中采用树结构实现,树中的每一个节点都是Vnode结构体。VFS提供统一的抽象接口用于屏蔽文件系统之间的差异,其提供三大操作接口用于统一不同文件系统调用不同接口的现状。
VFS提供的三大操作接口:
• VnodeOps
• MountOps
• file_operations_vfs
VnodeOps用于控制Vnode节点,MountOps控制挂载点,file_operations_vfs提供常用的文件接口。
文件系统各自需要实现VFS提供的这三大接口,即实现系统本身需要的接口方法,让VFS能够调用这些接口即可。procfs文件系统虽作为一个伪文件系统pseudo-file system,但其仍旧需要实现上述接口。
1. VFS提供的重要接口
(1) Vnode 结构体:
图3:Vnode structure
Vnode功能接口定义:
Vnode根节点的初始化操作:
将全局Vnode表进行初始化,开始节点指向根目录/,全局节点g_rootVnode。
(2) Mount结构体:
图4:Mount structure
挂载点的接口定义:
(3)文件结构定义:
文件接口功能定义:
2.文件系统的重要接口设计
procfs文件系统中每个目录或文件都是一个Vnode,也可以理解为一个entry。ProcDirEntry中的subdir指向的目录中的一个子项,其本质是一个单向链表的形式,并且采用头插法的形式进行节点的插入。
图5:DirEntry
图6:ProcFile
图7:ProcData
图8: ProcFileOperations
三、 procfs文件系统的实现
1. Procfs的注册过程
(1)向系统注册文件系统入口函数:
LOS_MODULE_INIT(ProcFsInit, LOS_INIT_LEVEL_KMOD_EXTENDED);
(2)向VFS文件系统表注册系统名以及实现的接口等:
2. Procfs的初始化初始化
需要做的工作主要包括向OS注册procfs文件系统,生成procfs文件目录中的文件初始项,在liteOS-A具体包含目录power、mounts等。
procfs文件系统的初始化流程大致如下:
四、procfs业务分析
1. procfs挂载过程分析
在procfs文件系统的挂载过程中,若使用qemu进行调试,则挂载的命令大致如下: mount -R -t procfs [Dir_Path]
mount的系统调用间接调用procfs的mount接口。
用户输入挂载命令后,引发系统调用SysMount开始逐层调用:
2. 节点的增加过程分析
关键代码如下:
为了更好地说明,假设目前已经在系统中生成了proc/和mounts节点,proc/节点就是该文件系统的根节点,此时两者的关系可以用下图表示:
图9:层级目录的关系
此时若需要在两者在插入一个power节点,则首先需要先生成一个power节点如下,再改变相应的指向即可,具体可以参考图10,给出三者之间的关系,最终的节点效果如图11。
图10:生成一个新节点
图11:重新组合
3、writeproc shell命令的创建
liteOS-A中含有一个叫writeproc的shell命令,使用格式如下:
writeproc value >> path
shell命令的创建方式主要有两种,分静态注册和动态注册,writeproc命令使用静态注册方式进行注册,在本文中也主要介绍静态注册。
shell开发的流程如下:
① 定义一个新增命令所要调用的执行函数xxx;
② 使用SHELLCMD_ENTRY函数添加新增命令项;
③ 在链接选项liteos_tables_ldflags.mk中添加链接该新增命令项参数;
④ 重新编译代码后运行。
writeproc的注册如下:
writeproc的具体流程分析:
①首先由用户按照命令格式进行输入;
②OsShellCmdWriteProc函数对输入的命令进行分析,并采取相关的动作。
根据文件名查找Vnode的关键代码:
五、总结
本文介绍了LiteOS-A内核下proc相关目录信息,并且对LiteOS-A内核中procfs文件系统的原理和实现,结合源码进行了分析。同时,通过writeproc shell命令介绍了procfs的使用。希望读者可以掌握LiteOS-A文件系统的基本知识,更好地运用于基于LiteOS-A内核的系统移植工作。
经常有很多小伙伴抱怨说:不知道学习鸿蒙开发哪些技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?
为了能够帮助到大家能够有规划的学习,这里特别整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习路线,包含了鸿蒙开发必掌握的核心知识要点,内容有(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、WebGL、元服务、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、OpenHarmony驱动开发、系统定制移植等等)鸿蒙(HarmonyOS NEXT)技术知识点。
《鸿蒙 (Harmony OS)开发学习手册》(共计892页)
如何快速入门?
1.基本概念
2.构建第一个ArkTS应用
3.……
开发基础知识:
1.应用基础知识
2.配置文件
3.应用数据管理
4.应用安全管理
5.应用隐私保护
6.三方应用调用管控机制
7.资源分类与访问
8.学习ArkTS语言
9.……
基于ArkTS 开发
1.Ability开发
2.UI开发
3.公共事件与通知
4.窗口管理
5.媒体
6.安全
7.网络与链接
8.电话服务
9.数据管理
10.后台任务(Background Task)管理
11.设备管理
12.设备使用信息统计
13.DFX
14.国际化开发
15.折叠屏系列
16.……
鸿蒙开发面试真题(含参考答案)
OpenHarmony 开发环境搭建
《OpenHarmony源码解析》
- 搭建开发环境
- Windows 开发环境的搭建
- Ubuntu 开发环境搭建
- Linux 与 Windows 之间的文件共享
- ……
- 系统架构分析
- 构建子系统
- 启动流程
- 子系统
- 分布式任务调度子系统
- 分布式通信子系统
- 驱动子系统
- ……
OpenHarmony 设备开发学习手册