diff --git a/apps/shell/src/main.c b/apps/shell/src/main.c index 0220ce157128d90b03ea6daf2e0a86c3bc0786a3..8ba752c451d17b284463e8d356906aa6de63a053 100644 --- a/apps/shell/src/main.c +++ b/apps/shell/src/main.c @@ -111,11 +111,11 @@ static int DoShellExec(char **argv) } cmdLine[len - 2] = '\0'; - ret = syscall(__NR_shellexec, argv[0], cmdLine); + ret = syscall(__NR_shellexec, argv[0], cmdLine);//执行 系统调用 __NR_shellexec 对应为 SysShellExec free(cmdLine); return ret; } - +//shell进程的入口函数 int main(int argc, char **argv) { int ret = SH_NOK; @@ -128,35 +128,35 @@ int main(int argc, char **argv) setbuf(stdout, NULL); - shellCB = (ShellCB *)malloc(sizeof(ShellCB)); + shellCB = (ShellCB *)malloc(sizeof(ShellCB));//申请shell控制块 if (shellCB == NULL) { goto ERR_OUT1; } - ret = memset_s(shellCB, sizeof(ShellCB), 0, sizeof(ShellCB)); + ret = memset_s(shellCB, sizeof(ShellCB), 0, sizeof(ShellCB));//初始化控制块 if (ret != SH_OK) { goto ERR_OUT1; } - ret = pthread_mutex_init(&shellCB->keyMutex, NULL); + ret = pthread_mutex_init(&shellCB->keyMutex, NULL);//初始化待处理命令链表互斥量 if (ret != SH_OK) { goto ERR_OUT1; } - ret = pthread_mutex_init(&shellCB->historyMutex, NULL); + ret = pthread_mutex_init(&shellCB->historyMutex, NULL);//初始化命令历史记录链表互斥量 if (ret != SH_OK) { goto ERR_OUT2; } - ret = (int)OsShellKeyInit(shellCB); + ret = (int)OsShellKeyInit(shellCB);//初始化待处理命令 if (ret != SH_OK) { goto ERR_OUT3; - } + }//设置工作目录 (void)strncpy_s(shellCB->shellWorkingDirectory, PATH_MAX, "/", 2); /* 2:space for "/" */ - sem_init(&shellCB->shellSem, 0, 0); + sem_init(&shellCB->shellSem, 0, 0);//信号量初始化 - g_shellCB = shellCB; - return OsShellCreateTask(shellCB); + g_shellCB = shellCB;//全局变量,说明鸿蒙同时只支持一个shell进程 + return OsShellCreateTask(shellCB);//初始化两个任务 ERR_OUT3: (void)pthread_mutex_destroy(&shellCB->historyMutex); diff --git a/kernel/include/los_tables.h b/kernel/include/los_tables.h index 013b6e409896df8ccee343f5959cb9bbce4ffdd8..b92b20e17061ca399bc1a2ef6683fbe5c52e7e44 100644 --- a/kernel/include/los_tables.h +++ b/kernel/include/los_tables.h @@ -53,7 +53,16 @@ HAL层主要功能是实现轻OpenHarmony与芯片的解耦, ".previous\n" \ ) #endif - +/* +如: LOS_HAL_TABLE_BEGIN(g_shellcmd, shellcmd); +扩展后如下: +.section ".liteos.table.shellcmd.begin","aw" + .globl g_shellcmd + .type g_shellcmd, object + .p2align 3 +g_shellcmd : + .previous +*/ #ifndef LOS_HAL_TABLE_END #define LOS_HAL_TABLE_END(label, name) \ __asm__(".section \".liteos.table." X_STRING(name) ".finish\",\"aw\"\n" \ @@ -64,6 +73,16 @@ HAL层主要功能是实现轻OpenHarmony与芯片的解耦, ".previous\n" \ ) #endif +/* +如: LOS_HAL_TABLE_END(g_shellcmdEnd, shellcmd); +扩展后如下: +.section ".liteos.table.shellcmd.finish","aw" + .globl g_shellcmdEnd + .type g_shellcmdEnd, object + .p2align 3 +g_shellcmdEnd : + .previous +*/ /* This macro must be applied to any types whose objects are to be placed in tables */ #ifndef LOS_HAL_TABLE_TYPE @@ -80,7 +99,12 @@ HAL层主要功能是实现轻OpenHarmony与芯片的解耦, LOSBLD_ATTRIB_SECTION(".liteos.table." X_STRING(name) ".data") \ LOSBLD_ATTRIB_USED #endif - +/* +如: LOS_HAL_TABLE_ENTRY(shellcmd) +扩展后如下: +__attribute__((section(".liteos.table.shellcmd.data"))) +__attribute__((used)) +*/ #ifndef LOS_HAL_TABLE_QUALIFIED_ENTRY #define LOS_HAL_TABLE_QUALIFIED_ENTRY(name, _qual) \ LOSBLD_ATTRIB_SECTION(".liteos.table." X_STRING(name) ".data." X_STRING(_qual)) \ diff --git a/shell/full/include/shcmd.h b/shell/full/include/shcmd.h index bad6a56043fb274e1965a6d79e6f162dc7933ba6..503e0c9c76fd5a045450e17dec55a3944cab38fd 100644 --- a/shell/full/include/shcmd.h +++ b/shell/full/include/shcmd.h @@ -70,7 +70,7 @@ typedef struct {//shell 模块的全局信息 UINT32 listNum;//节点数量 UINT32 initMagicFlag;//初始魔法标签 0xABABABAB LosMux muxLock; //操作链表互斥锁 - CmdVerifyTransID transIdHook; + CmdVerifyTransID transIdHook;//暂不知何意. } CmdModInfo; //一个shell命令的结构体,命令有长有短,鸿蒙采用了可变数组的方式实现 typedef struct { diff --git a/shell/full/src/base/shcmdparse.c b/shell/full/src/base/shcmdparse.c index 98337a53c563bb8f78cedab7926eb8f6fdd33a56..1261afbff7c45509465bf656b1d1bb9f41891dd5 100644 --- a/shell/full/src/base/shcmdparse.c +++ b/shell/full/src/base/shcmdparse.c @@ -120,11 +120,11 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsCmdTokenSplit(CHAR *cmdStr, CHAR split, CmdParse } switch (state) { case STAT_INIT: - case STAT_TOKEN_IN: + case STAT_TOKEN_IN://开始参数获取 if ((*p == split) && QUOTES_STATUS_CLOSE(quotes)) { *p = '\0'; - ret = OsCmdParseOneToken(cmdParsed, count++, token);//解析一个令牌 - state = STAT_TOKEN_OUT; + ret = OsCmdParseOneToken(cmdParsed, count++, token);//解析一个令牌参数 + state = STAT_TOKEN_OUT;//参数获取完成 } break; case STAT_TOKEN_OUT: @@ -144,7 +144,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsCmdTokenSplit(CHAR *cmdStr, CHAR split, CmdParse return ret; } -//解析cmd命令 +//解析cmd命令,将关键字,参数分离出来 LITE_OS_SEC_TEXT_MINOR UINT32 OsCmdParse(CHAR *cmdStr, CmdParsed *cmdParsed) { if ((cmdStr == NULL) || (cmdParsed == NULL) || (strlen(cmdStr) == 0)) { diff --git a/shell/full/src/base/shmsg.c b/shell/full/src/base/shmsg.c index 8f2b0383562ce89dd2353e6068a8ca43cf59b766..9a88f7ab30d6b00daa98dfb60bf8d43bca110645 100644 --- a/shell/full/src/base/shmsg.c +++ b/shell/full/src/base/shmsg.c @@ -388,7 +388,7 @@ STATIC VOID ShellCmdProcess(ShellCB *shellCB) shellCB->cmdMaskKeyLink = shellCB->cmdHistoryKeyLink; } } -//shell 任务 +//shell 任务,处理解析,执行命令 LITE_OS_SEC_TEXT_MINOR UINT32 ShellTask(UINTPTR param1, UINTPTR param2, UINTPTR param3, @@ -401,8 +401,8 @@ LITE_OS_SEC_TEXT_MINOR UINT32 ShellTask(UINTPTR param1, (VOID)param4; while (1) { - PRINTK("\nOHOS # "); - ret = LOS_EventRead(&shellCB->shellEvent,//读取shell 输入事件 例如: cat weharmony.net 命令 + PRINTK("\nOHOS # ");//读取shell 输入事件 例如: cat weharmony.net 命令 + ret = LOS_EventRead(&shellCB->shellEvent, 0xFFF, LOS_WAITMODE_OR | LOS_WAITMODE_CLR, LOS_WAIT_FOREVER); if (ret == SHELL_CMD_PARSE_EVENT) {//获得解析命令事件 ShellCmdProcess(shellCB);//处理命令 diff --git a/shell/full/src/cmds/dmesg.c b/shell/full/src/cmds/dmesg.c index 41ae21756d360d130a565bb240b1b06b38b1b7ac..86afd516237b2a9803a759cc853d9b8b6aa704e1 100644 --- a/shell/full/src/cmds/dmesg.c +++ b/shell/full/src/cmds/dmesg.c @@ -784,6 +784,11 @@ ERR_OUT: } SHELLCMD_ENTRY(dmesg_shellcmd, CMD_TYPE_STD, "dmesg", XARGS, (CmdCallBackFunc)OsShellCmdDmesg); +/* +将扩展如下: +CmdItem dmesg_shellcmd __attribute__((section(".liteos.table.shellcmd.data"))) +__attribute__((used)) = {CMD_TYPE_STD,"dmesg",XARGS,OsShellCmdDmesg} +*/ LOS_MODULE_INIT(OsDmesgInit, LOS_INIT_LEVEL_EARLIEST);//在非常早期调用 #endif diff --git a/syscall/misc_syscall.c b/syscall/misc_syscall.c index ef21a7990094a58bb4b50504065287fc0d73cc9a..110fa6be1b7a17187d9f67559762f645704f0a6d 100644 --- a/syscall/misc_syscall.c +++ b/syscall/misc_syscall.c @@ -104,10 +104,10 @@ int SysReboot(int magic, int magic2, int type) } return -EFAULT; } - +//执行 shell 命令 #ifdef LOSCFG_SHELL int SysShellExec(const char *msgName, const char *cmdString) -{//执行 shell 命令 +{ int ret; unsigned int uintRet; errno_t err; @@ -197,7 +197,7 @@ int SysGetrusage(int what, struct rusage *ru) } return 0; } - +//系统配置 long SysSysconf(int name) { long ret; diff --git a/zzz/git/push.sh b/zzz/git/push.sh index 04a00da82ec7875b2fd1f12d4ea620a4ec6d2284..f978ffc76211ccab4f45a7dba276c000dcc32e4f 100644 --- a/zzz/git/push.sh +++ b/zzz/git/push.sh @@ -1,5 +1,5 @@ git add -A -git commit -m ' 注解shell底层实现 +git commit -m ' 对几个关键宏的注解 百万汉字注解 + 百篇博客分析 => 挖透鸿蒙内核源码 博客输出站点(国内):http://weharmonyos.com 博客输出站点(国外):https://openharmony.github.io