http://weharmonyos.com 上线

    百万汉字注解 + 百篇博客分析 => 挖透鸿蒙内核源码
    博客输出站点(国内):https://weharmonyos.comhttp://8.134.122.205
    博客输出站点(国外):https://weharmony.github.io
    注解文件系统:https://gitee.com/weharmony/third_party_NuttX
    注解协议栈:https://gitee.com/weharmony/third_party_lwip
上级 1431d631
此差异已折叠。
...@@ -49,6 +49,7 @@ ...@@ -49,6 +49,7 @@
case (name): \ case (name): \
return (val) return (val)
//uname命令用于显示当前操作系统的名称,版本创建时间,系统名称,版本信息等
int uname(struct utsname *name) int uname(struct utsname *name)
{ {
INT32 ret; INT32 ret;
......
...@@ -239,7 +239,7 @@ static mode_t fatfs_get_mode(BYTE attribute, mode_t fs_mode) ...@@ -239,7 +239,7 @@ static mode_t fatfs_get_mode(BYTE attribute, mode_t fs_mode)
} }
return fs_mode; return fs_mode;
} }
//类型转换
static enum VnodeType fatfstype_2_vnodetype(BYTE type) { static enum VnodeType fatfstype_2_vnodetype(BYTE type) {
switch (type) { switch (type) {
case AM_ARC: case AM_ARC:
...@@ -355,7 +355,7 @@ static int fatfs_create_obj(struct Vnode *parent, const char *name, int mode, st ...@@ -355,7 +355,7 @@ static int fatfs_create_obj(struct Vnode *parent, const char *name, int mode, st
FRESULT result; FRESULT result;
int ret; int ret;
if ((type != AM_ARC) && (type != AM_DIR) && (type != AM_LNK)) { if ((type != AM_ARC) && (type != AM_DIR) && (type != AM_LNK)) {//文件类型
result = FR_INVALID_NAME; result = FR_INVALID_NAME;
goto ERROR_EXIT; goto ERROR_EXIT;
} }
......
...@@ -74,10 +74,6 @@ JFFS2分区在“spinor”上使用,而“nand”是提供给YAFFS2使用的 ...@@ -74,10 +74,6 @@ JFFS2分区在“spinor”上使用,而“nand”是提供给YAFFS2使用的
第二个参数表示起始地址,第三个参数表示分区大小,这两个参数都以16进制的形式传入。 第二个参数表示起始地址,第三个参数表示分区大小,这两个参数都以16进制的形式传入。
最后一个参数表示分区号,有效值为0~19。 最后一个参数表示分区号,有效值为0~19。
*************************************************************/ *************************************************************/
#ifdef LOSCFG_FS_JFFS #ifdef LOSCFG_FS_JFFS
...@@ -88,8 +84,8 @@ struct file_operations_vfs g_jffs2Fops;//vfs接口实现 ...@@ -88,8 +84,8 @@ struct file_operations_vfs g_jffs2Fops;//vfs接口实现
static LosMux g_jffs2FsLock; /* lock for all jffs2 ops *///操作 jffs2文件系统锁 static LosMux g_jffs2FsLock; /* lock for all jffs2 ops *///操作 jffs2文件系统锁
static pthread_mutex_t g_jffs2NodeLock = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; static pthread_mutex_t g_jffs2NodeLock = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
struct Vnode *g_jffs2PartList[CONFIG_MTD_PATTITION_NUM];//分区列表 struct Vnode *g_jffs2PartList[CONFIG_MTD_PATTITION_NUM];//jffs2 分区列表
//设置vnode节点的文件类型
static void Jffs2SetVtype(struct jffs2_inode *node, struct Vnode *pVnode) static void Jffs2SetVtype(struct jffs2_inode *node, struct Vnode *pVnode)
{ {
switch (node->i_mode & S_IFMT) { switch (node->i_mode & S_IFMT) {
...@@ -217,7 +213,7 @@ int VfsJffs2Lookup(struct Vnode *parentVnode, const char *path, int len, struct ...@@ -217,7 +213,7 @@ int VfsJffs2Lookup(struct Vnode *parentVnode, const char *path, int len, struct
LOS_MuxLock(&g_jffs2FsLock, (uint32_t)JFFS2_WAITING_FOREVER); LOS_MuxLock(&g_jffs2FsLock, (uint32_t)JFFS2_WAITING_FOREVER);
parentNode = (struct jffs2_inode *)parentVnode->data; parentNode = (struct jffs2_inode *)parentVnode->data;//获取私有数据
node = jffs2_lookup(parentNode, (const unsigned char *)path, len); node = jffs2_lookup(parentNode, (const unsigned char *)path, len);
if (!node) { if (!node) {
LOS_MuxUnlock(&g_jffs2FsLock); LOS_MuxUnlock(&g_jffs2FsLock);
......
...@@ -151,20 +151,22 @@ struct IATTR; ...@@ -151,20 +151,22 @@ struct IATTR;
由于 vnode 是对所有设备的一个抽象,因此不同类型的设备,他们的操作方法也不一样, 由于 vnode 是对所有设备的一个抽象,因此不同类型的设备,他们的操作方法也不一样,
因此 vop ,fop 都是接口, data 因设备不同而不同. 因此 vop ,fop 都是接口, data 因设备不同而不同.
如果底层是磁盘存储,Inode结构会保存到磁盘。当需要时从磁盘读取到内存中进行缓存。
*/ */
struct Vnode { struct Vnode {//vnode并不包含文件名,因为 vnode和文件名是 1:N 的关系
enum VnodeType type; /* vnode type */ //节点类型 (文件|目录|链接...) enum VnodeType type; /* vnode type */ //节点类型 (文件|目录|链接...)
int useCount; /* ref count of users *///节点引用(链接)数,即有多少文件名指向这个vnode,即上层理解的硬链接数 int useCount; /* ref count of users *///节点引用(链接)数,即有多少文件名指向这个vnode,即上层理解的硬链接数
uint32_t hash; /* vnode hash */ //节点哈希值 uint32_t hash; /* vnode hash */ //节点哈希值
uint uid; /* uid for dac */ //DAC用户ID uint uid; /* uid for dac */ //文件拥有者的User ID
uint gid; /* gid for dac */ //DAC用户组ID uint gid; /* gid for dac */ //文件的Group ID
mode_t mode; /* mode for dac */ //DAC的模式 mode_t mode; /* mode for dac */ //chmod 文件的读、写、执行权限
LIST_HEAD parentPathCaches; /* pathCaches point to parents */ //指向父级路径缓存,上面的都是当了爸爸节点 LIST_HEAD parentPathCaches; /* pathCaches point to parents */ //指向父级路径缓存,上面的都是当了爸爸节点
LIST_HEAD childPathCaches; /* pathCaches point to children */ //指向子级路径缓存,上面都是当了别人儿子的节点 LIST_HEAD childPathCaches; /* pathCaches point to children */ //指向子级路径缓存,上面都是当了别人儿子的节点
struct Vnode *parent; /* parent vnode */ //父节点 struct Vnode *parent; /* parent vnode */ //父节点
struct VnodeOps *vop; /* vnode operations */ //以 Vnode 方式操作数据(接口实现|驱动程序) struct VnodeOps *vop; /* vnode operations */ //以 Vnode 方式操作数据(接口实现|驱动程序)
struct file_operations_vfs *fop; /* file operations */ //以 file 方式操作数据(接口实现|驱动程序) struct file_operations_vfs *fop; /* file operations */ //以 file 方式操作数据(接口实现|驱动程序)
void *data; /* private data */ //指向每种具体设备私有的成员,例如 ( drv_data | nfsnode | ....) void *data; /* private data */ //文件数据block的位置,指向每种具体设备私有的成员,例如 ( drv_data | nfsnode | ....)
uint32_t flag; /* vnode flag */ //节点标签 uint32_t flag; /* vnode flag */ //节点标签
LIST_ENTRY hashEntry; /* list entry for bucket in hash table */ //通过它挂入哈希表 g_vnodeHashEntrys[i], i:[0,g_vnodeHashMask] LIST_ENTRY hashEntry; /* list entry for bucket in hash table */ //通过它挂入哈希表 g_vnodeHashEntrys[i], i:[0,g_vnodeHashMask]
LIST_ENTRY actFreeEntry; /* vnode active/free list entry */ //通过本节点挂到空闲链表和使用链表上 LIST_ENTRY actFreeEntry; /* vnode active/free list entry */ //通过本节点挂到空闲链表和使用链表上
...@@ -178,6 +180,7 @@ struct Vnode { ...@@ -178,6 +180,7 @@ struct Vnode {
struct VnodeOps { struct VnodeOps {
int (*Create)(struct Vnode *parent, const char *name, int mode, struct Vnode **vnode);//创建节点 int (*Create)(struct Vnode *parent, const char *name, int mode, struct Vnode **vnode);//创建节点
int (*Lookup)(struct Vnode *parent, const char *name, int len, struct Vnode **vnode);//查询节点 int (*Lookup)(struct Vnode *parent, const char *name, int len, struct Vnode **vnode);//查询节点
//Lookup向底层文件系统查找获取inode信息
int (*Open)(struct Vnode *vnode, int fd, int mode, int flags);//打开节点 int (*Open)(struct Vnode *vnode, int fd, int mode, int flags);//打开节点
int (*Close)(struct Vnode *vnode);//关闭节点 int (*Close)(struct Vnode *vnode);//关闭节点
int (*Reclaim)(struct Vnode *vnode);//回收节点 int (*Reclaim)(struct Vnode *vnode);//回收节点
......
...@@ -72,7 +72,7 @@ https://www.cnblogs.com/hoys/archive/2012/08/19/2646377.html ...@@ -72,7 +72,7 @@ https://www.cnblogs.com/hoys/archive/2012/08/19/2646377.html
#define SIGUSR2 12 //用户自定义信号2 #define SIGUSR2 12 //用户自定义信号2
#define SIGPIPE 13 //向某个非读管道中写入数据 #define SIGPIPE 13 //向某个非读管道中写入数据
#define SIGALRM 14 //由alarm(2)发出的信号,默认行为为进程终止 #define SIGALRM 14 //由alarm(2)发出的信号,默认行为为进程终止
#define SIGTERM 15 //终止信号 #define SIGTERM 15 //终止信号, kill不带参数时默认发送这个信号
#define SIGSTKFLT 16 //栈溢出 #define SIGSTKFLT 16 //栈溢出
#define SIGCHLD 17 //子进程结束信号 #define SIGCHLD 17 //子进程结束信号
#define SIGCONT 18 //进程继续(曾被停止的进程) #define SIGCONT 18 //进程继续(曾被停止的进程)
......
...@@ -50,24 +50,24 @@ extern "C" { ...@@ -50,24 +50,24 @@ extern "C" {
typedef BOOL (*CmdVerifyTransID)(UINT32 transID); typedef BOOL (*CmdVerifyTransID)(UINT32 transID);
typedef struct { typedef struct {//命令项
CmdType cmdType; CmdType cmdType;
const CHAR *cmdKey; const CHAR *cmdKey; //按键
UINT32 paraNum; UINT32 paraNum; //参数个数
CmdCallBackFunc cmdHook; CmdCallBackFunc cmdHook; //回调函数
} CmdItem; } CmdItem;
typedef struct { typedef struct { //命令节点
LOS_DL_LIST list; LOS_DL_LIST list;
CmdItem *cmd; CmdItem *cmd;
} CmdItemNode; } CmdItemNode;
/* global info for shell module */ /* global info for shell module */
typedef struct { typedef struct {//shell 模块的全局信息
CmdItemNode cmdList; CmdItemNode cmdList;
UINT32 listNum; UINT32 listNum;//节点数量
UINT32 initMagicFlag; UINT32 initMagicFlag;//初始魔法标签 0xABABABAB
LosMux muxLock; LosMux muxLock; //操作链表互斥锁
CmdVerifyTransID transIdHook; CmdVerifyTransID transIdHook;
} CmdModInfo; } CmdModInfo;
......
...@@ -44,7 +44,7 @@ ...@@ -44,7 +44,7 @@
#define SHELL_INIT_MAGIC_FLAG 0xABABABAB #define SHELL_INIT_MAGIC_FLAG 0xABABABAB
#define CTRL_C 0x03 /* 0x03: ctrl+c ASCII */ #define CTRL_C 0x03 /* 0x03: ctrl+c ASCII */
STATIC CmdModInfo g_cmdInfo; STATIC CmdModInfo g_cmdInfo;//命令模块信息,上面挂了所有的命令项目
LOS_HAL_TABLE_BEGIN(g_shellcmd, shellcmd); LOS_HAL_TABLE_BEGIN(g_shellcmd, shellcmd);
LOS_HAL_TABLE_END(g_shellcmdEnd, shellcmd); LOS_HAL_TABLE_END(g_shellcmdEnd, shellcmd);
...@@ -494,7 +494,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsCmdKeyShift(const CHAR *cmdKey, CHAR *cmdOut, UI ...@@ -494,7 +494,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsCmdKeyShift(const CHAR *cmdKey, CHAR *cmdOut, UI
return LOS_OK; return LOS_OK;
} }
//类型变量命名,必须是数字字母下划线,首字母不能是数字
LITE_OS_SEC_TEXT_MINOR BOOL OsCmdKeyCheck(const CHAR *cmdKey) LITE_OS_SEC_TEXT_MINOR BOOL OsCmdKeyCheck(const CHAR *cmdKey)
{ {
const CHAR *temp = cmdKey; const CHAR *temp = cmdKey;
...@@ -733,7 +733,7 @@ END: ...@@ -733,7 +733,7 @@ END:
(VOID)pthread_mutex_unlock(&shellCB->historyMutex); (VOID)pthread_mutex_unlock(&shellCB->historyMutex);
return; return;
} }
//执行命令,shell是运行程序的程序.
LITE_OS_SEC_TEXT_MINOR UINT32 OsCmdExec(CmdParsed *cmdParsed, CHAR *cmdStr) LITE_OS_SEC_TEXT_MINOR UINT32 OsCmdExec(CmdParsed *cmdParsed, CHAR *cmdStr)
{ {
UINT32 ret; UINT32 ret;
...@@ -746,7 +746,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsCmdExec(CmdParsed *cmdParsed, CHAR *cmdStr) ...@@ -746,7 +746,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsCmdExec(CmdParsed *cmdParsed, CHAR *cmdStr)
return (UINT32)OS_ERROR; return (UINT32)OS_ERROR;
} }
ret = OsCmdParse(cmdStr, cmdParsed); ret = OsCmdParse(cmdStr, cmdParsed);//解析命令
if (ret != LOS_OK) { if (ret != LOS_OK) {
goto OUT; goto OUT;
} }
...@@ -762,7 +762,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsCmdExec(CmdParsed *cmdParsed, CHAR *cmdStr) ...@@ -762,7 +762,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsCmdExec(CmdParsed *cmdParsed, CHAR *cmdStr)
} }
ret = OS_ERROR; ret = OS_ERROR;
if (cmdHook != NULL) { if (cmdHook != NULL) {//执行命令,即回调函数
ret = (cmdHook)(cmdParsed->paramCnt, (const CHAR **)cmdParsed->paramArray); ret = (cmdHook)(cmdParsed->paramCnt, (const CHAR **)cmdParsed->paramArray);
} }
...@@ -776,26 +776,26 @@ OUT: ...@@ -776,26 +776,26 @@ OUT:
return (UINT32)ret; return (UINT32)ret;
} }
//命令初始化
LITE_OS_SEC_TEXT_MINOR UINT32 OsCmdInit(VOID) LITE_OS_SEC_TEXT_MINOR UINT32 OsCmdInit(VOID)
{ {
UINT32 ret; UINT32 ret;
LOS_ListInit(&(g_cmdInfo.cmdList.list)); LOS_ListInit(&(g_cmdInfo.cmdList.list));//初始化双向链表
g_cmdInfo.listNum = 0; g_cmdInfo.listNum = 0; //命令数量
g_cmdInfo.initMagicFlag = SHELL_INIT_MAGIC_FLAG; g_cmdInfo.initMagicFlag = SHELL_INIT_MAGIC_FLAG;//魔法数字
ret = LOS_MuxInit(&g_cmdInfo.muxLock, NULL); ret = LOS_MuxInit(&g_cmdInfo.muxLock, NULL);//初始化互斥量,确保链表安全访问
if (ret != LOS_OK) { if (ret != LOS_OK) {
PRINT_ERR("Create mutex for shell cmd info failed\n"); PRINT_ERR("Create mutex for shell cmd info failed\n");
return OS_ERROR; return OS_ERROR;
} }
return LOS_OK; return LOS_OK;
} }
//创建一个命令项
STATIC UINT32 OsCmdItemCreate(CmdType cmdType, const CHAR *cmdKey, UINT32 paraNum, CmdCallBackFunc cmdProc) STATIC UINT32 OsCmdItemCreate(CmdType cmdType, const CHAR *cmdKey, UINT32 paraNum, CmdCallBackFunc cmdProc)
{ {
CmdItem *cmdItem = NULL; CmdItem *cmdItem = NULL;
CmdItemNode *cmdItemNode = NULL; CmdItemNode *cmdItemNode = NULL;
//1.构造命令节点过程
cmdItem = (CmdItem *)LOS_MemAlloc(m_aucSysMem0, sizeof(CmdItem)); cmdItem = (CmdItem *)LOS_MemAlloc(m_aucSysMem0, sizeof(CmdItem));
if (cmdItem == NULL) { if (cmdItem == NULL) {
return OS_ERRNO_SHELL_CMDREG_MEMALLOC_ERROR; return OS_ERRNO_SHELL_CMDREG_MEMALLOC_ERROR;
...@@ -813,28 +813,28 @@ STATIC UINT32 OsCmdItemCreate(CmdType cmdType, const CHAR *cmdKey, UINT32 paraNu ...@@ -813,28 +813,28 @@ STATIC UINT32 OsCmdItemCreate(CmdType cmdType, const CHAR *cmdKey, UINT32 paraNu
cmdItemNode->cmd->paraNum = paraNum; cmdItemNode->cmd->paraNum = paraNum;
cmdItemNode->cmd->cmdType = cmdType; cmdItemNode->cmd->cmdType = cmdType;
cmdItemNode->cmd->cmdKey = cmdKey; cmdItemNode->cmd->cmdKey = cmdKey;
//2.完成构造后挂入全局链表
(VOID)LOS_MuxLock(&g_cmdInfo.muxLock, LOS_WAIT_FOREVER); (VOID)LOS_MuxLock(&g_cmdInfo.muxLock, LOS_WAIT_FOREVER);
OsCmdAscendingInsert(cmdItemNode); OsCmdAscendingInsert(cmdItemNode);//按升序方式插入
g_cmdInfo.listNum++; g_cmdInfo.listNum++;//命令总数增加
(VOID)LOS_MuxUnlock(&g_cmdInfo.muxLock); (VOID)LOS_MuxUnlock(&g_cmdInfo.muxLock);
return LOS_OK; return LOS_OK;
} }
/* open API */ /* open API */ //注册命令至全局
LITE_OS_SEC_TEXT_MINOR UINT32 osCmdReg(CmdType cmdType, const CHAR *cmdKey, UINT32 paraNum, CmdCallBackFunc cmdProc) LITE_OS_SEC_TEXT_MINOR UINT32 osCmdReg(CmdType cmdType, const CHAR *cmdKey, UINT32 paraNum, CmdCallBackFunc cmdProc)
{ {
CmdItemNode *cmdItemNode = NULL; CmdItemNode *cmdItemNode = NULL;
(VOID)LOS_MuxLock(&g_cmdInfo.muxLock, LOS_WAIT_FOREVER); (VOID)LOS_MuxLock(&g_cmdInfo.muxLock, LOS_WAIT_FOREVER);//1.确保先拿到锁
if (g_cmdInfo.initMagicFlag != SHELL_INIT_MAGIC_FLAG) { if (g_cmdInfo.initMagicFlag != SHELL_INIT_MAGIC_FLAG) { //验证全局变量的有效性
(VOID)LOS_MuxUnlock(&g_cmdInfo.muxLock); (VOID)LOS_MuxUnlock(&g_cmdInfo.muxLock);
PRINT_ERR("[%s] shell is not yet initialized!\n", __FUNCTION__); PRINT_ERR("[%s] shell is not yet initialized!\n", __FUNCTION__);
return OS_ERRNO_SHELL_NOT_INIT; return OS_ERRNO_SHELL_NOT_INIT;
} }
(VOID)LOS_MuxUnlock(&g_cmdInfo.muxLock); (VOID)LOS_MuxUnlock(&g_cmdInfo.muxLock);
//2.参数检查
if ((cmdProc == NULL) || (cmdKey == NULL) || if ((cmdProc == NULL) || (cmdKey == NULL) ||
(cmdType >= CMD_TYPE_BUTT) || (strlen(cmdKey) >= CMD_KEY_LEN) || !strlen(cmdKey)) { (cmdType >= CMD_TYPE_BUTT) || (strlen(cmdKey) >= CMD_KEY_LEN) || !strlen(cmdKey)) {
return OS_ERRNO_SHELL_CMDREG_PARA_ERROR; return OS_ERRNO_SHELL_CMDREG_PARA_ERROR;
...@@ -845,11 +845,11 @@ LITE_OS_SEC_TEXT_MINOR UINT32 osCmdReg(CmdType cmdType, const CHAR *cmdKey, UINT ...@@ -845,11 +845,11 @@ LITE_OS_SEC_TEXT_MINOR UINT32 osCmdReg(CmdType cmdType, const CHAR *cmdKey, UINT
return OS_ERRNO_SHELL_CMDREG_PARA_ERROR; return OS_ERRNO_SHELL_CMDREG_PARA_ERROR;
} }
} }
//3.按键检查
if (OsCmdKeyCheck(cmdKey) != TRUE) { if (OsCmdKeyCheck(cmdKey) != TRUE) {
return OS_ERRNO_SHELL_CMDREG_CMD_ERROR; return OS_ERRNO_SHELL_CMDREG_CMD_ERROR;
} }
//4.遍历链表节点,验证是否命令存在
(VOID)LOS_MuxLock(&g_cmdInfo.muxLock, LOS_WAIT_FOREVER); (VOID)LOS_MuxLock(&g_cmdInfo.muxLock, LOS_WAIT_FOREVER);
LOS_DL_LIST_FOR_EACH_ENTRY(cmdItemNode, &(g_cmdInfo.cmdList.list), CmdItemNode, list) { LOS_DL_LIST_FOR_EACH_ENTRY(cmdItemNode, &(g_cmdInfo.cmdList.list), CmdItemNode, list) {
if ((cmdType == cmdItemNode->cmd->cmdType) && if ((cmdType == cmdItemNode->cmd->cmdType) &&
...@@ -860,7 +860,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 osCmdReg(CmdType cmdType, const CHAR *cmdKey, UINT ...@@ -860,7 +860,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 osCmdReg(CmdType cmdType, const CHAR *cmdKey, UINT
} }
} }
(VOID)LOS_MuxUnlock(&g_cmdInfo.muxLock); (VOID)LOS_MuxUnlock(&g_cmdInfo.muxLock);
//5.正式创建命令,挂入链表
return OsCmdItemCreate(cmdType, cmdKey, paraNum, cmdProc); return OsCmdItemCreate(cmdType, cmdKey, paraNum, cmdProc);
} }
...@@ -202,13 +202,13 @@ LITE_OS_SEC_TEXT_MINOR VOID ShellCmdLineParse(CHAR c, pf_OUTPUT outputFunc, Shel ...@@ -202,13 +202,13 @@ LITE_OS_SEC_TEXT_MINOR VOID ShellCmdLineParse(CHAR c, pf_OUTPUT outputFunc, Shel
shellCB->shellKeyType = STAT_NOMAL_KEY; shellCB->shellKeyType = STAT_NOMAL_KEY;
} }
//获取shell消息类型
LITE_OS_SEC_TEXT_MINOR UINT32 ShellMsgTypeGet(CmdParsed *cmdParsed, const CHAR *cmdType) LITE_OS_SEC_TEXT_MINOR UINT32 ShellMsgTypeGet(CmdParsed *cmdParsed, const CHAR *cmdType)
{ {
CmdItemNode *curCmdItem = (CmdItemNode *)NULL; CmdItemNode *curCmdItem = (CmdItemNode *)NULL;
UINT32 len; UINT32 len;
UINT32 minLen; UINT32 minLen;
CmdModInfo *cmdInfo = OsCmdInfoGet(); CmdModInfo *cmdInfo = OsCmdInfoGet();//获取全局变量
if ((cmdParsed == NULL) || (cmdType == NULL)) { if ((cmdParsed == NULL) || (cmdType == NULL)) {
return OS_INVALID; return OS_INVALID;
...@@ -217,7 +217,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 ShellMsgTypeGet(CmdParsed *cmdParsed, const CHAR * ...@@ -217,7 +217,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 ShellMsgTypeGet(CmdParsed *cmdParsed, const CHAR *
len = strlen(cmdType); len = strlen(cmdType);
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 ((len == strlen(curCmdItem->cmd->cmdKey)) && if ((len == strlen(curCmdItem->cmd->cmdKey)) &&
(strncmp((CHAR *)(curCmdItem->cmd->cmdKey), cmdType, len) == 0)) { (strncmp((CHAR *)(curCmdItem->cmd->cmdKey), cmdType, len) == 0)) {//先比较
minLen = (len < CMD_KEY_LEN) ? len : CMD_KEY_LEN; minLen = (len < CMD_KEY_LEN) ? len : CMD_KEY_LEN;
(VOID)memcpy_s((CHAR *)(cmdParsed->cmdKeyword), CMD_KEY_LEN, cmdType, minLen); (VOID)memcpy_s((CHAR *)(cmdParsed->cmdKeyword), CMD_KEY_LEN, cmdType, minLen);
cmdParsed->cmdType = curCmdItem->cmd->cmdType; cmdParsed->cmdType = curCmdItem->cmd->cmdType;
......
...@@ -46,7 +46,9 @@ ...@@ -46,7 +46,9 @@
#endif #endif
#include "user_copy.h" #include "user_copy.h"
//这里放的是一些不好归类(或称杂项)的系统调用
//uname命令用于显示当前操作系统的名称,版本创建时间,系统名称,版本信息等
int SysUname(struct utsname *name) int SysUname(struct utsname *name)
{ {
int ret; int ret;
...@@ -65,7 +67,7 @@ int SysUname(struct utsname *name) ...@@ -65,7 +67,7 @@ int SysUname(struct utsname *name)
} }
return ret; return ret;
} }
//系统信息
int SysInfo(struct sysinfo *info) int SysInfo(struct sysinfo *info)
{ {
int ret; int ret;
...@@ -102,7 +104,7 @@ int SysReboot(int magic, int magic2, int type) ...@@ -102,7 +104,7 @@ int SysReboot(int magic, int magic2, int type)
#ifdef LOSCFG_SHELL #ifdef LOSCFG_SHELL
int SysShellExec(const char *msgName, const char *cmdString) int SysShellExec(const char *msgName, const char *cmdString)
{ {//执行 shell 命令
int ret; int ret;
unsigned int uintRet; unsigned int uintRet;
errno_t err; errno_t err;
...@@ -110,10 +112,10 @@ int SysShellExec(const char *msgName, const char *cmdString) ...@@ -110,10 +112,10 @@ int SysShellExec(const char *msgName, const char *cmdString)
char msgNameDup[CMD_KEY_LEN + 1] = { 0 }; char msgNameDup[CMD_KEY_LEN + 1] = { 0 };
char cmdStringDup[CMD_MAX_LEN + 1] = { 0 }; char cmdStringDup[CMD_MAX_LEN + 1] = { 0 };
if (!IsCapPermit(CAP_SHELL_EXEC)) { if (!IsCapPermit(CAP_SHELL_EXEC)) {//1.先鉴权
return -EPERM; return -EPERM;
} }
//2.由内核栈空间接走用户空间的参数,注意还是同一个任务,只是从任务的用户空间移到内核栈.
ret = LOS_StrncpyFromUser(msgNameDup, msgName, CMD_KEY_LEN + 1); ret = LOS_StrncpyFromUser(msgNameDup, msgName, CMD_KEY_LEN + 1);
if (ret < 0) { if (ret < 0) {
return -EFAULT; return -EFAULT;
...@@ -132,13 +134,13 @@ int SysShellExec(const char *msgName, const char *cmdString) ...@@ -132,13 +134,13 @@ int SysShellExec(const char *msgName, const char *cmdString)
if (err != EOK) { if (err != EOK) {
return -EFAULT; return -EFAULT;
} }
//获取消息类型
uintRet = ShellMsgTypeGet(&cmdParsed, msgNameDup); uintRet = ShellMsgTypeGet(&cmdParsed, msgNameDup);
if (uintRet != LOS_OK) { if (uintRet != LOS_OK) {
PRINTK("%s:command not found\n", msgNameDup); PRINTK("%s:command not found\n", msgNameDup);
return -EFAULT; return -EFAULT;
} else { } else {
(void)OsCmdExec(&cmdParsed, (char *)cmdStringDup); (void)OsCmdExec(&cmdParsed, (char *)cmdStringDup);//执行shell命令,回调命令注册时的 函数指针
} }
return 0; return 0;
......
...@@ -100,7 +100,7 @@ int SysMprotect(void *vaddr, size_t len, int prot) ...@@ -100,7 +100,7 @@ int SysMprotect(void *vaddr, size_t len, int prot)
return LOS_DoMprotect((uintptr_t)vaddr, len, (unsigned long)prot); return LOS_DoMprotect((uintptr_t)vaddr, len, (unsigned long)prot);
} }
/************************************************** /**************************************************
brk也是申请堆内存的一种方式,一般小于 128K 会使用它
**************************************************/ **************************************************/
void *SysBrk(void *addr) void *SysBrk(void *addr)
{ {
......
git add -A git add -A
git commit -m ' 因同步导致的注解覆盖还原. git commit -m ' http://weharmonyos.com 上线
百万汉字注解 + 百篇博客分析 => 挖透鸿蒙内核源码 百万汉字注解 + 百篇博客分析 => 挖透鸿蒙内核源码
博客输出站点(国内):https://weharmonyos.com 或 http://8.134.122.205 博客输出站点(国内):https://weharmonyos.com 或 http://8.134.122.205
博客输出站点(国外):https://weharmony.github.io 博客输出站点(国外):https://weharmony.github.io
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册