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

shell 物理内存,虚拟内存,VDSO,文件操作 部分注释说明

鸿蒙内核源码分析系列 【 CSDN | OSCHINA | WIKI 】
鸿蒙内核源码注释中文版 【 CSDN仓 | Gitee仓 | Github仓 | Coding仓 】四大仓库每日同步更新代码和wiki
项目给鸿蒙内核源码逐行加上中文注解,详细阐述框架和代码细节, 精读 HarmonyOS 内核源码, 将迅速拔高对计算机整体理解,从此高屋建瓴看问题.
上级 5088fcb3
......@@ -219,7 +219,10 @@ int osShellCmdDoCatShow(UINTPTR arg)
(void)pthread_mutex_unlock(&g_mutex_cat);
return 0;
}
/*****************************************************************
cat用于显示文本文件的内容。cat [pathname]
cat weharmony.txt
*****************************************************************/
int osShellCmdCat(int argc, const char **argv)
{
char *fullpath = NULL;
......@@ -299,11 +302,25 @@ static unsigned long get_mountflags(const char *options)
return mountfalgs;
}
static inline void print_mount_usage(void)
static inline void print_mount_usage(void)//mount 用法
{
PRINTK("mount [DEVICE] [PATH] [NAME]\n");
}
/*****************************************************************
命令功能
mount命令用来将设备挂载到指定目录。
命令格式
mount <device> <path> <name> [uid gid]
device 要挂载的设备(格式为设备所在路径)。系统拥有的设备。
path 指定目录。用户必须具有指定目录中的执行(搜索)许可权。N/A
name 文件系统的种类。 vfat, yaffs, jffs, ramfs, nfs,procfs, romfs.
uid gid uid是指用户ID。 gid是指组ID。可选参数,缺省值uid:0,gid:0。
使用指南
mount后加需要挂载的设备信息、指定目录以及设备文件格式,就能成功挂载文件系统到指定目录。
使用实例
举例:mount /dev/mmcblk0p0 /bin/vs/sd vfat
*****************************************************************/
int osShellCmdMount(int argc, const char **argv)
{
int ret;
......@@ -436,7 +453,18 @@ int osShellCmdMount(int argc, const char **argv)
free(fullpath);
return 0;
}
/*****************************************************************
命令功能
umount命令用来卸载指定文件系统。
命令格式
umount [dir]
参数说明
dir 需要卸载文件系统对应的目录。 系统已挂载的文件系统的目录。
使用指南
umount后加上需要卸载的指定文件系统的目录,即将指定文件系统卸载。
使用实例
举例:mount /bin/vs/sd
*****************************************************************/
int osShellCmdUmount(int argc, const char **argv)
{
int ret;
......@@ -485,7 +513,20 @@ int osShellCmdUmount(int argc, const char **argv)
PRINTK("umount ok\n");
return 0;
}
/*****************************************************************
命令功能
mkdir命令用来创建一个目录。
命令格式
mkdir [directory]
参数说明
directory 需要创建的目录。
使用指南
mkdir后加所需要创建的目录名会在当前目录下创建目录。
mkdir后加路径,再加上需要创建的目录名,即在指定目录下创建目录。
使用实例
举例:mkdir harmony
*****************************************************************/
int osShellCmdMkdir(int argc, const char **argv)
{
int ret;
......@@ -511,7 +552,14 @@ int osShellCmdMkdir(int argc, const char **argv)
free(fullpath);
return 0;
}
/*****************************************************************
命令功能
pwd命令用来显示当前路径。
命令格式
使用指南
pwd 命令将当前目录的全路径名称(从根目录)写入标准输出。全部目录使用 / (斜线)分隔。第一个 / 表示根目录, 最后一个目录是当前目录。
*****************************************************************/
int osShellCmdPwd(int argc, const char **argv)
{
char buf[SHOW_MAX_LEN] = {0};
......@@ -546,7 +594,7 @@ int osShellCmdPwd(int argc, const char **argv)
return 0;
}
static inline void print_statfs_usage(void)
static inline void print_statfs_usage(void)//statfs 用法
{
PRINTK("Usage :\n");
PRINTK(" statfs <path>\n");
......@@ -554,7 +602,17 @@ static inline void print_statfs_usage(void)
PRINTK("Example:\n");
PRINTK(" statfs /ramfs\n");
}
/*****************************************************************
命令功能
statfs命令用来打印文件系统的信息,如该文件系统类型、总大小、可用大小等信息。
命令格式
statfs [directory]
参数说明
directory 文件系统的路径。 必须是存在的文件系统,并且其支持statfs命令,当前支持的文件系统有:JFFS2,FAT,NFS。
使用指南
打印信息因文件系统而异。
以nfs文件系统为例: statfs /nfs
*****************************************************************/
int osShellCmdStatfs(int argc, const char **argv)
{
struct statfs sfs;
......@@ -596,7 +654,12 @@ int osShellCmdStatfs(int argc, const char **argv)
return 0;
}
/*****************************************************************
touch命令用来在指定的目录下创建一个不存在的空文件。
touch命令操作已存在的文件会成功,不会更新时间戳。touch [filename]
touch命令用来创建一个空文件,该文件可读写。
使用touch命令一次只能创建一个文件。
*****************************************************************/
int osShellCmdTouch(int argc, const char **argv)
{
int ret;
......@@ -630,6 +693,20 @@ int osShellCmdTouch(int argc, const char **argv)
#define CP_BUF_SIZE 4096
pthread_mutex_t g_mutex_cp = PTHREAD_MUTEX_INITIALIZER;
/*****************************************************************
cp 拷贝文件,创建一份副本。
cp [SOURCEFILE] [DESTFILE]
使用指南
同一路径下,源文件与目的文件不能重名。
源文件必须存在,且不为目录。
源文件路径支持“*”和“?”通配符,“*”代表任意多个字符,“?”代表任意单个字符。目的路径不支持通配符。当源路径可匹配多个文件时,目的路径必须为目录。
目的路径为目录时,该目录必须存在。此时目的文件以源文件命名。
目的路径为文件时,所在目录必须存在。此时拷贝文件的同时为副本重命名。
目前不支持多文件拷贝。参数大于2个时,只对前2个参数进行操作。
目的文件不存在时创建新文件,已存在则覆盖。
拷贝系统重要资源时,会对系统造成死机等重大未知影响,如用于拷贝/dev/uartdev-0 文件时,会产生系统卡死现象。
举例:cp weharmony.txt ./tmp/
*****************************************************************/
static int os_shell_cmd_do_cp(const char *src_filepath, const char *dst_filename)
{
int ret;
......@@ -799,7 +876,17 @@ errout_with_srcpath:
/* The separator and EOF for a directory fullpath: '/'and '\0' */
#define SEPARATOR_EOF_LEN 2
/*****************************************************************
rmdir命令用来删除一个目录。
rmdir [dir]
dir 需要删除目录的名称,删除目录必须为空,支持输入路径。
使用指南
rmdir命令只能用来删除目录。
rmdir一次只能删除一个目录。
rmdir只能删除空目录。
举例:输入rmdir dir
*****************************************************************/
static int os_shell_cmd_do_rmdir(const char *pathname)
{
struct dirent *dirent = NULL;
......@@ -1230,11 +1317,17 @@ errout_with_srcpath:
return VFS_ERROR;
}
static inline void print_rm_usage(void)
static inline void print_rm_usage(void)//rm 使用方法
{
PRINTK("rm [FILE] or rm [-r/-R] [FILE]\n");
}
/*****************************************************************
rm命令用来删除文件或文件夹。rm [-r] [dirname / filename]
rm命令一次只能删除一个文件或文件夹。
rm -r命令可以删除非空目录。
rm log1.txt ; rm -r sd
*****************************************************************/
int osShellCmdRm(int argc, const char **argv)
{
int ret = 0;
......@@ -1362,7 +1455,13 @@ int checkNum(const char *arg)
}
return 0;
}
/*****************************************************************
shell su 用于变更为其他使用者的身份
su [uid] [gid]
su命令缺省切换到root用户,uid默认为0,gid为0。
在su命令后的输入参数uid和gid就可以切换到该uid和gid的用户。
输入参数超出范围时,会打印提醒输入正确范围参数。
*****************************************************************/
int osShellCmdSu(int argc, const char **argv)
{
unsigned int su_uid;
......@@ -1388,12 +1487,16 @@ int osShellCmdSu(int argc, const char **argv)
(su_gid > 60000), PRINTK("uid_num or gid_num out of range!they should be [0~60000]\n"), return -1);
}
SysSetUserID(su_uid);
SysSetGroupID(su_gid);
SysSetUserID(su_uid);//设置用户ID
SysSetGroupID(su_gid);//设置用户群组ID
return 0;
}
/****************************************************************
shell chmod 用于修改文件操作权限。chmod [mode] [pathname]
mode 文件或文件夹权限,用8进制表示对应User、Group、及Other(拥有者、群组、其他组)的权限。[0,777]
pathname 文件路径。已存在的文件。
chmod 777 weharmony.txt
****************************************************************/
int osShellCmdChmod(int argc, const char **argv)
{
int i = 0;
......@@ -1445,7 +1548,16 @@ int osShellCmdChmod(int argc, const char **argv)
free(fullpath);
return 0;
}
/****************************************************************
shell chown 用于将指定文件的拥有者改为指定的用户或组。chown [owner] [group] [pathname]
owner 文件拥有者。[0,0xFFFFFFFF]
group 文件群组。1、为空。2、[0,0xFFFFFFFF]
pathname 文件路径。已存在的文件。
在需要修改的文件名前加上文件拥有者和文件群组就可以分别修改该文件的拥有者和群组。
当owner或group值为-1时则表示对应的owner或group不修改。
group参数可以为空。
举例:chown 100 200 weharmony.txt
****************************************************************/
int osShellCmdChown(int argc, const char **argv)
{
int ret;
......@@ -1502,7 +1614,13 @@ int osShellCmdChown(int argc, const char **argv)
free(fullpath);
return 0;
}
/****************************************************************
chgrp用于修改文件的群组。chgrp [group] [pathname]
group 文件群组。[0,0xFFFFFFFF]
pathname 文件路径。 已存在的文件。
在需要修改的文件名前加上文件群组值就可以修改该文件的所属组。
举例:chgrp 100 weharmony.txt
****************************************************************/
int osShellCmdChgrp(int argc, const char **argv)
{
int ret;
......
......@@ -176,7 +176,7 @@ typedef struct VmSpace {
#define VM_MAP_REGION_FLAG_DATA (1<<11) //data数据区 编译在ELF中
#define VM_MAP_REGION_FLAG_TEXT (1<<12) //代码区
#define VM_MAP_REGION_FLAG_BSS (1<<13) //bbs数据区 由运行时动态分配
#define VM_MAP_REGION_FLAG_VDSO (1<<14) //虚拟动态链接对象(Virtual Dynamically Shared Object、vDSO
#define VM_MAP_REGION_FLAG_VDSO (1<<14) //VDSO(Virtual Dynamically-lined Shared Object)由内核提供的虚拟.so文件,它不在磁盘上,而在内核里,内核将其映射到一个地址空间中,被所有程序共享,正文段大小为一个页面。
#define VM_MAP_REGION_FLAG_MMAP (1<<15) //映射区
#define VM_MAP_REGION_FLAG_SHM (1<<16) //共享内存区,和代码区同级概念,意思是整个线性区被贴上共享标签
#define VM_MAP_REGION_FLAG_INVALID (1<<17) /* indicates that flags are not specified */
......
......@@ -247,16 +247,16 @@ static void SigProcessLoadTcb(struct ProcessSignalInfo *info, siginfo_t *sigInfo
{
LosTaskCB *tcb = NULL;
if (info->awakenedTcb == NULL && info->receivedTcb == NULL) {
if (info->unblockedTcb) {
tcb = info->unblockedTcb;
} else if (info->defaultTcb) {
if (info->awakenedTcb == NULL && info->receivedTcb == NULL) {//信号即没有指定接收task 也没有指定被唤醒task
if (info->unblockedTcb) {//如果进程信号信息体中有阻塞task
tcb = info->unblockedTcb;//
} else if (info->defaultTcb) {//如果有默认的发送方task
tcb = info->defaultTcb;
} else {
return;
}
/* Deliver the signal to the selected task */
(void)OsTcbDispatch(tcb, sigInfo);
(void)OsTcbDispatch(tcb, sigInfo);//向所选任务发送信号
}
}
//给参数进程发送参数信号
......
......@@ -166,6 +166,15 @@ DONE:
return 0;
}
/*********************************************************
text 表示代码段大小。
data 表示数据段大小。
rodata 表示只读数据段大小。
bss 表示未初始化全局变量占用内存大小。
*********************************************************/
LITE_OS_SEC_TEXT_MINOR STATIC VOID OsShellCmdSectionInfo(INT32 argc, const CHAR *argv[])
{
size_t textLen = &__text_end - &__text_start;
......@@ -184,7 +193,14 @@ LITE_OS_SEC_TEXT_MINOR STATIC VOID OsShellCmdSectionInfo(INT32 argc, const CHAR
PRINTK("Mem: %-9lu %-10lu %-10lu %-10lu\n", textLen, dataLen, rodataLen, bssLen);
}
}
/*********************************************************
total 表示系统动态内存池总量。
used 表示已使用内存总量。
free 表示未被分配的内存大小。
heap 表示已分配堆大小。
*********************************************************/
LITE_OS_SEC_TEXT_MINOR STATIC UINT32 OsShellCmdFreeInfo(INT32 argc, const CHAR *argv[])
{
#ifdef LOSCFG_EXC_INTERACTION
......@@ -238,17 +254,18 @@ LITE_OS_SEC_TEXT_MINOR STATIC UINT32 OsShellCmdFreeInfo(INT32 argc, const CHAR *
}
return 0;
}
//free命令可显示系统内存的使用情况,同时显示系统的text段、data段、rodata段、bss段大小。
//free [-k | -m] 以KB为单位显示 / 以MB为单位显示
LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdFree(INT32 argc, const CHAR *argv[])
{
if (argc > 1) {
PRINTK("\nUsage: free or free [-k/-m]\n");
return OS_ERROR;
}
if (OsShellCmdFreeInfo(argc, argv) != 0) {
if (OsShellCmdFreeInfo(argc, argv) != 0) {//剩余内存统计
return OS_ERROR;
}
OsShellCmdSectionInfo(argc, argv);
OsShellCmdSectionInfo(argc, argv);//显示系统各段使用情况
return 0;
}
......@@ -318,21 +335,21 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdMemRecordDisable(INT32 argc, const CHAR
}
SHELLCMD_ENTRY(memshowenable_shellcmd, CMD_TYPE_EX, "memshowenable", 0,
(CmdCallBackFunc)OsShellCmdMemRecordEnable);//采用shell命令静态注册方式
(CmdCallBackFunc)OsShellCmdMemRecordEnable);//shell memshowenable 命令静态注册方式
SHELLCMD_ENTRY(memshowdisable_shellcmd, CMD_TYPE_EX, "memshowdisable", 0,
(CmdCallBackFunc)OsShellCmdMemRecordDisable);//采用shell命令静态注册方式
(CmdCallBackFunc)OsShellCmdMemRecordDisable);//shell memshowdisable命令静态注册方式
#endif
#ifdef LOSCFG_MEM_LEAKCHECK
SHELLCMD_ENTRY(memused_shellcmd, CMD_TYPE_EX, "memused", 0, (CmdCallBackFunc)OsShellCmdMemUsed);//采用shell命令静态注册方式
SHELLCMD_ENTRY(memused_shellcmd, CMD_TYPE_EX, "memused", 0, (CmdCallBackFunc)OsShellCmdMemUsed);//shell memused 命令静态注册方式
#endif
#ifdef LOSCFG_SHELL_CMD_DEBUG
SHELLCMD_ENTRY(memcheck_shellcmd, CMD_TYPE_EX, "memcheck", 0, (CmdCallBackFunc)OsShellCmdMemCheck);//采用shell命令静态注册方式
SHELLCMD_ENTRY(readreg_shellcmd, CMD_TYPE_EX, "readreg", MEMPT_ARG_NUM_2, (CmdCallBackFunc)OsShellCmdMemRead);//采用shell命令静态注册方式
SHELLCMD_ENTRY(memcheck_shellcmd, CMD_TYPE_EX, "memcheck", 0, (CmdCallBackFunc)OsShellCmdMemCheck);//shell memcheck 命令静态注册方式
SHELLCMD_ENTRY(readreg_shellcmd, CMD_TYPE_EX, "readreg", MEMPT_ARG_NUM_2, (CmdCallBackFunc)OsShellCmdMemRead);//shell readreg 命令静态注册方式
#endif
SHELLCMD_ENTRY(free_shellcmd, CMD_TYPE_EX, "free", XARGS, (CmdCallBackFunc)OsShellCmdFree);//采用shell命令静态注册方式
SHELLCMD_ENTRY(uname_shellcmd, CMD_TYPE_EX, "uname", XARGS, (CmdCallBackFunc)OsShellCmdUname);//采用shell命令静态注册方式
SHELLCMD_ENTRY(free_shellcmd, CMD_TYPE_EX, "free", XARGS, (CmdCallBackFunc)OsShellCmdFree);//shell free 命令静态注册方式
SHELLCMD_ENTRY(uname_shellcmd, CMD_TYPE_EX, "uname", XARGS, (CmdCallBackFunc)OsShellCmdUname);//shell uname命令静态注册方式
#endif
#ifdef __cplusplus
......
......@@ -105,26 +105,26 @@ LITE_OS_SEC_TEXT_MINOR VOID OsDoDumpVm(pid_t pid)
PRINTK("\tThe process [%d] not active\n", pid);
}
}
//查看进程的虚拟内存使用情况。vmm [-a / -h / --help], vmm [pid]
LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdDumpVm(INT32 argc, const CHAR *argv[])
{
if (argc == 0) {
if (argc == 0) { //没有参数 使用 # vmm 查看所有进程使用虚拟内存的情况
OsDumpAllAspace();
} else if (argc == 1) {
pid_t pid = OsPid(argv[0]);
if (strcmp(argv[0], "-a") == 0) {
if (strcmp(argv[0], "-a") == 0) { //# vmm -a 查看所有进程使用虚拟内存的情况
OsDumpAllAspace();
} else if (strcmp(argv[0], "-k") == 0) {
} else if (strcmp(argv[0], "-k") == 0) {//# vmm -k 查看内核进程使用虚拟内存的情况
OsDumpKernelAspace();
} else if (pid >= 0) {
} else if (pid >= 0) { //# vmm 3 查看3号进程使用虚拟内存的情况
OsDoDumpVm(pid);
} else if (strcmp(argv[0], "-h") == 0 || strcmp(argv[0], "--help") == 0) {
} else if (strcmp(argv[0], "-h") == 0 || strcmp(argv[0], "--help") == 0) { //# vmm -h 或者 vmm --help
OsPrintUsage();
} else {
PRINTK("%s: invalid option: %s\n", VMM_CMD, argv[0]);
PRINTK("%s: invalid option: %s\n", VMM_CMD, argv[0]); //格式错误,输出规范格式
OsPrintUsage();
}
} else {
} else { //多于一个参数 例如 # vmm 3 9
OsPrintUsage();
}
......@@ -136,7 +136,7 @@ LITE_OS_SEC_TEXT_MINOR VOID V2PPrintUsage(VOID)
PRINTK("pid vaddr(0x1000000~0x3e000000), print physical address of virtual address\n"
"-h | --help, print v2p command usage\n");
}
//v2p 虚拟内存对应的物理内存
LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdV2P(INT32 argc, const CHAR *argv[])
{
UINT32 vaddr;
......@@ -181,7 +181,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdV2P(INT32 argc, const CHAR *argv[])
return LOS_OK;
}
//查看系统内存物理页及pagecache物理页使用情况 , Debug版本才具备的命令 # pmm
LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdDumpPmm(VOID)
{
OsVmPhysDump();
......@@ -191,12 +191,13 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdDumpPmm(VOID)
LITE_OS_SEC_TEXT_MINOR VOID OomPrintUsage(VOID)
{
PRINTK("\t-i [interval], set oom check interval (ms)\n"
"\t-m [mem byte], set oom low memory threshold (Byte)\n"
"\t-r [mem byte], set page cache reclaim memory threshold (Byte)\n"
"\t-h | --help, print vmm command usage\n");
PRINTK("\t-i [interval], set oom check interval (ms)\n" //设置oom线程任务检查的时间间隔。
"\t-m [mem byte], set oom low memory threshold (Byte)\n" //设置低内存阈值。
"\t-r [mem byte], set page cache reclaim memory threshold (Byte)\n" //设置pagecache内存回收阈值。
"\t-h | --help, print vmm command usage\n"); //使用帮助。
}
//查看和设置低内存阈值以及pagecache内存回收阈值。参数缺省时,显示oom功能当前配置信息。
//当系统内存不足时,会打印出内存不足的提示信息。
LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdOom(INT32 argc, const CHAR *argv[])
{
UINT32 lowMemThreshold;
......@@ -218,7 +219,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdOom(INT32 argc, const CHAR *argv[])
PRINTK("[oom] low mem threshold %s(byte) invalid.\n", argv[1]);
return OS_ERROR;
} else {
OomSetLowMemThreashold(lowMemThreshold);
OomSetLowMemThreashold(lowMemThreshold);//设置低内存阈值
}
} else if (strcmp(argv[0], "-i") == 0) {
checkInterval = strtoul((CHAR *)argv[1], &endPtr, 0);
......@@ -226,7 +227,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdOom(INT32 argc, const CHAR *argv[])
PRINTK("[oom] check interval %s(us) invalid.\n", argv[1]);
return OS_ERROR;
} else {
OomSetCheckInterval(checkInterval);
OomSetCheckInterval(checkInterval);//设置oom线程任务检查的时间间隔
}
} else if (strcmp(argv[0], "-r") == 0) {
reclaimMemThreshold = strtoul((CHAR *)argv[1], &endPtr, 0);
......@@ -234,7 +235,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdOom(INT32 argc, const CHAR *argv[])
PRINTK("[oom] reclaim mem threshold %s(byte) invalid.\n", argv[1]);
return OS_ERROR;
} else {
OomSetReclaimMemThreashold(reclaimMemThreshold);
OomSetReclaimMemThreashold(reclaimMemThreshold);//设置pagecache内存回收阈值
}
} else {
PRINTK("%s: invalid option: %s %s\n", OOM_CMD, argv[0], argv[1]);
......@@ -250,8 +251,8 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsShellCmdOom(INT32 argc, const CHAR *argv[])
#ifdef LOSCFG_SHELL_CMD_DEBUG
SHELLCMD_ENTRY(oom_shellcmd, CMD_TYPE_SHOW, OOM_CMD, 2, (CmdCallBackFunc)OsShellCmdOom);//采用shell命令静态注册方式
SHELLCMD_ENTRY(vm_shellcmd, CMD_TYPE_SHOW, VMM_CMD, 1, (CmdCallBackFunc)OsShellCmdDumpVm);//采用shell命令静态注册方式
SHELLCMD_ENTRY(v2p_shellcmd, CMD_TYPE_SHOW, VMM_PMM_CMD, 1, (CmdCallBackFunc)OsShellCmdV2P);//采用shell命令静态注册方式
SHELLCMD_ENTRY(vm_shellcmd, CMD_TYPE_SHOW, VMM_CMD, 1, (CmdCallBackFunc)OsShellCmdDumpVm);//采用shell命令静态注册方式 vmm
SHELLCMD_ENTRY(v2p_shellcmd, CMD_TYPE_SHOW, VMM_PMM_CMD, 1, (CmdCallBackFunc)OsShellCmdV2P);//采用shell命令静态注册方式 v2p
#endif
#ifdef LOSCFG_SHELL
......
......@@ -53,7 +53,7 @@ extern "C" {
#define FLAG_SIZE 4
#define FLAG_START 2
//获取线性区的名称或文件路径
const CHAR *OsGetRegionNameOrFilePath(LosVmMapRegion *region)
{
struct file *filep = NULL;
......@@ -64,17 +64,17 @@ const CHAR *OsGetRegionNameOrFilePath(LosVmMapRegion *region)
filep = region->unTypeData.rf.file;
return filep->f_path;
#endif
} else if (region->regionFlags & VM_MAP_REGION_FLAG_HEAP) {
} else if (region->regionFlags & VM_MAP_REGION_FLAG_HEAP) {//堆区
return "HEAP";
} else if (region->regionFlags & VM_MAP_REGION_FLAG_STACK) {
} else if (region->regionFlags & VM_MAP_REGION_FLAG_STACK) {//栈区
return "STACK";
} else if (region->regionFlags & VM_MAP_REGION_FLAG_TEXT) {
} else if (region->regionFlags & VM_MAP_REGION_FLAG_TEXT) {//文本区
return "Text";
} else if (region->regionFlags & VM_MAP_REGION_FLAG_VDSO) {
} else if (region->regionFlags & VM_MAP_REGION_FLAG_VDSO) {//虚拟动态链接对象区(Virtual Dynamically Shared Object、VDSO)
return "VDSO";
} else if (region->regionFlags & VM_MAP_REGION_FLAG_MMAP) {
} else if (region->regionFlags & VM_MAP_REGION_FLAG_MMAP) {//映射区
return "MMAP";
} else if (region->regionFlags & VM_MAP_REGION_FLAG_SHM) {
} else if (region->regionFlags & VM_MAP_REGION_FLAG_SHM) {//共享区
return "SHM";
} else {
return "";
......@@ -188,7 +188,7 @@ VOID OsShellCmdProcessPmUsage(LosVmSpace *space, UINT32 *sharePm, UINT32 *actual
OsUProcessPmUsage(space, sharePm, actualPm);//用户空间物理内存使用情况统计
}
}
//虚拟空间物理内存的使用情况,参数同时带走共享物理内存 sharePm和actualPm 单位是字节
VOID OsUProcessPmUsage(LosVmSpace *space, UINT32 *sharePm, UINT32 *actualPm)
{
LosVmMapRegion *region = NULL;
......@@ -223,23 +223,23 @@ VOID OsUProcessPmUsage(LosVmSpace *space, UINT32 *sharePm, UINT32 *actualPm)
continue;
}
shareRef = LOS_AtomicRead(&page->refCounts);
shareRef = LOS_AtomicRead(&page->refCounts);//ref 大于1 说明page被其他空间也引用了,这就是共享内存核心定义!
if (shareRef > 1) {
if (sharePm != NULL) {
*sharePm += PAGE_SIZE;
*sharePm += PAGE_SIZE;//一页 4K 字节
}
if (actualPm != NULL) {
*actualPm += PAGE_SIZE / shareRef;
*actualPm += PAGE_SIZE / shareRef;//这个就有点意思了,碰到共享内存的情况,平分!哈哈。。。
}
} else {
if (actualPm != NULL) {
*actualPm += PAGE_SIZE;
*actualPm += PAGE_SIZE;//算自己的
}
}
}
RB_SCAN_SAFE_END(&oldVmSpace->regionRbTree, pstRbNode, pstRbNodeNext)
}
//通过虚拟空间获取进程实体
LosProcessCB *OsGetPIDByAspace(LosVmSpace *space)
{
UINT32 pid;
......@@ -247,13 +247,13 @@ LosProcessCB *OsGetPIDByAspace(LosVmSpace *space)
LosProcessCB *processCB = NULL;
SCHEDULER_LOCK(intSave);
for (pid = 0; pid < g_processMaxNum; ++pid) {
for (pid = 0; pid < g_processMaxNum; ++pid) {//循环进程池,进程池本质是个数组
processCB = g_processCBArray + pid;
if (OsProcessIsUnused(processCB)) {
continue;
if (OsProcessIsUnused(processCB)) {//进程还没被分配使用
continue;//继续找呗
}
if (processCB->vmSpace == space) {
if (processCB->vmSpace == space) {//找到了
SCHEDULER_UNLOCK(intSave);
return processCB;
}
......@@ -261,7 +261,7 @@ LosProcessCB *OsGetPIDByAspace(LosVmSpace *space)
SCHEDULER_UNLOCK(intSave);
return NULL;
}
//统计虚拟空间中某个线性区的页数
UINT32 OsCountRegionPages(LosVmSpace *space, LosVmMapRegion *region, UINT32 *pssPages)
{
UINT32 regionPages = 0;
......@@ -295,7 +295,7 @@ UINT32 OsCountRegionPages(LosVmSpace *space, LosVmMapRegion *region, UINT32 *pss
return regionPages;
}
//统计虚拟空间的总页数
UINT32 OsCountAspacePages(LosVmSpace *space)
{
UINT32 spacePages = 0;
......@@ -379,27 +379,30 @@ VOID OsDumpRegion2(LosVmSpace *space, LosVmMapRegion *region)
region->range.size, flagsStr, regionPages, pssPages);
(VOID)LOS_MemFree(m_aucSysMem0, flagsStr);
}
//dump 指定虚拟空间的信息
VOID OsDumpAspace(LosVmSpace *space)
{
LosVmMapRegion *region = NULL;
LosRbNode *pstRbNode = NULL;
LosRbNode *pstRbNodeNext = NULL;
UINT32 spacePages;
LosProcessCB *pcb = OsGetPIDByAspace(space);//找到进程
LosProcessCB *pcb = OsGetPIDByAspace(space);//通过虚拟空间找到进程实体
if (pcb == NULL) {
return;
}
spacePages = OsCountAspacePages(space);
//进程ID | 进程虚拟内存控制块地址信息 | 虚拟内存起始地址 | 虚拟内存大小 | 已使用的物理页数量
spacePages = OsCountAspacePages(space);//获取空间的页数
PRINTK("\r\n PID aspace name base size pages \n");
PRINTK(" ---- ------ ---- ---- ----- ----\n");
PRINTK(" %-4d %#010x %-10.10s %#010x %#010x %d\n", pcb->processID, space, pcb->processName,
space->base, space->size, spacePages);
PRINTK("\r\n\t region name base size mmu_flags pages pg/ref\n");
//虚拟区间控制块地址信息 | 虚拟区间类型 | 虚拟区间起始地址 | 虚拟区间大小 | 虚拟区间mmu映射属性 | 已使用的物理页数量(包括共享内存部分 | 已使用的物理页数量
PRINTK("\r\n\t region name base size mmu_flags pages pg/ref\n");
PRINTK("\t ------ ---- ---- ---- --------- ----- -----\n");
RB_SCAN_SAFE(&space->regionRbTree, pstRbNode, pstRbNodeNext)
RB_SCAN_SAFE(&space->regionRbTree, pstRbNode, pstRbNodeNext)//按region 轮询统计
region = (LosVmMapRegion *)pstRbNode;
if (region != NULL) {
OsDumpRegion2(space, region);
......@@ -410,14 +413,14 @@ VOID OsDumpAspace(LosVmSpace *space)
RB_SCAN_SAFE_END(&space->regionRbTree, pstRbNode, pstRbNodeNext)
return;
}
//查看所有进程使用虚拟内存的情况
VOID OsDumpAllAspace(VOID)
{
LosVmSpace *space = NULL;
LOS_DL_LIST *aspaceList = LOS_GetVmSpaceList();//获取所有空间链表
LOS_DL_LIST_FOR_EACH_ENTRY(space, aspaceList, LosVmSpace, node) {
LOS_DL_LIST_FOR_EACH_ENTRY(space, aspaceList, LosVmSpace, node) {//循环取出进程虚拟空间
(VOID)LOS_MuxAcquire(&space->regionMux);
OsDumpAspace(space);
OsDumpAspace(space);//dump 空间
(VOID)LOS_MuxRelease(&space->regionMux);
}
return;
......@@ -436,7 +439,7 @@ STATUS_T OsRegionOverlapCheck(LosVmSpace *space, LosVmMapRegion *region)
(VOID)LOS_MuxRelease(&space->regionMux);
return ret;
}
//dump 页表项
VOID OsDumpPte(VADDR_T vaddr)
{
UINT32 l1Index = vaddr >> MMU_DESCRIPTOR_L1_SMALL_SHIFT;
......@@ -462,7 +465,7 @@ VOID OsDumpPte(VADDR_T vaddr)
goto ERR;
}
PRINTK("vaddr %p, l1Index %d, ttEntry %p, l2Table %p, l2Index %d, pfn %p count %d\n",
vaddr, l1Index, ttEntry, l2Table, l2Index, l2Table[l2Index], LOS_AtomicRead(&page->refCounts));//打印,
vaddr, l1Index, ttEntry, l2Table, l2Index, l2Table[l2Index], LOS_AtomicRead(&page->refCounts));//打印L1 L2 页表项
} else {//不在L1表
PRINTK("vaddr %p, l1Index %d, ttEntry %p\n", vaddr, l1Index, ttEntry);
}
......@@ -485,7 +488,18 @@ UINT32 OsVmPhySegPagesGet(LosVmPhysSeg *seg)
return segFreePages;
}
//dump 物理内存
/***********************************************************
* phys_seg:物理页控制块地址信息
* base:第一个物理页地址,即物理页内存起始地址
* size:物理页内存大小
* free_pages:空闲物理页数量
* active anon: pagecache中,活跃的匿名页数量
* inactive anon: pagecache中,不活跃的匿名页数量
* active file: pagecache中,活跃的文件页数量
* inactive file: pagecache中,不活跃的文件页数量
* pmm pages total:总的物理页数,used:已使用的物理页数,free:空闲的物理页数
************************************************************/
VOID OsVmPhysDump(VOID)
{
LosVmPhysSeg *seg = NULL;
......@@ -494,7 +508,7 @@ VOID OsVmPhysDump(VOID)
UINT32 totalPages = 0;
UINT32 segIndex;
for (segIndex = 0; segIndex < g_vmPhysSegNum; segIndex++) {
for (segIndex = 0; segIndex < g_vmPhysSegNum; segIndex++) {//循环取段
seg = &g_vmPhysSeg[segIndex];
if (seg->size > 0) {
segFreePages = OsVmPhySegPagesGet(seg);
......@@ -515,7 +529,7 @@ VOID OsVmPhysDump(VOID)
PRINTK("\n\rpmm pages: total = %u, used = %u, free = %u\n",
totalPages, (totalPages - totalFreePages), totalFreePages);
}
//获取物理内存的使用信息,两个参数接走数据
VOID OsVmPhysUsedInfoGet(UINT32 *usedCount, UINT32 *totalCount)
{
UINT32 index;
......@@ -528,12 +542,12 @@ VOID OsVmPhysUsedInfoGet(UINT32 *usedCount, UINT32 *totalCount)
*usedCount = 0;
*totalCount = 0;
for (index = 0; index < g_vmPhysSegNum; index++) {
for (index = 0; index < g_vmPhysSegNum; index++) {//循环取段
physSeg = &g_vmPhysSeg[index];
if (physSeg->size > 0) {
*totalCount += physSeg->size >> PAGE_SHIFT;
segFreePages = OsVmPhySegPagesGet(physSeg);
*usedCount += (*totalCount - segFreePages);
*totalCount += physSeg->size >> PAGE_SHIFT;//叠加段的总页数
segFreePages = OsVmPhySegPagesGet(physSeg);//获取段的剩余页数
*usedCount += (*totalCount - segFreePages);//叠加段的使用页数
}
}
}
......
......@@ -39,10 +39,10 @@
LITE_VDSO_DATAPAGE VdsoDataPage g_vdsoDataPage __attribute__((__used__));
STATIC size_t g_vdsoSize;
//初始化 虚拟动态链接对象区(Virtual Dynamically Shared Object、VDSO)
UINT32 OsInitVdso(VOID)
{
g_vdsoSize = &__vdso_text_end - &__vdso_data_start;
g_vdsoSize = &__vdso_text_end - &__vdso_data_start;//计算 vdso 大小
if (memcmp((CHAR *)(&__vdso_text_start), ELF_HEAD, ELF_HEAD_LEN)) {
PRINT_ERR("VDSO Init Failed!\n");
......@@ -50,7 +50,7 @@ UINT32 OsInitVdso(VOID)
}
return LOS_OK;
}
//映射VDSO区
STATIC INT32 OsMapVdso(LosVmSpace *space, size_t len, PADDR_T paddr, VADDR_T vaddr, UINT32 flag)
{
STATUS_T ret;
......@@ -67,7 +67,7 @@ STATIC INT32 OsMapVdso(LosVmSpace *space, size_t len, PADDR_T paddr, VADDR_T vad
}
return LOS_OK;
}
//加载 虚拟动态链接对象区(Virtual Dynamically Shared Object、VDSO)
vaddr_t OsLoadVdso(const LosProcessCB *processCB)
{
INT32 ret = -1;
......
......@@ -57,8 +57,8 @@
#include "netif/etharp.h"
#include "lwip/netif.h"
#define LWIP_SHELL_CMD_PING_RETRY_TIMES 4
#define LWIP_SHELL_CMD_PING_TIMEOUT 2000
#define LWIP_SHELL_CMD_PING_RETRY_TIMES 4 //shell ping 重复ping的次数
#define LWIP_SHELL_CMD_PING_TIMEOUT 2000 //ping timeout 单位毫秒 2秒
#define TRANSFER_MODE_BINARY 1
......
......@@ -1781,7 +1781,7 @@ static void ping_cmd(unsigned int p0, unsigned int p1, unsigned int p2, unsigned
ping_taskid = -1;
}
//shell ping 用于测试网络连接是否正常 ping_ [-n cnt_] [-w interval] [-l data_len]_ <IP>_
u32_t osShellPing(int argc, const char **argv)
{
int ret;
......@@ -1805,7 +1805,7 @@ u32_t osShellPing(int argc, const char **argv)
/* could add more param support */
while (argc > 0) {
if (strcmp("-n", argv[i]) == 0 && (argc > 1)) {
if (strcmp("-n", argv[i]) == 0 && (argc > 1)) {//执行的次数,不带本参数则默认为4次。
ret = atoi(argv[i + 1]);
if (ret <= 0) {
PRINTK("Ping count should be greater than 0 \n");
......@@ -1815,12 +1815,12 @@ u32_t osShellPing(int argc, const char **argv)
count_set = 1;
i += 2;
argc -= 2;
} else if (strcmp("-t", argv[i]) == 0) {
} else if (strcmp("-t", argv[i]) == 0) {//表示永久ping,直到使用ping -k杀死ping线程。
count = 0; /* ping forerver */
count_set = 1;
i++;
argc--;
} else if (strcmp("-w", argv[i]) == 0 && (argc > 1)) {
} else if (strcmp("-w", argv[i]) == 0 && (argc > 1)) {//发送两次ping包的时间间隔,单位毫秒。
ret = atoi(argv[i + 1]);
if (ret <= 0) {
PRINTK("Ping interval should be greater than 0 \n");
......@@ -1830,7 +1830,7 @@ u32_t osShellPing(int argc, const char **argv)
interval = ret;
i += 2;
argc -= 2;
} else if (strcmp("-l", argv[i]) == 0 && (argc > 1)) {
} else if (strcmp("-l", argv[i]) == 0 && (argc > 1)) {//ping包,即ICMP echo request报文的数据长度,不包含ICMP包头。
ret = atoi(argv[i + 1]);
if (ret < 0 || ret > (int)(LWIP_MAX_UDP_RAW_SEND_SIZE - sizeof(struct icmp_echo_hdr))) {
PRINTK("Ping data length error, should be in range of [0, %d] \n",
......@@ -1840,7 +1840,7 @@ u32_t osShellPing(int argc, const char **argv)
data_len = ret;
i += 2;
argc -= 2;
} else if (strcmp("-k", argv[i]) == 0) {
} else if (strcmp("-k", argv[i]) == 0) {//杀死ping线程,停止ping。
if (ping_taskid > 0) {
ping_kill = 1; /* stop the current ping task */
return LOS_OK;
......@@ -1867,7 +1867,7 @@ u32_t osShellPing(int argc, const char **argv)
goto ping_error;
}
#if LWIP_DNS
dst_ipaddr.addr = get_hostip(argv[i]);
dst_ipaddr.addr = get_hostip(argv[i]);//获取主机地址
#else /* LWIP_DNS */
dst_ipaddr.addr = inet_addr(argv[i]);
#endif /* LWIP_DNS */
......@@ -1877,22 +1877,22 @@ u32_t osShellPing(int argc, const char **argv)
return LOS_NOK;
}
/* start one task if ping forever or ping count greater than 60 */
/* start one task if ping forever or ping count greater than 60 *///如果ping永远或ping计数大于60,则启动一个任务
if (count == 0 || count > LWIP_SHELL_CMD_PING_RETRY_TIMES) {
if (ping_taskid > 0) {
if (ping_taskid > 0) {//Ping任务已经在运行,鸿蒙目前现在只支持一个
PRINTK("Ping task already running and only support one now\n");
return LOS_NOK;
}
stPingTask.pfnTaskEntry = (TSK_ENTRY_FUNC)ping_cmd;//线程的执行函数
stPingTask.uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE;//0x4000 = 16K
stPingTask.pcName = "ping_task";
stPingTask.pcName = "ping_task"; //ping task 名称
stPingTask.usTaskPrio = 8; /* higher than shell 优先级高于10,属于内核态进程*/
stPingTask.uwResved = LOS_TASK_STATUS_DETACHED;
stPingTask.auwArgs[0] = dst_ipaddr.addr; /* network order */
stPingTask.auwArgs[1] = count;
stPingTask.auwArgs[2] = interval;
stPingTask.auwArgs[3] = data_len;
ret = LOS_TaskCreate((UINT32 *)(&ping_taskid), &stPingTask);
ret = LOS_TaskCreate((UINT32 *)(&ping_taskid), &stPingTask);//创建任务,ping_taskid带出taskid
if (ret != LOS_OK) {
PRINTK("ping_task create failed 0x%08x.\n", ret);
count = LWIP_SHELL_CMD_PING_RETRY_TIMES;
......@@ -1911,11 +1911,11 @@ u32_t osShellPing(int argc, const char **argv)
return LOS_OK;
ping_error:
lwip_ping_usage();
lwip_ping_usage();//ping 的用法
return LOS_NOK;
}
#ifdef LOSCFG_SHELL
SHELLCMD_ENTRY(ping_shellcmd, CMD_TYPE_EX, "ping", XARGS, (CmdCallBackFunc)osShellPing);//采用shell命令静态注册方式
SHELLCMD_ENTRY(ping_shellcmd, CMD_TYPE_EX, "ping", XARGS, (CmdCallBackFunc)osShellPing);//shell ping 命令静态注册方式
#endif /* LOSCFG_SHELL */
#else /* LWIP_EXT_POLL_SUPPORT*/
......@@ -3856,7 +3856,7 @@ usage_sock:
#if defined(LOSCFG_SHELL_CMD_DEBUG) && defined(LWIP_DEBUG_INFO)
SHELLCMD_ENTRY(netdebug_shellcmd, CMD_TYPE_EX, "netdebug", XARGS, (CmdCallBackFunc)osShellNetDebug);//采用shell命令静态注册方式
#endif /* LOSCFG_SHELL_CMD_DEBUG && LWIP_DEBUG_INFO */
//ip 调试命令
u32_t osShellIpDebug(int argc, const char **argv)
{
u8_t i = 0;
......@@ -3988,7 +3988,7 @@ SHELLCMD_ENTRY(ipdebug_shellcmd, CMD_TYPE_EX, "ipdebug", XARGS, (CmdCallBackFunc
#endif
#ifdef LWIP_TESTBED
extern void cmd_reset(void);
//shell reboot 重启命令
void osShellReboot(int argc, const char **argv)
{
cmd_reset();
......
......@@ -31,39 +31,39 @@
#ifndef CAPABILITY_TYPE_H
#define CAPABILITY_TYPE_H
// posix capabilities
// posix capabilities //posix 接口能力
#define CAP_CHOWN 0
#define CAP_DAC_EXECUTE 1
#define CAP_DAC_WRITE 2
#define CAP_DAC_READ_SEARCH 3
#define CAP_FOWNER 4
#define CAP_KILL 5
#define CAP_SETGID 6
#define CAP_SETUID 7
#define CAP_KILL 5 //kill
#define CAP_SETGID 6 //设置用户组ID
#define CAP_SETUID 7 //设置用户ID
// socket capabilities
// socket capabilities //网络能力
#define CAP_NET_BIND_SERVICE 8
#define CAP_NET_BROADCAST 9
#define CAP_NET_ADMIN 10
#define CAP_NET_RAW 11
// fs capabilities
// fs capabilities //文件系统能力
#define CAP_FS_MOUNT 12
#define CAP_FS_FORMAT 13
// process capabilities
// process capabilities //进程调度能力,设置调度优先级
#define CAP_SCHED_SETPRIORITY 14
// time capabilities
// time capabilities //时间能力
#define CAP_SET_TIMEOFDAY 15
#define CAP_CLOCK_SETTIME 16
// process capabilities
// process capabilities //进程能力
#define CAP_CAPSET 17
// reboot capability
// reboot capability //重新启动功能
#define CAP_REBOOT 18
// self deined privileged syscalls
// self deined privileged syscalls //自定义特权系统调用
#define CAP_SHELL_EXEC 19
#endif
\ No newline at end of file
......@@ -753,7 +753,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OsCmdExec(CmdParsed *cmdParsed, CHAR *cmdStr)
return (UINT32)OS_ERROR;
}
ret = OsCmdParse(cmdStr, cmdParsed);
ret = OsCmdParse(cmdStr, cmdParsed);//解析cmd命令
if (ret != LOS_OK) {//解析错误,命令输错了.
goto OUT;
}
......
......@@ -714,7 +714,23 @@ INT32 LOS_DmesgToFile(CHAR *filename)
}
#endif
/****************************************************************
命令功能
dmesg命令用于控制内核dmesg缓存区。
命令格式
dmesg dmesg [-c/-C/-D/-E/-L/-U]
dmesg -s [size] dmesg -l [level dmesg > [fileA]
使用指南
该命令依赖于LOSCFG_SHELL_DMESG,使用时通过menuconfig在配置项中开启"Enable Shell dmesg":
Debug ---> Enable a Debug Version ---> Enable Shell ---> Enable Shell dmesg
dmesg参数缺省时,默认打印缓存区内容。各“ - ”选项不能混合使用。
写入文件需确保已挂载文件系统。
关闭串口打印会影响shell使用,建议先连接telnet再尝试关闭串口。
举例:输入dmesg > /usr/dmesg.log。
****************************************************************/
INT32 OsShellCmdDmesg(INT32 argc, const CHAR **argv)
{
if (argc == 1) {
......
......@@ -211,7 +211,23 @@ UINT32 OsWatchTaskCreate(WatchCB *watchItem)
}
return ret;
}
/*************************************************************
命令功能
watch命令用于周期性的监视一个命令的运行结果。
命令格式
watch
watch [-c/-n/-t/--count/--interval/-no-title/--over] [command]
-c / --count 命令执行的总次数。
-n / --interval 命令周期性执行的时间间隔(s)
-t / -no-title 关闭顶端的时间显示。
command 需要监测的命令。
--over 关闭当前监测指令。
使用指南
watch运行过程中可以执行watch --over结束本次watch命令。
输入举例:
watch -n 2 -c 6 task 总共有6次task命令打印,每次间隔2秒
*************************************************************/
UINT32 OsShellCmdWatch(UINT32 argc, const CHAR **argv)
{
WatchCB *watchItem = NULL;
......
......@@ -65,7 +65,7 @@ int SysUname(struct utsname *name)
}
return ret;
}
//exec命令属于shell内置命令,目前实现最基础的执行用户态程序的功能。
#ifdef LOSCFG_SHELL
int SysShellExec(const char *msgName, const char *cmdString)
{
......@@ -76,35 +76,35 @@ 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)) {//没有定义shell exec能力情况
return -EPERM;
}
ret = LOS_StrncpyFromUser(msgNameDup, msgName, CMD_KEY_LEN + 1);
ret = LOS_StrncpyFromUser(msgNameDup, msgName, CMD_KEY_LEN + 1);//将参数从用户空间拷贝到内核空间
if (ret < 0) {
return -EFAULT;
} else if (ret > CMD_KEY_LEN) {
return -ENAMETOOLONG;
}
ret = LOS_StrncpyFromUser(cmdStringDup, cmdString, CMD_MAX_LEN + 1);
ret = LOS_StrncpyFromUser(cmdStringDup, cmdString, CMD_MAX_LEN + 1);//将参数从用户空间拷贝到内核空间
if (ret < 0) {
return -EFAULT;
} else if (ret > CMD_MAX_LEN) {
return -ENAMETOOLONG;
}
err = memset_s(&cmdParsed, sizeof(CmdParsed), 0, sizeof(CmdParsed));
err = memset_s(&cmdParsed, sizeof(CmdParsed), 0, sizeof(CmdParsed));//命令解析器数据清0
if (err != EOK) {
return -EFAULT;
}
uintRet = ShellMsgTypeGet(&cmdParsed, msgNameDup);
uintRet = ShellMsgTypeGet(&cmdParsed, msgNameDup);//获取cmd类型 kill watch
if (uintRet != LOS_OK) {
PRINTK("%s:command not found\n", msgNameDup);
return -EFAULT;
} else {
(void)OsCmdExec(&cmdParsed, (char *)cmdStringDup);
(void)OsCmdExec(&cmdParsed, (char *)cmdStringDup);//执行程序 # exec helloworld
}
return 0;
......
......@@ -440,7 +440,7 @@ int SysGetRealEffSaveUserID(int *ruid, int *euid, int *suid)
int SysSetUserID(int uid)
{
#ifdef LOSCFG_SECURITY_CAPABILITY
#ifdef LOSCFG_SECURITY_CAPABILITY //安全能力宏
int ret = -EPERM;
unsigned int intSave;
......@@ -449,12 +449,12 @@ int SysSetUserID(int uid)
}
SCHEDULER_LOCK(intSave);
User *user = OsCurrUserGet();
if (IsCapPermit(CAP_SETUID)) {
user->userID = uid;
User *user = OsCurrUserGet();//获取当前用户
if (IsCapPermit(CAP_SETUID)) { //是否定义了设置用户ID的能力
user->userID = uid; //改变UID
user->effUserID = uid;
/* add process to a user */
} else if (user->userID != uid) {
} else if (user->userID != uid) { //
goto EXIT;
}
......
git add -A
git commit -m '任务和CP15协处理器寄存器代码注释,讲透 shell kill命令
git commit -m 'shell 物理内存,虚拟内存,VDSO,文件操作 部分注释说明
鸿蒙内核源码分析系列 【 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.
先完成此消息的编辑!
想要评论请 注册