对shell,控制台模块代码注解

    百万汉字注解 + 百篇博客分析 => 挖透鸿蒙内核源码
    博客输出站点(国内):http://weharmonyos.com
    博客输出站点(国外):https://openharmony.github.io
    注解文件系统:https://gitee.com/weharmony/third_party_NuttX
    注解协议栈:https://gitee.com/weharmony/third_party_lwip
    注解编译子系统:https://gitee.com/weharmony/build_lite
上级 4c574a90
......@@ -445,6 +445,7 @@ OUT_FREE_PATH:
return ret;
}
//通过路径查询vnode节点
int VnodeLookup(const char *path, struct Vnode **vnode, uint32_t flags)
{
return VnodeLookupAt(path, vnode, flags, NULL);
......
......@@ -160,7 +160,7 @@ STATIC UINT32 ConsoleRefcountGet(const CONSOLE_CB *consoleCB)
{
return consoleCB->refCount;
}
//设置控制台引用次数
STATIC VOID ConsoleRefcountSet(CONSOLE_CB *consoleCB, BOOL flag)
{
if (flag == TRUE) {
......@@ -169,7 +169,7 @@ STATIC VOID ConsoleRefcountSet(CONSOLE_CB *consoleCB, BOOL flag)
--(consoleCB->refCount);
}
}
//控制台是否被占用
BOOL IsConsoleOccupied(const CONSOLE_CB *consoleCB)
{
if (ConsoleRefcountGet(consoleCB) != FALSE) {
......@@ -264,13 +264,13 @@ STATIC INT32 OsGetConsoleID(const CHAR *deviceName)
if ((deviceName != NULL) &&
(strlen(deviceName) == strlen(SERIAL)) &&
(!strncmp(deviceName, SERIAL, strlen(SERIAL)))) {
return CONSOLE_SERIAL;//1
return CONSOLE_SERIAL;//1 串口
}
#ifdef LOSCFG_NET_TELNET
else if ((deviceName != NULL) &&
(strlen(deviceName) == strlen(TELNET)) &&
(!strncmp(deviceName, TELNET, strlen(TELNET)))) {
return CONSOLE_TELNET;//2
return CONSOLE_TELNET;//2 远程登录
}
#endif
return -1;
......@@ -370,11 +370,11 @@ STATIC INLINE VOID UserEndOfRead(CONSOLE_CB *consoleCB, struct file *filep,
consoleCB->fifo[consoleCB->fifoIn] = '\0';
consoleCB->currentLen = consoleCB->fifoIn;
}
//根据VT终端标准 <ESC>[37m 为设置前景色
enum {
STAT_NOMAL_KEY,
STAT_ESC_KEY,
STAT_MULTI_KEY
STAT_NOMAL_KEY, //普通按键
STAT_ESC_KEY, //控制按键,只有 ESC 是
STAT_MULTI_KEY //多个按键,只有 [ 是
};
STATIC INT32 UserShellCheckUDRL(const CHAR ch, INT32 *lastTokenType)
......@@ -384,7 +384,7 @@ STATIC INT32 UserShellCheckUDRL(const CHAR ch, INT32 *lastTokenType)
*lastTokenType = STAT_ESC_KEY;
return ret;
} else if (ch == 0x5b) { /* 0x5b: first Key combination */
if (*lastTokenType == STAT_ESC_KEY) {
if (*lastTokenType == STAT_ESC_KEY) { //遇到 <ESC>[
*lastTokenType = STAT_MULTI_KEY;
return ret;
}
......@@ -519,7 +519,7 @@ STATIC INT32 UserFilepRead(CONSOLE_CB *consoleCB, struct file *filep, const stru
return ret;
}
//从控制台读数据
INT32 FilepRead(struct file *filep, const struct file_operations_vfs *fops, CHAR *buffer, size_t bufLen)
{
INT32 ret;
......@@ -1053,7 +1053,7 @@ STATIC VOID OsConsoleTermiosInit(CONSOLE_CB *consoleCB, const CHAR *deviceName)
}
#endif
}
//控制台文件初始化
//控制台文件实例初始化
STATIC INT32 OsConsoleFileInit(CONSOLE_CB *consoleCB)
{
INT32 ret;
......@@ -1072,7 +1072,7 @@ STATIC INT32 OsConsoleFileInit(CONSOLE_CB *consoleCB)
ret = EACCES;
goto ERROUT_WITH_FULLPATH;
}
//分配一个系统文件描述符
//分配一个系统文件句柄
consoleCB->fd = files_allocate(vnode, O_RDWR, (off_t)0, consoleCB, STDERR_FILENO + 1);
if (consoleCB->fd < 0) {
ret = EMFILE;
......@@ -1387,7 +1387,7 @@ INT32 system_console_init(const CHAR *deviceName)//deviceName: /dev/serial /dev/
}
LOS_SpinLockSave(&g_consoleSpin, &intSave);
g_console[consoleID - 1] = consoleCB;//g_console最大值只有2
g_console[consoleID - 1] = consoleCB;//全局变量, g_console最大值只有2 ,代表当前0,1指向哪个任务.
if (OsCurrTaskGet() != NULL) {//当前task
g_taskConsoleIDArray[OsCurrTaskGet()->taskID] = (UINT8)consoleID;//任务绑定控制台ID
}
......@@ -1480,7 +1480,7 @@ BOOL ConsoleEnable(VOID)
return FALSE;
}
//任务注册控制台,每个任务都有属于自己的控制台
//任务注册控制台,每个shell任务都有属于自己的控制台
INT32 ConsoleTaskReg(INT32 consoleID, UINT32 taskID)
{
if (g_console[consoleID - 1]->shellEntryId == SHELL_ENTRYID_INVALID) {
......@@ -1562,7 +1562,7 @@ BOOL is_nonblock(const CONSOLE_CB *consoleCB)
}
return consoleCB->isNonBlock;
}
//控制台更新FD
//控制台更新文件句柄
INT32 ConsoleUpdateFd(VOID)
{
INT32 consoleID;
......
......@@ -93,11 +93,11 @@ typedef struct {
UINT32 consoleMask; //控制台掩码
struct Vnode *devVnode; //索引节点
CHAR *name; //名称
INT32 fd; //文件描述符
INT32 fd; //系统文件句柄
UINT32 refCount; //引用次数
UINT32 shellEntryId;//shell 入口ID,一般为任务ID
INT32 pgrpId; //进程组ID
BOOL isNonBlock;
BOOL isNonBlock;//是否无锁方式
#ifdef LOSCFG_SHELL
VOID *shellHandle; //shell句柄,本质是 shell控制块 ShellCB
#endif
......@@ -108,8 +108,8 @@ typedef struct {
UINT32 fifoOut; //对fifo的标记,输出位置
UINT32 fifoIn; //对fifo的标记,输入位置
UINT32 currentLen; //当前fifo位置
/*---以上为 一家子 end-------*/
struct termios consoleTermios; //控制台术语
/*---以上为 一家子 end-------*///https://man7.org/linux/man-pages/man3/tcflow.3.html
struct termios consoleTermios; //termios 函数描述了一个通用的终端接口用于控制异步通信端口
} CONSOLE_CB;
/*
termios 结构是在POSIX规范中定义的标准接口,它类似于系统V中的termio接口,通过设置termios类型的数据结构中的值和使用一小组函数调用,
......
......@@ -55,13 +55,13 @@
#include "los_test_pri.h"
#endif
STATIC SystemRebootFunc g_rebootHook = NULL;
STATIC SystemRebootFunc g_rebootHook = NULL;//系统重启钩子函数
//设置系统重启钩子函数
VOID OsSetRebootHook(SystemRebootFunc func)
{
g_rebootHook = func;
}
//获取系统重启钩子函数
SystemRebootFunc OsGetRebootHook(VOID)
{
return g_rebootHook;
......
......@@ -125,13 +125,13 @@ STATIC ssize_t SerialRead(struct file *filep, CHAR *buffer, size_t bufLen)
struct file *privFilep = NULL;
const struct file_operations_vfs *fileOps = NULL;
ret = GetFilepOps(filep, &privFilep, &fileOps);
ret = GetFilepOps(filep, &privFilep, &fileOps);//获取控制台file实例
if (ret != ENOERR) {
ret = -EINVAL;
goto ERROUT;
}
ret = FilepRead(privFilep, fileOps, buffer, bufLen);
ret = FilepRead(privFilep, fileOps, buffer, bufLen);//从控制台读buf
if (ret < 0) {
goto ERROUT;
}
......@@ -149,13 +149,13 @@ STATIC ssize_t SerialWrite(struct file *filep, const CHAR *buffer, size_t bufLe
struct file *privFilep = NULL;
const struct file_operations_vfs *fileOps = NULL;
ret = GetFilepOps(filep, &privFilep, &fileOps);
ret = GetFilepOps(filep, &privFilep, &fileOps);//获取控制台file实例
if (ret != ENOERR) {
ret = -EINVAL;
goto ERROUT;
}
ret = FilepWrite(privFilep, fileOps, buffer, bufLen);
ret = FilepWrite(privFilep, fileOps, buffer, bufLen);//向控制台文件写入数据
if (ret < 0) {
goto ERROUT;
}
......@@ -210,7 +210,7 @@ ERROUT:
set_errno(-ret);
return VFS_ERROR;
}
//串口 对 VFS 接口实现
//串口实现VFS接口,以便支持按文件方式操作串口
STATIC const struct file_operations_vfs g_serialDevOps = {
SerialOpen, /* open */
SerialClose, /* close */
......@@ -235,15 +235,15 @@ INT32 virtual_serial_init(const CHAR *deviceName)
goto ERROUT;
}
SerialTypeSet(deviceName);
SerialTypeSet(deviceName);//设置串口类型
VnodeHold();
ret = VnodeLookup(deviceName, &vnode, V_DUMMY);
ret = VnodeLookup(deviceName, &vnode, V_DUMMY);//由deviceName查询vnode节点
if (ret != LOS_OK) {
ret = EACCES;
goto ERROUT;
}
//接着是 vnode < -- > file 的绑定操作
(VOID)memset_s(&g_serialFilep, sizeof(struct file), 0, sizeof(struct file));
g_serialFilep.f_oflags = O_RDWR;
g_serialFilep.f_vnode = vnode;
......@@ -269,6 +269,6 @@ ERROUT:
//串口设备去初始化,其实就是注销驱动程序
INT32 virtual_serial_deinit(VOID)
{
return unregister_driver(SERIAL);
return unregister_driver(SERIAL);//注销驱动程序
}
......@@ -51,15 +51,17 @@ extern "C" {
typedef BOOL (*CmdVerifyTransID)(UINT32 transID);
typedef struct {//命令项
CmdType cmdType;
const CHAR *cmdKey; //按键
UINT32 paraNum; //参数个数
CmdCallBackFunc cmdHook; //回调函数
CmdType cmdType; //命令类型
//CMD_TYPE_EX:不支持标准命令参数输入,会把用户填写的命令关键字屏蔽掉,例如:输入ls /ramfs,传入给注册函数的参数只有/ramfs,而ls命令关键字并不会被传入。
//CMD_TYPE_STD:支持的标准命令参数输入,所有输入的字符都会通过命令解析后被传入。
const CHAR *cmdKey; //命令关键字,例如:ls 函数在Shell中访问的名称。
UINT32 paraNum; //调用的执行函数的入参最大个数,暂不支持。
CmdCallBackFunc cmdHook;//命令执行函数地址,即命令实际执行函数。
} CmdItem;
typedef struct { //命令节点
LOS_DL_LIST list;
CmdItem *cmd;
LOS_DL_LIST list; //双向链表
CmdItem *cmd; //命令项
} CmdItemNode;
/* global info for shell module */
......
......@@ -82,32 +82,32 @@ extern "C" {
#define QUOTES_STATUS_CLOSE(qu) ((qu) == FALSE)
#define QUOTES_STATUS_OPEN(qu) ((qu) == TRUE)
//shell 控制块
typedef struct {
UINT32 consoleID;
UINT32 shellTaskHandle;
UINT32 shellEntryHandle;
UINT32 consoleID; //控制台ID
UINT32 shellTaskHandle; //处理shell的任务ID
UINT32 shellEntryHandle; //接收shell指令的任务ID
VOID *cmdKeyLink;
VOID *cmdHistoryKeyLink;
VOID *cmdMaskKeyLink;
UINT32 shellBufOffset;
UINT32 shellKeyType;
EVENT_CB_S shellEvent;
UINT32 shellBufOffset; //buf偏移量
UINT32 shellKeyType; //键内型
EVENT_CB_S shellEvent; //事件类型触发
pthread_mutex_t keyMutex;
pthread_mutex_t historyMutex;
CHAR shellBuf[SHOW_MAX_LEN];
CHAR shellWorkingDirectory[PATH_MAX];
CHAR shellBuf[SHOW_MAX_LEN]; //shell命令buf,接受键盘的输入,需要对输入字符解析.
CHAR shellWorkingDirectory[PATH_MAX];//shell的工作目录
} ShellCB;
/* All support cmd types */
typedef enum {
CMD_TYPE_SHOW = 0,
CMD_TYPE_STD = 1,
CMD_TYPE_EX = 2,
typedef enum {//所有支持的按键类型
CMD_TYPE_SHOW = 0, //用户怎么输入就怎么显示出现,包括 \n \0 这些字符也都会存在
CMD_TYPE_STD = 1, //支持的标准命令参数输入,所有输入的字符都会通过命令解析后被传入。
CMD_TYPE_EX = 2, //不支持标准命令参数输入,会把用户填写的命令关键字屏蔽掉,例如:输入ls /ramfs,传入给注册函数的参数只有/ramfs,而ls命令关键字并不会被传入。
CMD_TYPE_BUTT
} CmdType;
typedef enum {
typedef enum {//四个方向上下左右键
CMD_KEY_UP = 0,
CMD_KEY_DOWN = 1,
CMD_KEY_RIGHT = 2,
......
......@@ -44,7 +44,7 @@
#define SHELL_INIT_MAGIC_FLAG 0xABABABAB
#define CTRL_C 0x03 /* 0x03: ctrl+c ASCII */
STATIC CmdModInfo g_cmdInfo;//命令模块信息,上面挂了所有的命令项目
STATIC CmdModInfo g_cmdInfo;//shell 命令模块信息,上面挂了所有的命令项(ls,cd ,cp ==)
LOS_HAL_TABLE_BEGIN(g_shellcmd, shellcmd);
LOS_HAL_TABLE_END(g_shellcmdEnd, shellcmd);
......@@ -561,7 +561,7 @@ LITE_OS_SEC_TEXT_MINOR INT32 OsTabCompletion(CHAR *cmdKey, UINT32 *len)
return count;
}
//按升序插入到链表中
LITE_OS_SEC_TEXT_MINOR VOID OsCmdAscendingInsert(CmdItemNode *cmd)
{
CmdItemNode *cmdItem = NULL;
......@@ -639,29 +639,29 @@ LITE_OS_SEC_TEXT_MINOR VOID OsShellKeyDeInit(CmdKeyLink *cmdKeyLink)
cmdKeyLink->count = 0;
(VOID)LOS_MemFree(m_aucSysMem0, cmdKeyLink);
}
//注册系统自带的shell命令
LITE_OS_SEC_TEXT_MINOR UINT32 OsShellSysCmdRegister(VOID)
{
UINT32 i;
UINT8 *cmdItemGroup = NULL;
UINT32 index = ((UINTPTR)(&g_shellcmdEnd) - (UINTPTR)(&g_shellcmd[0])) / sizeof(CmdItem);
UINT32 index = ((UINTPTR)(&g_shellcmdEnd) - (UINTPTR)(&g_shellcmd[0])) / sizeof(CmdItem);//获取个数
CmdItemNode *cmdItem = NULL;
cmdItemGroup = (UINT8 *)LOS_MemAlloc(m_aucSysMem0, index * sizeof(CmdItemNode));
cmdItemGroup = (UINT8 *)LOS_MemAlloc(m_aucSysMem0, index * sizeof(CmdItemNode));//分配命令项
if (cmdItemGroup == NULL) {
PRINT_ERR("[%s]System memory allocation failure!\n", __FUNCTION__);
return (UINT32)OS_ERROR;
}
for (i = 0; i < index; ++i) {
for (i = 0; i < index; ++i) {//循环插入
cmdItem = (CmdItemNode *)(cmdItemGroup + i * sizeof(CmdItemNode));
cmdItem->cmd = &g_shellcmd[i];
OsCmdAscendingInsert(cmdItem);
cmdItem->cmd = &g_shellcmd[i];//一个个取
OsCmdAscendingInsert(cmdItem);//按升序插入到链表中
}
g_cmdInfo.listNum += index;
g_cmdInfo.listNum += index;//命令数量叠加
return LOS_OK;
}
//解析回车或换行键
LITE_OS_SEC_TEXT_MINOR VOID OsShellCmdPush(const CHAR *string, CmdKeyLink *cmdKeyLink)
{
CmdKeyLink *cmdNewNode = NULL;
......@@ -776,7 +776,15 @@ OUT:
return (UINT32)ret;
}
//命令初始化
/* 命令初始化,用于存放支持的命令,目前鸿蒙支持如下命令
arp cat cd chgrp chmod chown cp cpup
date dhclient dmesg dns format free help hwi
ifconfig ipdebug kill log ls lsfd memcheck mkdir
mount netstat oom partinfo partition ping ping6 pwd
reset rm rmdir sem statfs su swtmr sync
systeminfo task telnet test tftp touch umount uname
watch writeproc
*/
LITE_OS_SEC_TEXT_MINOR UINT32 OsCmdInit(VOID)
{
UINT32 ret;
......@@ -790,7 +798,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsCmdInit(VOID)
}
return LOS_OK;
}
//创建一个命令项
//创建一个命令项,例如 chmod
STATIC UINT32 OsCmdItemCreate(CmdType cmdType, const CHAR *cmdKey, UINT32 paraNum, CmdCallBackFunc cmdProc)
{
CmdItem *cmdItem = NULL;
......
......@@ -111,14 +111,14 @@ enum {
STAT_ESC_KEY,
STAT_MULTI_KEY
};
//解析上下左右键
STATIC INT32 ShellCmdLineCheckUDRL(const CHAR ch, ShellCB *shellCB)
{
INT32 ret = LOS_OK;
if (ch == 0x1b) { /* 0x1b: ESC */
shellCB->shellKeyType = STAT_ESC_KEY;
return ret;
} else if (ch == 0x5b) { /* 0x5b: first Key combination */
} else if (ch == 0x5b) { /* 0x5b: first Key combination */ //为[键 ,遵循 vt100 规则
if (shellCB->shellKeyType == STAT_ESC_KEY) {
shellCB->shellKeyType = STAT_MULTI_KEY;
return ret;
......@@ -148,44 +148,44 @@ STATIC INT32 ShellCmdLineCheckUDRL(const CHAR ch, ShellCB *shellCB)
}
return LOS_NOK;
}
//对命令行内容分解
LITE_OS_SEC_TEXT_MINOR VOID ShellCmdLineParse(CHAR c, pf_OUTPUT outputFunc, ShellCB *shellCB)
{
const CHAR ch = c;
INT32 ret;
//不是碰到回车键和字符串结束
if ((shellCB->shellBufOffset == 0) && (ch != '\n') && (ch != '\0')) {
(VOID)memset_s(shellCB->shellBuf, SHOW_MAX_LEN, 0, SHOW_MAX_LEN);
(VOID)memset_s(shellCB->shellBuf, SHOW_MAX_LEN, 0, SHOW_MAX_LEN);//重置buf
}
//遇到回车或换行
if ((ch == '\r') || (ch == '\n')) {
if (shellCB->shellBufOffset < (SHOW_MAX_LEN - 1)) {
shellCB->shellBuf[shellCB->shellBufOffset] = '\0';
shellCB->shellBuf[shellCB->shellBufOffset] = '\0';//字符串结束
}
shellCB->shellBufOffset = 0;
(VOID)pthread_mutex_lock(&shellCB->keyMutex);
OsShellCmdPush(shellCB->shellBuf, shellCB->cmdKeyLink);
OsShellCmdPush(shellCB->shellBuf, shellCB->cmdKeyLink);//解析回车或换行
(VOID)pthread_mutex_unlock(&shellCB->keyMutex);
ShellNotify(shellCB);
ShellNotify(shellCB);//通知输入命令完成
return;
} else if ((ch == '\b') || (ch == 0x7F)) { /* backspace or delete(0x7F) */
} else if ((ch == '\b') || (ch == 0x7F)) { /* backspace or delete(0x7F) */ //遇到删除键
if ((shellCB->shellBufOffset > 0) && (shellCB->shellBufOffset < (SHOW_MAX_LEN - 1))) {
shellCB->shellBuf[shellCB->shellBufOffset - 1] = '\0';
shellCB->shellBufOffset--;
outputFunc("\b \b");
shellCB->shellBuf[shellCB->shellBufOffset - 1] = '\0';//填充`\0`
shellCB->shellBufOffset--;//buf减少
outputFunc("\b \b");//回调入参函数
}
return;
} else if (ch == 0x09) { /* 0x09: tab */
} else if (ch == 0x09) { /* 0x09: tab *///遇到tab键
if ((shellCB->shellBufOffset > 0) && (shellCB->shellBufOffset < (SHOW_MAX_LEN - 1))) {
ret = OsTabCompletion(shellCB->shellBuf, &shellCB->shellBufOffset);
ret = OsTabCompletion(shellCB->shellBuf, &shellCB->shellBufOffset);//解析tab键
if (ret > 1) {
outputFunc("OHOS # %s", shellCB->shellBuf);
outputFunc("OHOS # %s", shellCB->shellBuf);//回调入参函数
}
}
return;
}
/* parse the up/down/right/left key */
ret = ShellCmdLineCheckUDRL(ch, shellCB);
ret = ShellCmdLineCheckUDRL(ch, shellCB);//解析上下左右键
if (ret == LOS_OK) {
return;
}
......@@ -324,7 +324,7 @@ END:
}
return ret;
}
//读取命令行内容
#ifdef LOSCFG_FS_VFS
LITE_OS_SEC_TEXT_MINOR UINT32 ShellEntry(UINTPTR param)
{
......@@ -332,7 +332,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 ShellEntry(UINTPTR param)
INT32 n = 0;
ShellCB *shellCB = (ShellCB *)param;
CONSOLE_CB *consoleCB = OsGetConsoleByID((INT32)shellCB->consoleID);
CONSOLE_CB *consoleCB = OsGetConsoleByID((INT32)shellCB->consoleID);//获取控制台
if (consoleCB == NULL) {
PRINT_ERR("Shell task init error!\n");
return 1;
......@@ -342,11 +342,11 @@ LITE_OS_SEC_TEXT_MINOR UINT32 ShellEntry(UINTPTR param)
while (1) {
#ifdef LOSCFG_PLATFORM_CONSOLE
if (!IsConsoleOccupied(consoleCB)) {
if (!IsConsoleOccupied(consoleCB)) {//控制台是否被占用
#endif
/* is console ready for shell ? */
n = read(consoleCB->fd, &ch, 1);
if (n == 1) {
n = read(consoleCB->fd, &ch, 1);//从控制台读取一个字符内容
if (n == 1) {//如果能读到一个字符
ShellCmdLineParse(ch, (pf_OUTPUT)dprintf, shellCB);
}
if (is_nonblock(consoleCB)) {
......@@ -358,17 +358,17 @@ LITE_OS_SEC_TEXT_MINOR UINT32 ShellEntry(UINTPTR param)
}
}
#endif
//处理shell 命令
STATIC VOID ShellCmdProcess(ShellCB *shellCB)
{
CHAR *buf = NULL;
while (1) {
buf = ShellGetInputBuf(shellCB);
buf = ShellGetInputBuf(shellCB);//获取输入的buf
if (buf == NULL) {
break;
}
(VOID)ShellMsgParse(buf);
ShellSaveHistoryCmd(buf, shellCB);
(VOID)ShellMsgParse(buf);//解析buf
ShellSaveHistoryCmd(buf, shellCB);//保存到历史记录中
shellCB->cmdMaskKeyLink = shellCB->cmdHistoryKeyLink;
}
}
......@@ -390,14 +390,14 @@ LITE_OS_SEC_TEXT_MINOR UINT32 ShellTask(UINTPTR param1,
0xFFF, LOS_WAITMODE_OR | LOS_WAITMODE_CLR, LOS_WAIT_FOREVER);
if (ret == SHELL_CMD_PARSE_EVENT) {//获得解析命令事件
ShellCmdProcess(shellCB);//处理命令
} else if (ret == CONSOLE_SHELL_KEY_EVENT) {
} else if (ret == CONSOLE_SHELL_KEY_EVENT) {//退出shell事件
break;
}
}
OsShellKeyDeInit((CmdKeyLink *)shellCB->cmdKeyLink);
OsShellKeyDeInit((CmdKeyLink *)shellCB->cmdKeyLink);//
OsShellKeyDeInit((CmdKeyLink *)shellCB->cmdHistoryKeyLink);
(VOID)LOS_EventDestroy(&shellCB->shellEvent);
(VOID)LOS_MemFree((VOID *)m_aucSysMem0, shellCB);
(VOID)LOS_EventDestroy(&shellCB->shellEvent);//注销事件
(VOID)LOS_MemFree((VOID *)m_aucSysMem0, shellCB);//释放shell控制块
return 0;
}
......@@ -405,21 +405,21 @@ LITE_OS_SEC_TEXT_MINOR UINT32 ShellTask(UINTPTR param1,
#define SERIAL_ENTRY_TASK_NAME "SerialEntryTask"
#define TELNET_SHELL_TASK_NAME "TelnetShellTask"
#define TELNET_ENTRY_TASK_NAME "TelnetEntryTask"
//shell 任务初始化
LITE_OS_SEC_TEXT_MINOR UINT32 ShellTaskInit(ShellCB *shellCB)
{
CHAR *name = NULL;
TSK_INIT_PARAM_S initParam = {0};
if (shellCB->consoleID == CONSOLE_SERIAL) {
//输入Shell命令的两种方式
if (shellCB->consoleID == CONSOLE_SERIAL) { //通过串口工具
name = SERIAL_SHELL_TASK_NAME;
} else if (shellCB->consoleID == CONSOLE_TELNET) {
} else if (shellCB->consoleID == CONSOLE_TELNET) {//通过远程工具
name = TELNET_SHELL_TASK_NAME;
} else {
return LOS_NOK;
}
initParam.pfnTaskEntry = (TSK_ENTRY_FUNC)ShellTask;
initParam.pfnTaskEntry = (TSK_ENTRY_FUNC)ShellTask;//任务入口地址,主要是解析shell命令
initParam.usTaskPrio = 9; /* 9:shell task priority */
initParam.auwArgs[0] = (UINTPTR)shellCB;
initParam.uwStackSize = 0x3000;
......@@ -430,7 +430,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 ShellTaskInit(ShellCB *shellCB)
return LOS_TaskCreate(&shellCB->shellTaskHandle, &initParam);
}
//进入shell初始化
LITE_OS_SEC_TEXT_MINOR UINT32 ShellEntryInit(ShellCB *shellCB)
{
UINT32 ret;
......@@ -445,7 +445,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 ShellEntryInit(ShellCB *shellCB)
return LOS_NOK;
}
initParam.pfnTaskEntry = (TSK_ENTRY_FUNC)ShellEntry;
initParam.pfnTaskEntry = (TSK_ENTRY_FUNC)ShellEntry;//主要是读取命令行内容
initParam.usTaskPrio = 9; /* 9:shell task priority */
initParam.auwArgs[0] = (UINTPTR)shellCB;
initParam.uwStackSize = 0x1000;
......
......@@ -35,32 +35,32 @@
#include "console.h"
STATIC BOOL g_shellSourceFlag = FALSE;
STATIC BOOL g_shellSourceFlag = FALSE;//
//shell支持的命令初始化
STATIC UINT32 OsShellCmdInit(VOID)
{
UINT32 ret = OsCmdInit();
UINT32 ret = OsCmdInit();//命令初始化
if (ret != LOS_OK) {
return ret;
}
return OsShellSysCmdRegister();
return OsShellSysCmdRegister();//系统自带的shell命令初始化
}
//创建shell任务
STATIC UINT32 OsShellCreateTask(ShellCB *shellCB)
{
UINT32 ret = ShellTaskInit(shellCB);
UINT32 ret = ShellTaskInit(shellCB);//执行shell命令的任务初始化
if (ret != LOS_OK) {
return ret;
}
return ShellEntryInit(shellCB);
return ShellEntryInit(shellCB);//通过控制台接受shell命令的任务初始化
}
//shell资源初始化
STATIC UINT32 OsShellSourceInit(INT32 consoleId)
{
UINT32 ret = LOS_NOK;
CONSOLE_CB *consoleCB = OsGetConsoleByID(consoleId);
CONSOLE_CB *consoleCB = OsGetConsoleByID(consoleId);//获取控制台信息
if ((consoleCB == NULL) || (consoleCB->shellHandle != NULL)) {
return LOS_NOK;
}
......@@ -120,7 +120,7 @@ ERR_OUT1:
consoleCB->shellHandle = NULL;
return ret;
}
//shell初始化
UINT32 OsShellInit(INT32 consoleId)
{
if (g_shellSourceFlag == FALSE) {
......@@ -133,27 +133,27 @@ UINT32 OsShellInit(INT32 consoleId)
}
return OsShellSourceInit(consoleId);
}
//shell结束
INT32 OsShellDeinit(INT32 consoleId)
{
CONSOLE_CB *consoleCB = NULL;
ShellCB *shellCB = NULL;
consoleCB = OsGetConsoleByID(consoleId);
consoleCB = OsGetConsoleByID(consoleId);//通过ID获取当前控制台
if (consoleCB == NULL) {
PRINT_ERR("shell deinit error.\n");
return -1;
}
shellCB = (ShellCB *)consoleCB->shellHandle;
consoleCB->shellHandle = NULL;
shellCB = (ShellCB *)consoleCB->shellHandle;//从当前控制台获取shell控制块
consoleCB->shellHandle = NULL;//重置控制台的shell
if (shellCB == NULL) {
PRINT_ERR("shell deinit error.\n");
return -1;
}
(VOID)LOS_TaskDelete(shellCB->shellEntryHandle);
(VOID)LOS_EventWrite(&shellCB->shellEvent, CONSOLE_SHELL_KEY_EVENT);
(VOID)LOS_TaskDelete(shellCB->shellEntryHandle);//删除接收控制台指令的shell任务
(VOID)LOS_EventWrite(&shellCB->shellEvent, CONSOLE_SHELL_KEY_EVENT);//发送结束事件
return 0;
}
......
......@@ -105,7 +105,7 @@ static int CheckNewAttrTime(struct IATTR *attr, struct timespec times[TIMESPEC_T
return ret;
}
//获取全路径
static int GetFullpathNull(int fd, const char *path, char **filePath)
{
int ret;
......
......@@ -40,6 +40,7 @@
#ifdef LOSCFG_NET_LWIP_SACK
#include "lwip/sockets.h"
//网络相关系统调用
#define SOCKET_U2K(s) \
do { \
......
......@@ -43,23 +43,24 @@
#include "capability_api.h"
#endif
//进程相关系统回调
//检查进程权限
static int OsPermissionToCheck(unsigned int pid, unsigned int who)
{
int ret = LOS_GetProcessGroupID(pid);
int ret = LOS_GetProcessGroupID(pid);//获取进程组ID
if (ret < 0) {
return ret;
} else if (ret == OS_KERNEL_PROCESS_GROUP) {
} else if (ret == OS_KERNEL_PROCESS_GROUP) {//为内核进程组
return -EPERM;
} else if ((ret == OS_USER_PRIVILEGE_PROCESS_GROUP) && (pid != who)) {
} else if ((ret == OS_USER_PRIVILEGE_PROCESS_GROUP) && (pid != who)) {//为用户进程组,但两个参数进程不一致
return -EPERM;
} else if (pid == OsGetUserInitProcessID()) {
} else if (pid == OsGetUserInitProcessID()) {//为用户进程的祖宗
return -EPERM;
}
return 0;
}
//设置用户级任务调度信息
static int OsUserTaskSchedulerSet(unsigned int tid, unsigned short policy, unsigned short priority, bool policyFlag)
{
int ret;
......@@ -190,7 +191,7 @@ int SysSchedGetParam(int id, int flag)
return OsGetProcessPriority(LOS_PRIO_PROCESS, id);
}
//设置进程优先级
int SysSetProcessPriority(int which, int who, unsigned int prio)
{
int ret;
......
git add -A
git commit -m ' common,extended等几个目录结构和Makefile调整
git commit -m ' 对shell,控制台模块代码注解
百万汉字注解 + 百篇博客分析 => 挖透鸿蒙内核源码
博客输出站点(国内):http://weharmonyos.com
博客输出站点(国外):https://openharmony.github.io
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册