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