鸿蒙内核源码分析(Shell编辑篇) | 两个任务,三个阶段

系列篇从内核视角用一句话概括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 代码 ,目录结构如下.

├─include
│      dmesg.h
│      dmesg_pri.h
│      shcmd.h
│      shcmdparse.h
│      shell.h
│      shell_lk.h
│      shell_pri.h
│      shmsg.h
│      show.h
│
└─src
    ├─base
    │      shcmd.c
    │      shcmdparse.c
    │      shell_lk.c
    │      shmsg.c
    │      show.c
    │
    └─cmds
            date_shellcmd.c
            dmesg.c
            hwi_shellcmd.c
            shell_shellcmd.c
            watch_shellcmd.c

Shell 控制块

跟进程,任务一样,每个概念的背后需要一个主结构体来的支撑,shell的主结构体就是ShellCB,掌握它就可以将shell拿捏的死死的,搞不懂这个结构体就读不懂shell的内核实现.所以在上面花再多功夫也不为过.

typedef struct {
    UINT32   consoleID;	//控制台ID
    UINT32   shellTaskHandle;	//shell服务端任务ID
    UINT32   shellEntryHandle;	//shell客户端任务ID
    VOID     *cmdKeyLink;		//待处理的shell命令链表
    VOID     *cmdHistoryKeyLink;//已处理的历史记录链表,去重,10个
    VOID     *cmdMaskKeyLink;	//主要用于方向键上下遍历历史命令
    UINT32   shellBufOffset;	//buf偏移量
    UINT32   shellKeyType;	//按键类型
    EVENT_CB_S shellEvent;	//事件类型触发
    pthread_mutex_t keyMutex;	//按键互斥量
    pthread_mutex_t historyMutex;	//历史记录互斥量
    CHAR     shellBuf[SHOW_MAX_LEN];	//shell命令buf,接受键盘的输入,需要对输入字符解析.
    CHAR     shellWorkingDirectory[PATH_MAX];//shell的工作目录
} ShellCB;
//一个shell命令的结构体,命令有长有短,鸿蒙采用了可变数组的方式实现
typedef struct {
    UINT32 count;	//字符数量
    LOS_DL_LIST list;	//双向链表
    CHAR cmdString[0];	//字符串,可变数组的一种实现方式.
} CmdKeyLink;

enum {
    STAT_N
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值