系列篇从内核视角用一句话概括shell
的底层实现为:两个任务,三个阶段。其本质是独立进程,因而划到进程管理模块。每次创建shell
进程都会再创建两个任务。
- 客户端任务(ShellEntry): 负责接受来自终端(控制台)敲入的一个个字符,字符按
VT
规范组装成一句句的命令。 - 服务端任务(ShellTask): 对命令进行解析并执行,将结果输出到控制台。
而按命令生命周期可分三个阶段.
- 编辑: 鸿蒙在这个部分实现了一个简单的编辑器功能,处理控制台输入的每个字符,主要包括了对控制字符 例如
<ESC>
,\t
,\b
,\n
,\r
,四个方向键0x41
~0x44
的处理。 - 解析: 对编辑后的字符串进行解析,解析出命令项和参数项,找到对应的命令项执行函数。
- 执行: 命令可通过静态和动态两种方式注册到内核,解析出具体命令后在注册表中找到对应函数回调。将结果输出到控制台。
编辑部分由客户端任务完成,后两个部分由服务端任务完成,命令全局注册由内核完成。
- 本篇主要说 客户端任务 和 编辑过程
- 服务端任务 和 解析/执行过程 已在 (Shell解析篇) 中说明,请自行翻看.
什么是 Shell
从用户视角看,shell
是用户窥视和操作内核的一个窗口,内核并非铁板一块,对应用层开了两个窗口,一个是系统调用,一个就是shell
,由内核提供实现函数,由用户提供参数执行。区别是 shell
是由独立的任务去完成,可通过将shell
命令序列化编写成独立的,简单的shell
程序,所以shell
也是一门脚本语言,系统调用是依附于应用程序的任务去完成,能做的有限。通过shell
窗口能看到 cpu
的运行情况,内存的消耗情况,网络的链接状态等等。
鸿蒙 Shell 代码在哪
与shell
对应的概念是kernel
,在鸿蒙内核,这两部分代码是分开放的,shell
代码在 查看 shell 代码 ,目录结构如下.
Shell 控制块
跟进程,任务一样,每个概念的背后需要一个主结构体来的支撑,shell
的主结构体就是ShellCB
,掌握它就可以将shell
拿捏的死死的,搞不懂这个结构体就读不懂shell
的内核实现.所以在上面花再多功夫也不为过.
解读
- 鸿蒙支持两种方式在控制台输入
Shell
命令,关于控制台请自行翻看控制台篇.
- 在串口工具中直接输入
Shell
命令CONSOLE_SERIAL
。 - 在
telnet
工具中输入Shell
命令CONSOLE_TELNET
。
-
shellTaskHandle
和shellEntryHandle
编辑/处理shell
命令的两个任务ID,本篇重点说后一个. cmdKeyLink
,cmdHistoryKeyLink
,cmdMaskKeyLink
是三个类型为CmdKeyLink
的结构体,本质是双向链表,对应编辑shell
命令过程中的三个功能.
-
cmdKeyLink
待执行的命令链表 -
cmdHistoryKeyLink
存储命令历史记录的,即:history
命令显示的内容 -
cmdMaskKeyLink
记录按上下方向键输出的内容,这个有点难理解,自行在shell
中按上下方向键自行体验
-
shellBufOffset
和shellBuf
是成对出现的,其中存放的就是用户敲入处理后的字符. -
keyMutex
和historyMutex
为操作链表所需的互斥锁,内核用的最多的就是这类锁. shellEvent
用于任务之间的通讯,比如.
-
SHELL_CMD_PARSE_EVENT
:编辑完成了通知解析任务开始执行 -
CONSOLE_SHELL_KEY_EVENT
:收到来自控制台的CTRL + C
信号产生的事件.
-
shellKeyType
按键的类型,分三种 普通,键,组合键 -
shellWorkingDirectory
工作区就不用说了,从哪个目录进入shell
的
创建 Shell
解读
-
main
为shell
进程的主任务,每个进程都会创建一个默认的线程(任务),这个任务的入口函数就是大家熟知的main
函数,不清楚的自行翻看任务管理各篇有详细的说明. - 由
main
任务再创建两个任务,即本篇开头说的两个任务,本篇重点说其中的一个ShellEntry
,任务优先级为9
,算是较高优先级. - 指定内核栈大小为
0x1000 = 4K
,因任务只负责编辑处理控制台输入的字符,命令的执行在其他任务,所以4K的内核空间足够使用. -
ShellEntry
为入口函数,这个函数的实现为本篇的重点
ShellEntry | 编辑过程
解读
-
ShellEntry
内部是个死循环,不断的读取控制台输入的每个字符,注意是按字符处理. - 处理四个方向,换行回车,
tab
,backspace
,delete
,esc
等控制键,相当于重新认识了下Ascii
表.可以把shell
终端理解为一个简单的编辑器.
- 按回车键 表示完成前面的输入,进入解析执行阶段.
- 按方向键 要显示上/下一个命令的内容,一直按就一直显示上上/下下命令.
- 按
tab
键 是要补齐命令的内容,目前鸿蒙支持如下命令:
例如:当在控制台按下 ch
和 tab
键后会输出以下三个
内容,这些功能对使用者而已看似再平常不过,但都需要内核一一实现.
-
shellBuf
存储编辑结果,当按下回车键时,将结果保存并交付给下一个阶段使用.
经常有很多小伙伴抱怨说:不知道学习鸿蒙开发哪些技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?
为了能够帮助到大家能够有规划的学习,这里特别整理了一套纯血版鸿蒙(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 设备开发学习手册: https://gitcode.com/HarmonyOS_MN
写在最后
如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
- 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
- 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。