提交 ef89a922 编写于 作者: 鸿蒙内核源码分析's avatar 鸿蒙内核源码分析

shell 定时器,任务,系统信息 代码注释,Shell的本质是向外界提供一个窗口窥视内核.

鸿蒙内核源码分析系列 【 CSDN | OSCHINA | WIKI 】
鸿蒙内核源码注释中文版 【 CSDN仓 | Gitee仓 | Github仓 | Coding仓 】四大仓库每日同步更新代码和wiki
项目给鸿蒙内核源码逐行加上中文注解,详细阐述框架和代码细节, 精读 HarmonyOS 内核源码, 将迅速拔高对计算机整体理解,从此高屋建瓴看问题.
上级 35fce660
......@@ -66,13 +66,13 @@ STATIC VOID OsPrintSwtmrMsg(const SWTMR_CTRL_S *swtmr)
"%-6u "
"0x%08x "
"%p\n",
swtmr->usTimerID % LOSCFG_BASE_CORE_SWTMR_LIMIT,
g_shellSwtmrStatus[swtmr->ucState],
g_shellSwtmrMode[swtmr->ucMode],
swtmr->uwInterval,
swtmr->uwCount,
swtmr->uwArg,
swtmr->pfnHandler);
swtmr->usTimerID % LOSCFG_BASE_CORE_SWTMR_LIMIT, //软件定时器ID。
g_shellSwtmrStatus[swtmr->ucState], //软件定时器状态,状态可能为:"UnUsed", "Created", "Ticking"。
g_shellSwtmrMode[swtmr->ucMode], //软件定时器模式。模式可能为:"Once", "Period", "NSD(单次定时器,定时结束后不会自动删除)"
swtmr->uwInterval, //软件定时器使用的Tick数。
swtmr->uwCount, //软件定时器已经工作的次数。
swtmr->uwArg, //传入的参数。
swtmr->pfnHandler); //回调函数的地址。
}
STATIC INLINE VOID OsPrintSwtmrMsgHead(VOID)
......@@ -80,7 +80,9 @@ STATIC INLINE VOID OsPrintSwtmrMsgHead(VOID)
PRINTK("\r\nSwTmrID State Mode Interval Count Arg handlerAddr\n");
PRINTK("---------- ------- ------- --------- ------- ---------- --------\n");
}
//shell命令之swtmr 命令用于查询系统软件定时器相关信息。
//参数缺省时,默认显示所有软件定时器的相关信息。
//swtmr后加ID号时,显示ID对应的软件定时器相关信息。
LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdSwtmrInfoGet(INT32 argc, const UINT8 **argv)
{
#define OS_ALL_SWTMR_MASK 0xffffffff
......
......@@ -119,34 +119,34 @@ UINT32 OsShellCmdSwtmrCntGet(VOID)
LOS_IntRestore(intSave);
return swtmrCnt;
}
//查看系统资源使用情况
LITE_OS_SEC_TEXT_MINOR VOID OsShellCmdSystemInfoGet(VOID)
{
UINT8 isTaskEnable = YES;
UINT8 isSemEnable = LOSCFG_BASE_IPC_SEM;
UINT8 isQueueEnable = LOSCFG_BASE_IPC_QUEUE;
UINT8 isSwtmrEnable = LOSCFG_BASE_CORE_SWTMR;
//模块名称 当前使用量 最大可用量 模块是否开启
PRINTK("\n Module Used Total Enabled\n");
PRINTK("--------------------------------------------\n");
PRINTK(" Task %-10u%-10d%s\n",
OsShellCmdTaskCntGet(),
LOSCFG_BASE_CORE_TSK_LIMIT,
SYSINFO_ENABLED(isTaskEnable));
OsShellCmdTaskCntGet(), //有效任务数
LOSCFG_BASE_CORE_TSK_LIMIT, //任务最大数 128
SYSINFO_ENABLED(isTaskEnable));//任务是否失效 YES or NO
PRINTK(" Sem %-10u%-10d%s\n",
OsShellCmdSemCntGet(),
LOSCFG_BASE_IPC_SEM_LIMIT,
SYSINFO_ENABLED(isSemEnable));
OsShellCmdSemCntGet(), //信号量的数量
LOSCFG_BASE_IPC_SEM_LIMIT, //信号量最大数 1024
SYSINFO_ENABLED(isSemEnable));//信号量是否失效 YES or NO
PRINTK(" Queue %-10u%-10d%s\n",
OsShellCmdQueueCntGet(),
LOSCFG_BASE_IPC_QUEUE_LIMIT,
SYSINFO_ENABLED(isQueueEnable));
OsShellCmdQueueCntGet(), //队列的数量
LOSCFG_BASE_IPC_QUEUE_LIMIT, //队列的最大数 1024
SYSINFO_ENABLED(isQueueEnable));//队列是否失效 YES or NO
PRINTK(" SwTmr %-10u%-10d%s\n",
OsShellCmdSwtmrCntGet(),
LOSCFG_BASE_CORE_SWTMR_LIMIT,
SYSINFO_ENABLED(isSwtmrEnable));
OsShellCmdSwtmrCntGet(), //定时器的数量
LOSCFG_BASE_CORE_SWTMR_LIMIT, //定时器的总数 1024
SYSINFO_ENABLED(isSwtmrEnable)); //定时器是否失效 YES or NO
}
//systeminfo命令用于显示当前操作系统内资源使用情况,包括任务、信号量、互斥量、队列、定时器等。
INT32 OsShellCmdSystemInfo(INT32 argc, const CHAR **argv)
{
if (argc == 0) {
......
......@@ -95,49 +95,49 @@ STATIC UINT32 *g_taskWaterLine = NULL;
#else
#define PROCESS_INFO_SHOW(seqBuf, arg...) PRINTK(arg)
#endif
//shell task 显示进程的模式
LITE_OS_SEC_TEXT_MINOR UINT8 *OsShellCmdProcessMode(UINT16 mode)
{
if (mode == OS_KERNEL_MODE) {
if (mode == OS_KERNEL_MODE) {//内核进程
return (UINT8 *)"kernel";
} else if (mode == OS_USER_MODE) {
} else if (mode == OS_USER_MODE) {//用户进程
return (UINT8 *)"user";
}
return (UINT8 *)"ERROR";
}
//shell task 显示调度方式
LITE_OS_SEC_TEXT_MINOR UINT8 *OsShellCmdSchedPolicy(UINT16 policy)
{
if (policy == LOS_SCHED_RR) {
if (policy == LOS_SCHED_RR) {//抢占式
return (UINT8 *)"RR";
} else if (policy == LOS_SCHED_FIFO) {
} else if (policy == LOS_SCHED_FIFO) {//排队式
return (UINT8 *)"FIFO";
}
return (UINT8 *)"ERROR";
}
//进程的五种状态
LITE_OS_SEC_TEXT_MINOR UINT8 *OsShellProcessStatus(UINT16 status)
{
status = status & OS_PROCESS_STATUS_MASK;
if (status & OS_PROCESS_STATUS_ZOMBIES) {
return (UINT8 *)"Zombies";
} else if (status & OS_PROCESS_STATUS_INIT) {
if (status & OS_PROCESS_STATUS_ZOMBIES) {//僵死状态
return (UINT8 *)"Zombies";
} else if (status & OS_PROCESS_STATUS_INIT) {//初始状态
return (UINT8 *)"Init";
} else if (status & OS_PROCESS_STATUS_RUNNING) {
} else if (status & OS_PROCESS_STATUS_RUNNING) {//正运行状态
return (UINT8 *)"Running";
} else if (status & OS_PROCESS_STATUS_READY) {
} else if (status & OS_PROCESS_STATUS_READY) {//就绪状态
return (UINT8 *)"Ready";
} else {
if (status & OS_PROCESS_STATUS_PEND) {
if (status & OS_PROCESS_STATUS_PEND) {//阻塞状态
return (UINT8 *)"Pend";
}
}
return (UINT8 *)"Invalid";
}
//打印shell task 进程部分的头部
STATIC VOID OsShellCmdProcessTitle(VOID *seqBuf, UINT16 flag)
{
PROCESS_INFO_SHOW(seqBuf, "\r\n PID PPID PGID UID Status ");
......@@ -145,7 +145,7 @@ STATIC VOID OsShellCmdProcessTitle(VOID *seqBuf, UINT16 flag)
PROCESS_INFO_SHOW(seqBuf, "VirtualMem ShareMem PhysicalMem ");
}
#ifdef LOSCFG_KERNEL_CPUP
#ifdef LOSCFG_KERNEL_CPUP //统计系统CPU的占用率开关
if (flag & OS_PROCESS_INFO_ALL) {
PROCESS_INFO_SHOW(seqBuf, "CPUUSE CPUUSE10s CPUUSE1s ");
} else {
......@@ -172,7 +172,7 @@ STATIC VOID OsShellCmdProcessInfoShow(const LosProcessCB *processCB, const INT32
PROCESS_INFO_SHOW(seqBuf, "%#11x%#9x%#12x", procMemUsage[PROCESS_VM_INDEX], procMemUsage[PROCESS_SM_INDEX],
procMemUsage[PROCESS_PM_INDEX]);
}
#ifdef LOSCFG_KERNEL_CPUP
#ifdef LOSCFG_KERNEL_CPUP //统计系统CPU的占用率开关
if (flag & OS_PROCESS_INFO_ALL) {
PROCESS_INFO_SHOW(seqBuf, "%5u.%1u%8u.%1u%7u.%-1u ",
g_processCpupAll[pid].uwUsage / LOS_CPUP_PRECISION_MULT,
......@@ -195,7 +195,7 @@ STATIC VOID OsShellCmdProcessInfoShow(const LosProcessCB *processCB, const INT32
}
PROCESS_INFO_SHOW(seqBuf, " %-32s\n", processCB->processName);
}
//shell task 所有进程的信息
STATIC VOID OsShellCmdAllProcessInfoShow(const LosProcessCB *pcbArray, const INT32 *group,
const UINT32 *memArray, VOID *seqBuf, UINT16 flag)
{
......@@ -204,23 +204,23 @@ STATIC VOID OsShellCmdAllProcessInfoShow(const LosProcessCB *pcbArray, const INT
for (pid = 1; pid < g_processMaxNum; ++pid) {
processCB = pcbArray + pid;
if (OsProcessIsUnused(processCB)) {
if (OsProcessIsUnused(processCB)) {//是否为线程池中未分配使用的进程
continue;
}
OsShellCmdProcessInfoShow(processCB, group, memArray, seqBuf, flag);
}
}
//进程内存的使用情况
STATIC VOID OsProcessMemUsageGet(UINT32 *memArray)
{
UINT32 pid;
LosProcessCB *processCB = NULL;
UINT32 *proMemUsage = NULL;
for (pid = 0; pid < g_processMaxNum; ++pid) {
for (pid = 0; pid < g_processMaxNum; ++pid) {//遍历进程
processCB = g_processCBArray + pid;
if (OsProcessIsUnused(processCB)) {
if (OsProcessIsUnused(processCB)) {//是否为线程池中未分配使用的进程
continue;
}
proMemUsage = &memArray[pid * PROCESS_VM_INDEX_MAX];
......@@ -339,7 +339,7 @@ STATIC VOID OsShellCmdTaskWaterLineGet(const LosTaskCB *allTaskArray)
(const UINTPTR *)taskCB->topOfStack, &g_taskWaterLine[taskCB->taskID]);
}
}
//打印 shell task 命令 title 信息
STATIC VOID OsShellCmdTskInfoTitle(VOID *seqBuf, UINT16 flag)
{
PROCESS_INFO_SHOW(seqBuf, "\r\n TID PID ");
......@@ -389,7 +389,7 @@ STATIC INLINE VOID OsShellTskInfoData(const LosTaskCB *taskCB, VOID *seqBuf, UIN
}
PROCESS_INFO_SHOW(seqBuf, "%#10x %-32s\n", OsTaskMemUsage(taskCB->taskID), taskCB->taskName);
}
//获取所有任务的数据信息
STATIC VOID OsShellCmdAllTaskInfoData(const LosTaskCB *allTaskArray, VOID *seqBuf, UINT16 flag)
{
const LosTaskCB *taskCB = NULL;
......@@ -407,13 +407,13 @@ STATIC VOID OsShellCmdAllTaskInfoData(const LosTaskCB *allTaskArray, VOID *seqBu
}
}
}
//获取任务的数据信息
STATIC VOID OsShellCmdTskInfoData(const LosTaskCB *allTaskArray, VOID *seqBuf, UINT16 flag)
{
OsShellCmdTskInfoTitle(seqBuf, flag);
OsShellCmdAllTaskInfoData(allTaskArray, seqBuf, flag);
}
//获取进程和任务的信息
STATIC VOID OsProcessAndTaskInfoGet(LosProcessCB **pcbArray, INT32 **group, LosTaskCB **tcbArray,
UINT32 **memArray, UINT16 flag)
{
......@@ -456,16 +456,16 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdTskInfoGet(UINT32 taskID, VOID *seqBuf,
return LOS_NOK;
}
(VOID)memset_s(pcbArray, size, 0, size);
OsProcessAndTaskInfoGet(&pcbArray, &group, &tcbArray, &memArray, flag);
OsShellCmdProcessInfoData(pcbArray, group, memArray, seqBuf, flag);
OsShellCmdTskInfoData(tcbArray, seqBuf, flag);
OsProcessAndTaskInfoGet(&pcbArray, &group, &tcbArray, &memArray, flag);//获取进程和任务的信息
OsShellCmdProcessInfoData(pcbArray, group, memArray, seqBuf, flag);//获取进程的数据信息
OsShellCmdTskInfoData(tcbArray, seqBuf, flag);//获取任务的数据信息
(VOID)LOS_MemFree(m_aucSysMem1, pcbArray);
}
return LOS_OK;
}
//用于查询进程及线程信息 命令格式: task/task -a(查看更多信息) 参数缺省时默认打印部分任务信息
LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdDumpTask(INT32 argc, const CHAR **argv)
{
UINT32 flag = 0;
......
......@@ -107,7 +107,7 @@ INT32 OsRegionOverlapCheckUnlock(LosVmSpace *space, LosVmMapRegion *region)
return 0;
}
//shell task 进程虚拟内存的使用情况
UINT32 OsShellCmdProcessVmUsage(LosVmSpace *space)
{
LosVmMapRegion *region = NULL;
......@@ -119,18 +119,18 @@ UINT32 OsShellCmdProcessVmUsage(LosVmSpace *space)
return 0;
}
if (space == LOS_GetKVmSpace()) {
if (space == LOS_GetKVmSpace()) {//内核空间
OsShellCmdProcessPmUsage(space, NULL, &used);
} else {
RB_SCAN_SAFE(&space->regionRbTree, pstRbNode, pstRbNodeNext)
region = (LosVmMapRegion *)pstRbNode;
used += region->range.size;
RB_SCAN_SAFE_END(&space->regionRbTree, pstRbNode, pstRbNodeNext)
} else {//用户空间
RB_SCAN_SAFE(&space->regionRbTree, pstRbNode, pstRbNodeNext)//开始扫描红黑树
region = (LosVmMapRegion *)pstRbNode;//拿到线性区,注意LosVmMapRegion结构体的第一个变量就是pstRbNode,所以可直接(LosVmMapRegion *)转
used += region->range.size;//size叠加,算出总使用
RB_SCAN_SAFE_END(&space->regionRbTree, pstRbNode, pstRbNodeNext)//结束扫描红黑树
}
return used;
}
//内核空间物理内存使用情况统计
VOID OsKProcessPmUsage(LosVmSpace *kSpace, UINT32 *actualPm)
{
UINT32 memUsed;
......@@ -155,23 +155,23 @@ VOID OsKProcessPmUsage(LosVmSpace *kSpace, UINT32 *actualPm)
/* Kernel resident memory, include default heap memory */
memUsed = SYS_MEM_SIZE_DEFAULT - (totalCount << PAGE_SHIFT);
spaceList = LOS_GetVmSpaceList();
LOS_DL_LIST_FOR_EACH_ENTRY(space, spaceList, LosVmSpace, node) {
if (space == LOS_GetKVmSpace()) {
spaceList = LOS_GetVmSpaceList();//获取虚拟空间链表,上面挂了所有虚拟空间
LOS_DL_LIST_FOR_EACH_ENTRY(space, spaceList, LosVmSpace, node) {//遍历链表
if (space == LOS_GetKVmSpace()) {//内核空间不统计
continue;
}
OsUProcessPmUsage(space, NULL, &pmTmp);
UProcessUsed += pmTmp;
OsUProcessPmUsage(space, NULL, &pmTmp);//统计用户空间物理内存的使用情况
UProcessUsed += pmTmp;//用户空间物理内存叠加
}
/* Kernel dynamic memory, include extended heap memory */
/* Kernel dynamic memory, include extended heap memory */ //内核动态内存,包括扩展堆内存
memUsed += ((usedCount << PAGE_SHIFT) - UProcessUsed);
/* Remaining heap memory */
/* Remaining heap memory */ //剩余堆内存
memUsed -= freeMem;
*actualPm = memUsed;
}
//shell task 物理内存的使用情况
VOID OsShellCmdProcessPmUsage(LosVmSpace *space, UINT32 *sharePm, UINT32 *actualPm)
{
if (space == NULL) {
......@@ -182,10 +182,10 @@ VOID OsShellCmdProcessPmUsage(LosVmSpace *space, UINT32 *sharePm, UINT32 *actual
return;
}
if (space == LOS_GetKVmSpace()) {
OsKProcessPmUsage(space, actualPm);
} else {
OsUProcessPmUsage(space, sharePm, actualPm);
if (space == LOS_GetKVmSpace()) {//内核空间
OsKProcessPmUsage(space, actualPm);//内核空间物理内存使用情况统计
} else {//用户空间
OsUProcessPmUsage(space, sharePm, actualPm);//用户空间物理内存使用情况统计
}
}
......
......@@ -130,8 +130,8 @@ extern "C" {
* Count the CPU usage structures of all processs.
*/
typedef struct tagCpupInfo {
UINT16 usStatus; /**< Save the cur process status */
UINT32 uwUsage; /**< Usage. The value range is [0,1000]. */
UINT16 usStatus; /**< Save the cur process status */ //保存当前进程的状态
UINT32 uwUsage; /**< Usage. The value range is [0,1000]. */ //CPU的使用率
} CPUP_INFO_S;
/**
......
......@@ -30,12 +30,12 @@
*/
#include "shcmd.h"
//shell help 命令
UINT32 OsShellCmdHelp(UINT32 argc, const CHAR **argv)
{
UINT32 loop = 0;
CmdItemNode *curCmdItem = NULL;
CmdModInfo *cmdInfo = OsCmdInfoGet();
CmdModInfo *cmdInfo = OsCmdInfoGet();//获取命令链表
(VOID)argv;
if (argc > 0) {
......@@ -44,11 +44,11 @@ UINT32 OsShellCmdHelp(UINT32 argc, const CHAR **argv)
}
PRINTK("*******************shell commands:*************************\n");
LOS_DL_LIST_FOR_EACH_ENTRY(curCmdItem, &(cmdInfo->cmdList.list), CmdItemNode, list) {
LOS_DL_LIST_FOR_EACH_ENTRY(curCmdItem, &(cmdInfo->cmdList.list), CmdItemNode, list) {//循环链表
if ((loop & (8 - 1)) == 0) { /* 8 - 1:just align print */
PRINTK("\n");
}
PRINTK("%-12s ", curCmdItem->cmd->cmdKey);
PRINTK("%-12s ", curCmdItem->cmd->cmdKey);//打印 ls 这类命令
loop++;
}
......
git add -A
git commit -m 'Shell的本质是向外界提供一个窗口窥视内核,SHELLCMD_ENTRY(l, cmdType, cmdKey, paraNum, cmdHook)为shell静态注册命令方式
git commit -m 'shell 定时器,任务,系统信息 代码注释,Shell的本质是向外界提供一个窗口窥视内核.
鸿蒙内核源码分析系列 【 CSDN | OSCHINA | WIKI 】
鸿蒙内核源码注释中文版 【 CSDN仓 | Gitee仓 | Github仓 | Coding仓 】四大仓库每日同步更新代码和wiki
项目给鸿蒙内核源码逐行加上中文注解,详细阐述框架和代码细节, 精读 HarmonyOS 内核源码, 将迅速拔高对计算机整体理解,从此高屋建瓴看问题.'
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册