
LiteOS-A内核中的procfs文件系统分析
一、 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内核的系统移植工作。
关于OpenHarmony内核的内容,之前我还介绍了LiteOS-A内核之基础硬件——中断控制器、GIC400内核对象队列的算法、OpenHarmony LiteOS-M内核事件的运作机制,以及内核IPC机制数据结构、OpenHarmony Liteos-A内核之iperf3移植方法,感兴趣的读者可以点击阅读:
《浅谈OpenHarmony LiteOS-A内核之基础硬件——中断控制器GIC400》、
《OpenHarmony——内核对象队列之算法详解(上)》、
《OpenHarmony——内核对象队列之算法详解(下)》、
《OpenHarmony——内核对象事件之源码详解》、
《OpenHarmony——内核IPC机制数据结构解析》、
《OpenHarmony Liteos_A内核之iperf3移植心得》。
