开始注解容器模块

    鸿蒙研究站 | http://weharmonyos.com (国内)
              | https://weharmony.github.io (国外)
    论坛 | http://bbs.weharmonyos.com
    文档中心 | http://open.weharmonyos.com
    参考手册 | http://doxygen.weharmonyos.com
上级 6a7f4700
...@@ -35,11 +35,11 @@ ...@@ -35,11 +35,11 @@
STATIC Container g_rootContainer;//根容器 STATIC Container g_rootContainer;//根容器
STATIC ContainerLimit g_containerLimit;//所有类型容器上限 STATIC ContainerLimit g_containerLimit;//所有类型容器上限
STATIC Atomic g_containerCount = 0xF0000000U;//容器数量 STATIC Atomic g_containerCount = 0xF0000000U;//容器数量
#ifdef LOSCFG_USER_CONTAINER #ifdef LOSCFG_USER_CONTAINER
STATIC Credentials *g_rootCredentials = NULL; STATIC Credentials *g_rootCredentials = NULL;
#endif #endif
//获取一个容器 //分配一个容器
UINT32 OsAllocContainerID(VOID) UINT32 OsAllocContainerID(VOID)
{ {
return LOS_AtomicIncRet(&g_containerCount); return LOS_AtomicIncRet(&g_containerCount);
...@@ -57,7 +57,7 @@ VOID OsContainerInitSystemProcess(LosProcessCB *processCB) ...@@ -57,7 +57,7 @@ VOID OsContainerInitSystemProcess(LosProcessCB *processCB)
#endif #endif
return; return;
} }
//获取指定容器上限值
UINT32 OsGetContainerLimit(ContainerType type) UINT32 OsGetContainerLimit(ContainerType type)
{ {
switch (type) { switch (type) {
...@@ -368,7 +368,7 @@ CREATE_CONTAINER: ...@@ -368,7 +368,7 @@ CREATE_CONTAINER:
COPY_CONTAINERS: COPY_CONTAINERS:
return CopyContainers(flags, child, parent, processID); return CopyContainers(flags, child, parent, processID);
} }
//释放进程容器
VOID OsContainerFree(LosProcessCB *processCB) VOID OsContainerFree(LosProcessCB *processCB)
{ {
LOS_AtomicDec(&processCB->container->rc); LOS_AtomicDec(&processCB->container->rc);
......
...@@ -526,7 +526,7 @@ UINT32 OsInitRootPidContainer(PidContainer **pidContainer) ...@@ -526,7 +526,7 @@ UINT32 OsInitRootPidContainer(PidContainer **pidContainer)
SCHEDULER_UNLOCK(intSave); SCHEDULER_UNLOCK(intSave);
return LOS_OK; return LOS_OK;
} }
//从当前容器中获取父进程ID
UINT32 OsGetVpidFromCurrContainer(const LosProcessCB *processCB) UINT32 OsGetVpidFromCurrContainer(const LosProcessCB *processCB)
{ {
UINT32 vpid = processCB->processID; UINT32 vpid = processCB->processID;
......
...@@ -68,7 +68,7 @@ STATIC UtsContainer *CreateNewUtsContainer(UtsContainer *parent) ...@@ -68,7 +68,7 @@ STATIC UtsContainer *CreateNewUtsContainer(UtsContainer *parent)
{ {
UINT32 ret; UINT32 ret;
UINT32 size = sizeof(UtsContainer); UINT32 size = sizeof(UtsContainer);
UtsContainer *utsContainer = (UtsContainer *)LOS_MemAlloc(m_aucSysMem1, size); UtsContainer *utsContainer = (UtsContainer *)LOS_MemAlloc(m_aucSysMem1, size);//从内核动态内存分配
if (utsContainer == NULL) { if (utsContainer == NULL) {
return NULL; return NULL;
} }
...@@ -105,7 +105,7 @@ STATIC UINT32 CreateUtsContainer(LosProcessCB *child, LosProcessCB *parent) ...@@ -105,7 +105,7 @@ STATIC UINT32 CreateUtsContainer(LosProcessCB *child, LosProcessCB *parent)
SCHEDULER_UNLOCK(intSave); SCHEDULER_UNLOCK(intSave);
return LOS_OK; return LOS_OK;
} }
//初始化uts容器
UINT32 OsInitRootUtsContainer(UtsContainer **utsContainer) UINT32 OsInitRootUtsContainer(UtsContainer **utsContainer)
{ {
UINT32 intSave; UINT32 intSave;
......
...@@ -31,15 +31,15 @@ ...@@ -31,15 +31,15 @@
#include "los_info_pri.h" #include "los_info_pri.h"
#include "los_task_pri.h" #include "los_task_pri.h"
#include "los_vm_dump.h" #include "los_vm_dump.h"
//获取当前进程的父进程ID
STATIC UINT32 GetCurrParentPid(UINT32 pid, const LosProcessCB *processCB) STATIC UINT32 GetCurrParentPid(UINT32 pid, const LosProcessCB *processCB)
{ {
if (processCB->parentProcess == NULL) { if (processCB->parentProcess == NULL) {
return 0; return 0;
} }
#ifdef LOSCFG_PID_CONTAINER #ifdef LOSCFG_PID_CONTAINER //从容器中获取
if (pid == OS_USER_ROOT_PROCESS_ID) { if (pid == OS_USER_ROOT_PROCESS_ID) {//从这里可以看出 0号进程(kidle)是,1,2号进程的父进程
return 0; return 0;
} }
...@@ -49,7 +49,7 @@ STATIC UINT32 GetCurrParentPid(UINT32 pid, const LosProcessCB *processCB) ...@@ -49,7 +49,7 @@ STATIC UINT32 GetCurrParentPid(UINT32 pid, const LosProcessCB *processCB)
#endif #endif
return processCB->parentProcess->processID; return processCB->parentProcess->processID;
} }
//获取当前任务ID
STATIC INLINE UINT32 GetCurrTid(const LosTaskCB *taskCB) STATIC INLINE UINT32 GetCurrTid(const LosTaskCB *taskCB)
{ {
#ifdef LOSCFG_PID_CONTAINER #ifdef LOSCFG_PID_CONTAINER
......
...@@ -208,7 +208,7 @@ LITE_OS_SEC_TEXT WEAK VOID OsIdleTask(VOID) ...@@ -208,7 +208,7 @@ LITE_OS_SEC_TEXT WEAK VOID OsIdleTask(VOID)
VOID OsTaskInsertToRecycleList(LosTaskCB *taskCB) VOID OsTaskInsertToRecycleList(LosTaskCB *taskCB)
{ {
LOS_ListTailInsert(&g_taskRecycleList, &taskCB->pendList); LOS_ListTailInsert(&g_taskRecycleList, &taskCB->pendList);//将任务挂入回收链表,等待回收
} }
/*! /*!
...@@ -431,14 +431,14 @@ STATIC INLINE VOID OsInsertTCBToFreeList(LosTaskCB *taskCB) ...@@ -431,14 +431,14 @@ STATIC INLINE VOID OsInsertTCBToFreeList(LosTaskCB *taskCB)
taskCB->taskStatus = OS_TASK_STATUS_UNUSED; taskCB->taskStatus = OS_TASK_STATUS_UNUSED;
LOS_ListAdd(&g_losFreeTask, &taskCB->pendList); LOS_ListAdd(&g_losFreeTask, &taskCB->pendList);
} }
//释放任务在内核态下占用的资源
STATIC VOID OsTaskKernelResourcesToFree(UINT32 syncSignal, UINTPTR topOfStack) STATIC VOID OsTaskKernelResourcesToFree(UINT32 syncSignal, UINTPTR topOfStack)
{ {
OsTaskSyncDestroy(syncSignal); OsTaskSyncDestroy(syncSignal);//任务销毁,同步信息
(VOID)LOS_MemFree((VOID *)m_aucSysMem1, (VOID *)topOfStack); (VOID)LOS_MemFree((VOID *)m_aucSysMem1, (VOID *)topOfStack);//释放内核态空间
} }
//释放任务资源
STATIC VOID OsTaskResourcesToFree(LosTaskCB *taskCB) STATIC VOID OsTaskResourcesToFree(LosTaskCB *taskCB)
{ {
UINT32 syncSignal = LOSCFG_BASE_IPC_SEM_LIMIT; UINT32 syncSignal = LOSCFG_BASE_IPC_SEM_LIMIT;
...@@ -446,7 +446,7 @@ STATIC VOID OsTaskResourcesToFree(LosTaskCB *taskCB) ...@@ -446,7 +446,7 @@ STATIC VOID OsTaskResourcesToFree(LosTaskCB *taskCB)
UINTPTR topOfStack; UINTPTR topOfStack;
#ifdef LOSCFG_KERNEL_VM #ifdef LOSCFG_KERNEL_VM
if ((taskCB->taskStatus & OS_TASK_FLAG_USER_MODE) && (taskCB->userMapBase != 0)) { if ((taskCB->taskStatus & OS_TASK_FLAG_USER_MODE) && (taskCB->userMapBase != 0)) {//释放用户态栈
SCHEDULER_LOCK(intSave); SCHEDULER_LOCK(intSave);
UINT32 mapBase = (UINTPTR)taskCB->userMapBase; UINT32 mapBase = (UINTPTR)taskCB->userMapBase;
UINT32 mapSize = taskCB->userMapSize; UINT32 mapSize = taskCB->userMapSize;
...@@ -456,48 +456,48 @@ STATIC VOID OsTaskResourcesToFree(LosTaskCB *taskCB) ...@@ -456,48 +456,48 @@ STATIC VOID OsTaskResourcesToFree(LosTaskCB *taskCB)
LosProcessCB *processCB = OS_PCB_FROM_TCB(taskCB); LosProcessCB *processCB = OS_PCB_FROM_TCB(taskCB);
LOS_ASSERT(!(OsProcessVmSpaceGet(processCB) == NULL)); LOS_ASSERT(!(OsProcessVmSpaceGet(processCB) == NULL));
UINT32 ret = OsUnMMap(OsProcessVmSpaceGet(processCB), (UINTPTR)mapBase, mapSize); UINT32 ret = OsUnMMap(OsProcessVmSpaceGet(processCB), (UINTPTR)mapBase, mapSize);//解除映射
if ((ret != LOS_OK) && (mapBase != 0) && !OsProcessIsInit(processCB)) { if ((ret != LOS_OK) && (mapBase != 0) && !OsProcessIsInit(processCB)) {
PRINT_ERR("process(%u) unmmap user task(%u) stack failed! mapbase: 0x%x size :0x%x, error: %d\n", PRINT_ERR("process(%u) unmmap user task(%u) stack failed! mapbase: 0x%x size :0x%x, error: %d\n",
processCB->processID, taskCB->taskID, mapBase, mapSize, ret); processCB->processID, taskCB->taskID, mapBase, mapSize, ret);
} }
#ifdef LOSCFG_KERNEL_LITEIPC #ifdef LOSCFG_KERNEL_LITEIPC
LiteIpcRemoveServiceHandle(taskCB->taskID); LiteIpcRemoveServiceHandle(taskCB->taskID);//详见百篇博客之IPC篇
#endif #endif
} }
#endif #endif
if (taskCB->taskStatus & OS_TASK_STATUS_UNUSED) { if (taskCB->taskStatus & OS_TASK_STATUS_UNUSED) {//任务还没有使用情况
topOfStack = taskCB->topOfStack; topOfStack = taskCB->topOfStack;
taskCB->topOfStack = 0; taskCB->topOfStack = 0;
#ifdef LOSCFG_KERNEL_SMP_TASK_SYNC #ifdef LOSCFG_KERNEL_SMP_TASK_SYNC
syncSignal = taskCB->syncSignal; syncSignal = taskCB->syncSignal;
taskCB->syncSignal = LOSCFG_BASE_IPC_SEM_LIMIT; taskCB->syncSignal = LOSCFG_BASE_IPC_SEM_LIMIT;
#endif #endif
OsTaskKernelResourcesToFree(syncSignal, topOfStack); OsTaskKernelResourcesToFree(syncSignal, topOfStack);//释放内核态所占内存,即内核态的栈空间
SCHEDULER_LOCK(intSave); SCHEDULER_LOCK(intSave);
#ifdef LOSCFG_KERNEL_VM #ifdef LOSCFG_KERNEL_VM
OsClearSigInfoTmpList(&(taskCB->sig)); OsClearSigInfoTmpList(&(taskCB->sig));//归还信号控制块的内存
#endif #endif
OsInsertTCBToFreeList(taskCB); OsInsertTCBToFreeList(taskCB);
SCHEDULER_UNLOCK(intSave); SCHEDULER_UNLOCK(intSave);
} }
return; return;
} }
//批量回收任务
LITE_OS_SEC_TEXT VOID OsTaskCBRecycleToFree() LITE_OS_SEC_TEXT VOID OsTaskCBRecycleToFree()
{ {
UINT32 intSave; UINT32 intSave;
SCHEDULER_LOCK(intSave); SCHEDULER_LOCK(intSave);
while (!LOS_ListEmpty(&g_taskRecycleList)) { while (!LOS_ListEmpty(&g_taskRecycleList)) {//遍历回收链表
LosTaskCB *taskCB = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&g_taskRecycleList)); LosTaskCB *taskCB = OS_TCB_FROM_PENDLIST(LOS_DL_LIST_FIRST(&g_taskRecycleList));//取出任务
LOS_ListDelete(&taskCB->pendList); LOS_ListDelete(&taskCB->pendList);//重置节点
SCHEDULER_UNLOCK(intSave); SCHEDULER_UNLOCK(intSave);
OsTaskResourcesToFree(taskCB); OsTaskResourcesToFree(taskCB);//释放任务所占资源
SCHEDULER_LOCK(intSave); SCHEDULER_LOCK(intSave);
} }
......
...@@ -59,7 +59,7 @@ typedef enum { ...@@ -59,7 +59,7 @@ typedef enum {
CONTAINER = 0, CONTAINER = 0,
PID_CONTAINER, //进程容器 PID_CONTAINER, //进程容器
PID_CHILD_CONTAINER, //子进程容器 PID_CHILD_CONTAINER, //子进程容器
UTS_CONTAINER, UTS_CONTAINER, //
MNT_CONTAINER, //挂载容器 MNT_CONTAINER, //挂载容器
IPC_CONTAINER, IPC_CONTAINER,
USER_CONTAINER, USER_CONTAINER,
...@@ -70,29 +70,29 @@ typedef enum { ...@@ -70,29 +70,29 @@ typedef enum {
} ContainerType; } ContainerType;
typedef struct Container { typedef struct Container {
Atomic rc; Atomic rc; //原子操作
#ifdef LOSCFG_PID_CONTAINER #ifdef LOSCFG_PID_CONTAINER
struct PidContainer *pidContainer; struct PidContainer *pidContainer; //进程容器
struct PidContainer *pidForChildContainer; struct PidContainer *pidForChildContainer;//进程的孩子容器
#endif #endif
#ifdef LOSCFG_UTS_CONTAINER #ifdef LOSCFG_UTS_CONTAINER
struct UtsContainer *utsContainer; struct UtsContainer *utsContainer; //
#endif #endif
#ifdef LOSCFG_MNT_CONTAINER #ifdef LOSCFG_MNT_CONTAINER
struct MntContainer *mntContainer; struct MntContainer *mntContainer; //挂载容器
#endif #endif
#ifdef LOSCFG_IPC_CONTAINER #ifdef LOSCFG_IPC_CONTAINER
struct IpcContainer *ipcContainer; struct IpcContainer *ipcContainer; //IPC容器
#endif #endif
#ifdef LOSCFG_TIME_CONTAINER #ifdef LOSCFG_TIME_CONTAINER
struct TimeContainer *timeContainer; struct TimeContainer *timeContainer; //时间容器
struct TimeContainer *timeForChildContainer; struct TimeContainer *timeForChildContainer;
#endif #endif
#ifdef LOSCFG_NET_CONTAINER #ifdef LOSCFG_NET_CONTAINER
struct NetContainer *netContainer; struct NetContainer *netContainer; //网络容器
#endif #endif
} Container; } Container;
//容器数量上限
typedef struct TagContainerLimit { typedef struct TagContainerLimit {
#ifdef LOSCFG_PID_CONTAINER #ifdef LOSCFG_PID_CONTAINER
UINT32 pidLimit; UINT32 pidLimit;
......
...@@ -42,13 +42,13 @@ typedef struct TagQueueCB LosQueueCB; ...@@ -42,13 +42,13 @@ typedef struct TagQueueCB LosQueueCB;
typedef struct OsMux LosMux; typedef struct OsMux LosMux;
typedef LosMux pthread_mutex_t; typedef LosMux pthread_mutex_t;
typedef struct ProcessCB LosProcessCB; typedef struct ProcessCB LosProcessCB;
//IPC容器
typedef struct IpcContainer { typedef struct IpcContainer {
Atomic rc; Atomic rc;
LosQueueCB *allQueue; LosQueueCB *allQueue; //队列控制块(读写分离模式)
LOS_DL_LIST freeQueueList; LOS_DL_LIST freeQueueList;//空闲队列链表
fd_set queueFdSet; fd_set queueFdSet;
struct mqarray queueTable[LOSCFG_BASE_IPC_QUEUE_LIMIT]; struct mqarray queueTable[LOSCFG_BASE_IPC_QUEUE_LIMIT];//队列池
pthread_mutex_t mqueueMutex; pthread_mutex_t mqueueMutex;
struct mqpersonal *mqPrivBuf[MAX_MQ_FD]; struct mqpersonal *mqPrivBuf[MAX_MQ_FD];
struct shminfo shmInfo; struct shminfo shmInfo;
......
...@@ -40,27 +40,27 @@ struct ProcessGroup; ...@@ -40,27 +40,27 @@ struct ProcessGroup;
struct Container; struct Container;
typedef struct { typedef struct {
UINT32 vid; /* Virtual ID */ UINT32 vid; /* Virtual ID | 虚拟ID*/
UINT32 vpid; /* Virtual parent ID */ UINT32 vpid; /* Virtual parent ID | 父进程虚拟ID*/
UINTPTR cb; /* Control block */ UINTPTR cb; /* Control block | 控制块*/
LosProcessCB *realParent; /* process real parent */ LosProcessCB *realParent; /* process real parent | 进程真实的父进程 */
LOS_DL_LIST node; LOS_DL_LIST node;
} ProcessVid; } ProcessVid;
#define PID_CONTAINER_LEVEL_LIMIT 3 #define PID_CONTAINER_LEVEL_LIMIT 3
//进程容器
typedef struct PidContainer { typedef struct PidContainer {
Atomic rc; Atomic rc; //原子操作
Atomic level; Atomic level; //等级
Atomic lock; Atomic lock; //锁
BOOL referenced; BOOL referenced; //引用次数
UINT32 containerID; UINT32 containerID; //容器ID
struct PidContainer *parent; struct PidContainer *parent; //父进程容器
struct ProcessGroup *rootPGroup; struct ProcessGroup *rootPGroup; //进程组
LOS_DL_LIST tidFreeList; LOS_DL_LIST tidFreeList; //任务空闲链表
ProcessVid tidArray[LOSCFG_BASE_CORE_TSK_LIMIT]; ProcessVid tidArray[LOSCFG_BASE_CORE_TSK_LIMIT];//任务池
LOS_DL_LIST pidFreeList; LOS_DL_LIST pidFreeList; //进程空闲链表
ProcessVid pidArray[LOSCFG_BASE_CORE_PROCESS_LIMIT]; ProcessVid pidArray[LOSCFG_BASE_CORE_PROCESS_LIMIT];//进程池
} PidContainer; } PidContainer;
#define OS_PID_CONTAINER_FROM_PCB(processCB) ((processCB)->container->pidContainer) #define OS_PID_CONTAINER_FROM_PCB(processCB) ((processCB)->container->pidContainer)
......
...@@ -428,10 +428,10 @@ typedef struct TagTaskCB { ...@@ -428,10 +428,10 @@ typedef struct TagTaskCB {
UINTPTR fp; ///< fp寄存器 UINTPTR fp; ///< fp寄存器
#endif #endif
#ifdef LOSCFG_PID_CONTAINER #ifdef LOSCFG_PID_CONTAINER
PidContainer *pidContainer; PidContainer *pidContainer;//进程容器
#endif #endif
#ifdef LOSCFG_IPC_CONTAINER #ifdef LOSCFG_IPC_CONTAINER
BOOL cloneIpc; BOOL cloneIpc;//是否克隆过IPC (flags & CLONE_NEWIPC)
#endif #endif
} LosTaskCB; } LosTaskCB;
......
...@@ -39,11 +39,15 @@ ...@@ -39,11 +39,15 @@
typedef struct ProcessCB LosProcessCB; typedef struct ProcessCB LosProcessCB;
struct Container; struct Container;
/****************************************
* https://unix.stackexchange.com/questions/183717/whats-a-uts-namespace
* uts的全称: UNIX Time Sharing, UNIX分时操作系统
* setting hostname, domainname will not affect rest of the system (CLONE_NEWUTS flag)
****************************************/
typedef struct UtsContainer { typedef struct UtsContainer {
Atomic rc; Atomic rc; //原子操作 LDREX 和 STREX 指令保证了原子操作的底层实现
UINT32 containerID; UINT32 containerID; //容器ID
struct utsname utsName; struct utsname utsName; //存放系统信息的缓冲区
} UtsContainer; } UtsContainer;
UINT32 OsInitRootUtsContainer(UtsContainer **utsContainer); UINT32 OsInitRootUtsContainer(UtsContainer **utsContainer);
......
...@@ -105,7 +105,7 @@ ...@@ -105,7 +105,7 @@
#define OS_MEM_COLUMN_NUM 8 #define OS_MEM_COLUMN_NUM 8
UINT8 *m_aucSysMem0 = NULL; ///< 异常交互动态内存池地址的起始地址,当不支持异常交互特性时,m_aucSysMem0等于m_aucSysMem1。 UINT8 *m_aucSysMem0 = NULL; ///< 异常交互动态内存池地址的起始地址,当不支持异常交互特性时,m_aucSysMem0等于m_aucSysMem1。
UINT8 *m_aucSysMem1 = NULL; ///< 系统动态内存池地址的起始地址 @note_thinking 能否不要用 0,1来命名核心变量 ??? UINT8 *m_aucSysMem1 = NULL; ///< (内核态)系统动态内存池地址的起始地址 @note_thinking 能否不要用 0,1来命名核心变量 ???
#ifdef LOSCFG_MEM_MUL_POOL #ifdef LOSCFG_MEM_MUL_POOL
VOID *g_poolHead = NULL; ///内存池头,由它牵引多个内存池 VOID *g_poolHead = NULL; ///内存池头,由它牵引多个内存池
......
git add -A git add -A
git commit -m ' 进程模块注释完善 git commit -m ' 开始注解容器模块
鸿蒙研究站 | http://weharmonyos.com (国内) 鸿蒙研究站 | http://weharmonyos.com (国内)
| https://weharmony.github.io (国外) | https://weharmony.github.io (国外)
论坛 | http://bbs.weharmonyos.com 论坛 | http://bbs.weharmonyos.com
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册