简介
近期在阅读鸿蒙liteOS_a,由于是初次探索内核的奥秘。将一些阅读的心得进行分享。希望能在作为笔记的同时,也能帮助更多人学习。
感谢图灵大佬的注释项目,使我能够更加快速的理解。
https://weharmony.github.io/
核心模块
核心模块位于:kernel -> base -> core
其中包括:
los_bitmap.c 用于位操作,改变标志位。
los_process.c 用于控制并发、并行、单核多进程、多核多线程的管理
los_sortlik.c 用于排序
los_swtmr.c 用于定时器
los_sys.c 用于时间管理,转换秒与毫秒,了解当前系统运行时间
los_task.c 用于任务状态管理,一个任务代表一个线程,管理其运行状态。
los_tick.c 用于系统时钟、节拍器。
任务管理(los_task.c)
#include "los_task_pri.h" //定义任务信号类型。
#include "los_base_pri.h". //定义基础类型。
#include "los_event_pri.h" //定义事件类型。
#include "los_exc.h" //内核的异常处理文件。
#include "los_hw_pri.h" //文件是中断模块,但是我没有找到源码,不清楚原因。
#include "los_init.h" //初始化模块。
#include "los_memstat_pri.h" //内存统计模块。
#include "los_mp.h" //核间中断 CPU唤醒和调度和停止
#include "los_mux_pri.h" //进程配置和内存管理
#include "los_sched_pri.h" //调度周期
#include "los_sem_pri.h" //信号控制结构
#include "los_spinlock.h" //自旋锁结构
#include "los_strncpy_from_user.h" //看着像是宏拷贝,没找到源码
#include "los_percpu_pri.h" //对接CPU的结构
#include "los_process_pri.h" // 进程的结构
#include "los_vm_map.h" //虚拟化映射管理
#include "los_vm_syscall.h" //定义虚拟化系统调用
#include "los_signal.h" //软中断信号
#include "los_hook.h" //钩子池,下HOOK在这里。
#ifdef LOSCFG_KERNEL_CPUP
#include "los_cpup_pri.h" // CPU控制块结构体
#endif
#ifdef LOSCFG_BASE_CORE_SWTMR_ENABLE
#include "los_swtmr_pri.h" //定时器配置
#endif
#ifdef LOSCFG_KERNEL_LITEIPC
#include "hm_liteipc.h" // 控制内核空间输入输出
#endif
#ifdef LOSCFG_ENABLE_OOM_LOOP_TASK
#include "los_oom.h" //oom结构体
#endif
#if (LOSCFG_BASE_CORE_TSK_LIMIT <= 0)
#error "task maxnum cannot be zero"
#endif /* LOSCFG_BASE_CORE_TSK_LIMIT <= 0 */
LITE_OS_SEC_BSS LosTaskCB *g_taskCBArray;//任务池 128个
LITE_OS_SEC_BSS LOS_DL_LIST g_losFreeTask;//空闲任务链表
LITE_OS_SEC_BSS LOS_DL_LIST g_taskRecycleList;//回收任务链表
LITE_OS_SEC_BSS UINT32 g_taskMaxNum;//任务最大个数
LITE_OS_SEC_BSS UINT32 g_taskScheduled; /* one bit for each cores *///任务调度器,每个CPU都有对应位
LITE_OS_SEC_BSS EVENT_CB_S g_resourceEvent;//资源的事件
/* spinlock for task module, only available on SMP mode */
LITE_OS_SEC_BSS SPIN_LOCK_INIT(g_taskSpin); //自旋锁初始化
STATIC VOID OsConsoleIDSetHook(UINT32 param1,
UINT32 param2) __attribute__((weakref("OsSetConsoleID")));//系统控制台ID设置HOOK
#define OS_CHECK_TASK_BLOCK (OS_TASK_STATUS_DELAY | \
OS_TASK_STATUS_PENDING | \
OS_TASK_STATUS_SUSPENDED)
/* temp task blocks for booting procedure */
LITE_OS_SEC_BSS STATIC LosTaskCB g_mainTask[LOSCFG_KERNEL_CORE_NUM];//启动引导过程中使用的临时任务
LosTaskCB *OsGetMainTask()//系统获取主任务
{
return (LosTaskCB *)(g_mainTask + ArchCurrCpuid()); //ArchCurrCpuid当前CPUID
}
VOID OsSetMainTask() //系统设置主任务
{
UINT32 i;
CHAR *name = "osMain";//任务名称
//为每个CPU core 设置mainTask
for (i = 0; i < LOSCFG_KERNEL_CORE_NUM; i++) {
g_mainTask[i].taskStatus = OS_TASK_STATUS_UNUSED;
g_mainTask[i].taskID = LOSCFG_BASE_CORE_TSK_LIMIT;//128
g_mainTask[i].priority = OS_TASK_PRIORITY_LOWEST;//31
#ifdef LOSCFG_KERNEL_SMP_LOCKDEP
g_mainTask[i].lockDep.lockDepth = 0;
g_mainTask[i].lockDep.waitLock = NULL;
#endif
(VOID)strncpy_s(g_mainTask[i].taskName, OS_TCB_NAME_LEN, name, OS_TCB_NAME_LEN - 1);
LOS_ListInit(&g_mainTask[i].lockList);//初始化任务锁链表,上面挂的是任务已申请到的互斥锁
}
}
//空闲任务,每个CPU都有自己的空闲任务
LITE_OS_SEC_TEXT WEAK VOID OsIdleTask(VOID)
{
while (1) {
//只有一个死循环
WFI;
}
}
未完待续。。。