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

修改注解方式,支持doxygen格式

    百万汉字注解 + 百篇博客分析 => 挖透鸿蒙内核源码
    博客输出站点(国内):http://weharmonyos.com
    博客输出站点(国外):https://weharmony.github.io
    注解文件系统:https://gitee.com/weharmony/third_party_NuttX
    注解协议栈:https://gitee.com/weharmony/third_party_lwip
    注解编译子系统:https://gitee.com/weharmony/build_lite
上级 983dcba1
......@@ -47,13 +47,13 @@ extern "C" {
#endif /* __cplusplus */
//一个shell命令的结构体,命令有长有短,鸿蒙采用了可变数组的方式实现
typedef struct {
unsigned int count; //字符数量
SH_List list; //双向链表
char cmdString[0]; //字符串,可变数组的一种实现方式.
unsigned int count; ///< 字符数量
SH_List list; ///< 双向链表
char cmdString[0]; ///< 字符串,可变数组的一种实现方式.
} CmdKeyLink;
#define NEED_NEW_LINE(timesPrint, lineCap) ((timesPrint) % (lineCap) == 0)
#define SCREEN_IS_FULL(timesPrint, lineCap) ((timesPrint) >= ((lineCap) * DEFAULT_SCREEN_HEIGNT))
SCREEN_IS_FULL(timesPrint, lineCap) ((timesPrint) >= ((lineCap) * DEFAULT_SCREEN_HEIGNT))
extern unsigned int OsCmdExec(CmdParsed *cmdParsed, char *cmdStr);
extern unsigned int OsCmdKeyShift(const char *cmdKey, char *cmdOut, unsigned int size);
......
......@@ -87,35 +87,35 @@ SPSR(saved program status register)程序状态保存寄存器.
#define CPSR_IRQ_DISABLE 0x80 /* IRQ disabled when =1 */ //禁止IRQ 中断
#define CPSR_FIQ_DISABLE 0x40 /* FIQ disabled when =1 */ //禁止FIQ中断
#define CPSR_THUMB_ENABLE 0x20 /* Thumb mode when =1 */ //使能Thumb模式 1:CPU处于Thumb状态, 0:CPU处于ARM状态
#define CPSR_USER_MODE 0x10 //用户模式,除了用户模式,其余模式也叫特权模式,特权模式中除了系统模式以外的其余5种模式称为异常模式;
#define CPSR_FIQ_MODE 0x11 //快中断模式 用于高速数据传输或通道处理
#define CPSR_IRQ_MODE 0x12 //中断模式 用于通用的中断处理
#define CPSR_SVC_MODE 0x13 //管理模式 操作系统使用的保护模式
#define CPSR_ABT_MODE 0x17 //ABT模式 当数据或指令预取终止时进入该模式,用于虚拟存储及存储保护
#define CPSR_UNDEF_MODE 0x1B //未定义模式(其他模式)当未定义的指令执行时进入该模式,用于支持硬件协处理器的软件仿真
#define CPSR_USER_MODE 0x10 ///< 用户模式,除了用户模式,其余模式也叫特权模式,特权模式中除了系统模式以外的其余5种模式称为异常模式;
#define CPSR_FIQ_MODE 0x11 ///< 快中断模式 用于高速数据传输或通道处理
#define CPSR_IRQ_MODE 0x12 ///< 中断模式 用于通用的中断处理
#define CPSR_SVC_MODE 0x13 ///< 管理模式 操作系统使用的保护模式
#define CPSR_ABT_MODE 0x17 ///< ABT模式 当数据或指令预取终止时进入该模式,用于虚拟存储及存储保护
#define CPSR_UNDEF_MODE 0x1B ///< 未定义模式(其他模式)当未定义的指令执行时进入该模式,用于支持硬件协处理器的软件仿真
#define CPSR_MASK_MODE 0x1F
/* Define exception type ID */ //ARM处理器一共有7种工作模式,除了用户和系统模式其余都叫异常工作模式
#define OS_EXCEPT_RESET 0x00 //重置功能,例如:开机就进入CPSR_SVC_MODE模式
#define OS_EXCEPT_UNDEF_INSTR 0x01 //未定义的异常,就是others
#define OS_EXCEPT_SWI 0x02 //软中断
#define OS_EXCEPT_PREFETCH_ABORT 0x03 //预取异常(取指异常), 指令三步骤: 取指,译码,执行,
#define OS_EXCEPT_DATA_ABORT 0x04 //数据异常
#define OS_EXCEPT_FIQ 0x05 //快中断异常
#define OS_EXCEPT_ADDR_ABORT 0x06 //地址异常
#define OS_EXCEPT_IRQ 0x07 //普通中断异常
#define OS_EXCEPT_RESET 0x00 ///< 重置功能,例如:开机就进入CPSR_SVC_MODE模式
#define OS_EXCEPT_UNDEF_INSTR 0x01 ///< 未定义的异常,就是others
#define OS_EXCEPT_SWI 0x02 ///< 软中断
#define OS_EXCEPT_PREFETCH_ABORT 0x03 ///< 预取异常(取指异常), 指令三步骤: 取指,译码,执行,
#define OS_EXCEPT_DATA_ABORT 0x04 ///< 数据异常
#define OS_EXCEPT_FIQ 0x05 ///< 快中断异常
#define OS_EXCEPT_ADDR_ABORT 0x06 ///< 地址异常
#define OS_EXCEPT_IRQ 0x07 ///< 普通中断异常
/* Define core num */
#ifdef LOSCFG_KERNEL_SMP
#define CORE_NUM LOSCFG_KERNEL_SMP_CORE_NUM //CPU 核数
#define CORE_NUM LOSCFG_KERNEL_SMP_CORE_NUM ///< CPU 核数
#else
#define CORE_NUM 1
#endif
/* Initial bit32 stack value. */
#define OS_STACK_INIT 0xCACACACA //栈指针初始化值 0b 1010 1010 1010
#define OS_STACK_INIT 0xCACACACA ///< 栈指针初始化值 0b 1010 1010 1010
/* Bit32 stack top magic number. */
#define OS_STACK_MAGIC_WORD 0xCCCCCCCC //用于栈顶值,可标识为栈是否被溢出过,神奇的 "烫烫烫烫"的根源所在! 0b 1100 1100 1100
#define OS_STACK_MAGIC_WORD 0xCCCCCCCC ///< 用于栈顶值,可标识为栈是否被溢出过,神奇的 "烫烫烫烫"的根源所在! 0b 1100 1100 1100
/*************************************************************************** @note_pic
* 鸿蒙虚拟内存-栈空间运行时图
* 鸿蒙源码分析系列篇: https://blog.csdn.net/kuangyufei
......@@ -151,27 +151,27 @@ SPSR(saved program status register)程序状态保存寄存器.
#endif
#define OS_EXC_FIQ_STACK_SIZE 64
#define OS_EXC_IRQ_STACK_SIZE 64
#define OS_EXC_SVC_STACK_SIZE 0x2000 //8K
#define OS_EXC_STACK_SIZE 0x1000 //4K
#define OS_EXC_SVC_STACK_SIZE 0x2000 ///< 8K
#define OS_EXC_STACK_SIZE 0x1000 ///< 4K
#define REG_R0 0 //高频寄存器,传参/保存返回值
#define REG_R0 0 ///< 高频寄存器,传参/保存返回值
#define REG_R1 1
#define REG_R2 2
#define REG_R3 3
#define REG_R4 4
#define REG_R5 5
#define REG_R6 6
#define REG_R7 7 //特殊情况下用于保存系统调用号
#define REG_R7 7 ///< 特殊情况下用于保存系统调用号
#define REG_R8 8
#define REG_R9 9
#define REG_R10 10
#define REG_R11 11 //特殊情况下用于 FP寄存器
#define REG_R11 11 ///< 特殊情况下用于 FP寄存器
#define REG_R12 12
#define REG_R13 13
#define REG_R14 14
#define REG_R15 15
#define REG_CPSR 16 //程序状态寄存器(current program status register) (当前程序状态寄存器)
#define REG_SP REG_R13 //堆栈指针 当不使用堆栈时,R13 也可以用做通用数据寄存器
#define REG_LR REG_R14 //连接寄存器。当执行子程序或者异常中断时,跳转指令会自动将当前地址存入LR寄存器中,当执行完子程 序或者中断后,根据LR中的值,恢复或者说是返回之前被打断的地址继续执行
#define REG_PC REG_R15 //指令寄存器
#define REG_CPSR 16 ///< 程序状态寄存器(current program status register) (当前程序状态寄存器)
#define REG_SP REG_R13 ///< 堆栈指针 当不使用堆栈时,R13 也可以用做通用数据寄存器
#define REG_LR REG_R14 ///< 连接寄存器。当执行子程序或者异常中断时,跳转指令会自动将当前地址存入LR寄存器中,当执行完子程 序或者中断后,根据LR中的值,恢复或者说是返回之前被打断的地址继续执行
#define REG_PC REG_R15 ///< 指令寄存器
#endif
......@@ -307,66 +307,66 @@ extern SPIN_LOCK_S g_taskSpin;//任务自旋锁
#define OS_TCB_NAME_LEN 32
typedef struct {
VOID *stackPointer; /**< Task stack pointer */ //内核栈指针位置(SP)
UINT16 taskStatus; /**< Task status */ //各种状态标签,可以拥有多种标签,按位标识
UINT16 priority; /**< Task priority */ //任务优先级[0:31],默认是31级
VOID *stackPointer; /**< Task stack pointer \n */ //内核栈指针位置(SP)
UINT16 taskStatus; /**< Task status \n */ //各种状态标签,可以拥有多种标签,按位标识
UINT16 priority; /**< Task priority \n */ //任务优先级[0:31],默认是31级
UINT16 policy; //任务的调度方式(三种 .. LOS_SCHED_RR )
UINT64 startTime; /**< The start time of each phase of task *///任务开始时间
UINT64 irqStartTime; /**< Interrupt start time *///任务中断开始时间
UINT32 irqUsedTime; /**< Interrupt consumption time *///任务中断恢复时间
UINT32 initTimeSlice; /**< Task init time slice *///任务初始的时间片
INT32 timeSlice; /**< Task remaining time slice *///任务剩余时间片
UINT32 waitTimes; /**< Task delay time, tick number *///设置任务调度延期时间
SortLinkList sortList; /**< Task sortlink node */ //任务排序链表节点
UINT32 stackSize; /**< Task stack size */ //内核态栈大小,内存来自内核空间
UINTPTR topOfStack; /**< Task stack top */ //内核态栈顶 bottom = top + size
UINT32 taskID; /**< Task ID */ //任务ID,任务池本质是一个大数组,ID就是数组的索引,默认 < 128
TSK_ENTRY_FUNC taskEntry; /**< Task entrance function */ //任务执行入口函数
VOID *joinRetval; /**< pthread adaption */ //用来存储join线程的返回值
VOID *taskMux; /**< Task-held mutex */ //task在等哪把锁
VOID *taskEvent; /**< Task-held event */ //task在等哪个事件
UINTPTR args[4]; /**< Parameter, of which the maximum number is 4 */ //入口函数的参数 例如 main (int argc,char *argv[])
CHAR taskName[OS_TCB_NAME_LEN]; /**< Task name */ //任务的名称
LOS_DL_LIST pendList; /**< Task pend node */ //如果任务阻塞时就通过它挂到各种阻塞情况的链表上,比如OsTaskWait时
LOS_DL_LIST threadList; /**< thread list */ //挂到所属进程的线程链表上
UINT32 eventMask; /**< Event mask */ //任务对哪些事件进行屏蔽
UINT32 eventMode; /**< Event mode */ //事件三种模式(LOS_WAITMODE_AND,LOS_WAITMODE_OR,LOS_WAITMODE_CLR)
UINT64 startTime; /**< The start time of each phase of task \n *///任务开始时间
UINT64 irqStartTime; /**< Interrupt start time \n *///任务中断开始时间
UINT32 irqUsedTime; /**< Interrupt consumption time \n *///任务中断恢复时间
UINT32 initTimeSlice; /**< Task init time slice \n *///任务初始的时间片
INT32 timeSlice; /**< Task remaining time slice \n *///任务剩余时间片
UINT32 waitTimes; /**< Task delay time, tick number \n *///设置任务调度延期时间
SortLinkList sortList; /**< Task sortlink node \n */ //任务排序链表节点
UINT32 stackSize; /**< Task stack size \n */ //内核态栈大小,内存来自内核空间
UINTPTR topOfStack; /**< Task stack top \n */ //内核态栈顶 bottom = top + size
UINT32 taskID; /**< Task ID \n */ //任务ID,任务池本质是一个大数组,ID就是数组的索引,默认 < 128
TSK_ENTRY_FUNC taskEntry; /**< Task entrance function \n */ //任务执行入口函数
VOID *joinRetval; /**< pthread adaption \n */ //用来存储join线程的返回值
VOID *taskMux; /**< Task-held mutex \n */ //task在等哪把锁
VOID *taskEvent; /**< Task-held event \n */ //task在等哪个事件
UINTPTR args[4]; /**< Parameter, of which the maximum number is 4 \n */ //入口函数的参数 例如 main (int argc,char *argv[])
CHAR taskName[OS_TCB_NAME_LEN]; /**< Task name \n */ //任务的名称
LOS_DL_LIST pendList; /**< Task pend node \n */ //如果任务阻塞时就通过它挂到各种阻塞情况的链表上,比如OsTaskWait时
LOS_DL_LIST threadList; /**< thread list \n */ //挂到所属进程的线程链表上
UINT32 eventMask; /**< Event mask \n */ //任务对哪些事件进行屏蔽
UINT32 eventMode; /**< Event mode \n */ //事件三种模式(LOS_WAITMODE_AND,LOS_WAITMODE_OR,LOS_WAITMODE_CLR)
UINT32 priBitMap; /**< BitMap for recording the change of task priority, //任务在执行过程中优先级会经常变化,这个变量用来记录所有曾经变化
the priority can not be greater than 31 */ //过的优先级,例如 ..01001011 曾经有过 0,1,3,6 优先级
the priority can not be greater than 31 \n */ //过的优先级,例如 ..01001011 曾经有过 0,1,3,6 优先级
#ifdef LOSCFG_KERNEL_CPUP
OsCpupBase taskCpup; /**< task cpu usage */
OsCpupBase taskCpup; /**< task cpu usage \n */
#endif
INT32 errorNo; /**< Error Num */
UINT32 signal; /**< Task signal */ //任务信号类型,(SIGNAL_NONE,SIGNAL_KILL,SIGNAL_SUSPEND,SIGNAL_AFFI)
INT32 errorNo; /**< Error Num \n */
UINT32 signal; /**< Task signal \n */ //任务信号类型,(SIGNAL_NONE,SIGNAL_KILL,SIGNAL_SUSPEND,SIGNAL_AFFI)
sig_cb sig; //信号控制块,用于异步通信,类似于 linux singal模块
#ifdef LOSCFG_KERNEL_SMP
UINT16 currCpu; /**< CPU core number of this task is running on */ //正在运行此任务的CPU内核号
UINT16 lastCpu; /**< CPU core number of this task is running on last time */ //上次运行此任务的CPU内核号
UINT16 cpuAffiMask; /**< CPU affinity mask, support up to 16 cores */ //CPU亲和力掩码,最多支持16核,亲和力很重要,多核情况下尽量一个任务在一个CPU核上运行,提高效率
UINT16 currCpu; /**< CPU core number of this task is running on \n */ //正在运行此任务的CPU内核号
UINT16 lastCpu; /**< CPU core number of this task is running on last time \n */ //上次运行此任务的CPU内核号
UINT16 cpuAffiMask; /**< CPU affinity mask, support up to 16 cores \n */ //CPU亲和力掩码,最多支持16核,亲和力很重要,多核情况下尽量一个任务在一个CPU核上运行,提高效率
#ifdef LOSCFG_KERNEL_SMP_TASK_SYNC
UINT32 syncSignal; /**< Synchronization for signal handling */ //用于CPU之间 同步信号
UINT32 syncSignal; /**< Synchronization for signal handling \n */ //用于CPU之间 同步信号
#endif
#ifdef LOSCFG_KERNEL_SMP_LOCKDEP //死锁检测开关
LockDep lockDep;
#endif
#endif
#ifdef LOSCFG_SCHED_DEBUG
SchedStat schedStat; /**< Schedule statistics */
SchedStat schedStat; /**< Schedule statistics \n */
#endif
UINTPTR userArea; //用户空间的堆区开始位置
UINTPTR userMapBase; //用户空间的栈顶位置,内存来自用户空间,和topOfStack有本质的区别.
UINT32 userMapSize; /**< user thread stack size ,real size : userMapSize + USER_STACK_MIN_SIZE *///用户栈大小
UINT32 processID; /**< Which belong process *///所属进程ID
FutexNode futex; //实现快锁功能
LOS_DL_LIST joinList; /**< join list */ //联结链表,允许任务之间相互释放彼此
LOS_DL_LIST lockList; /**< Hold the lock list */ //该链表上挂的都是已持有的锁
UINTPTR waitID; /**< Wait for the PID or GID of the child process */
UINTPTR userArea; ///< 用户空间的堆区开始位置
UINTPTR userMapBase; ///< 用户空间的栈顶位置,内存来自用户空间,和topOfStack有本质的区别.
UINT32 userMapSize; /**< user thread stack size ,real size : userMapSize + USER_STACK_MIN_SIZE \n *///用户栈大小
UINT32 processID; /**< Which belong process \n *///所属进程ID
FutexNode futex; ///< 实现快锁功能
LOS_DL_LIST joinList; /**< join list \n */ //联结链表,允许任务之间相互释放彼此
LOS_DL_LIST lockList; /**< Hold the lock list \n 该链表上挂的都是已持有的锁 */
UINTPTR waitID; /**< Wait for the PID or GID of the child process \n */
UINT16 waitFlag; /**< The type of child process that is waiting, belonging to a group or parent,
a specific child process, or any child process */ //以什么样的方式等待子进程结束(OS_TASK_WAIT_PROCESS | OS_TASK_WAIT_GID | ..)
a specific child process, or any child process \n 以什么样的方式等待子进程结束(OS_TASK_WAIT_PROCESS | OS_TASK_WAIT_GID | ..) */
#ifdef LOSCFG_KERNEL_LITEIPC
UINT32 ipcStatus; //IPC状态
LOS_DL_LIST msgListHead; //消息队列头结点,上面挂的都是任务要读的消息
BOOL accessMap[LOSCFG_BASE_CORE_TSK_LIMIT];//访问图,指的是task之间是否能访问的标识,LOSCFG_BASE_CORE_TSK_LIMIT 为任务池总数
UINT32 ipcStatus; ///< IPC状态
LOS_DL_LIST msgListHead; ///< 消息队列头结点,上面挂的都是任务要读的消息
BOOL accessMap[LOSCFG_BASE_CORE_TSK_LIMIT];///< 访问图,指的是task之间是否能访问的标识,LOSCFG_BASE_CORE_TSK_LIMIT 为任务池总数
#endif
#ifdef LOSCFG_KERNEL_PERF
UINTPTR pc;
......@@ -380,11 +380,11 @@ typedef struct {
} LosTask;
struct ProcessSignalInfo {//进程信号描述符
siginfo_t *sigInfo; /**< Signal to be dispatched */ //要发送的信号
LosTaskCB *defaultTcb; /**< Default TCB */ //默认task,默认接收信号的任务.
LosTaskCB *unblockedTcb; /**< The signal unblock on this TCB*/ //信号在此TCB上解除阻塞
LosTaskCB *awakenedTcb; /**< This TCB was awakened */ //即 任务在等待这个信号,此信号一来任务被唤醒.
LosTaskCB *receivedTcb; /**< This TCB received the signal */ //如果没有屏蔽信号,任务将接收这个信号.
siginfo_t *sigInfo; /**< Signal to be dispatched \n 要发送的信号*/
LosTaskCB *defaultTcb; /**< Default TCB \n 默认task,默认接收信号的任务. */
LosTaskCB *unblockedTcb; /**< The signal unblock on this TCB \n 信号在此TCB上解除阻塞 */
LosTaskCB *awakenedTcb; /**< This TCB was awakened \n 即 任务在等待这个信号,此信号一来任务被唤醒.*/
LosTaskCB *receivedTcb; /**< This TCB received the signal \n 如果没有屏蔽信号,任务将接收这个信号. */
};
typedef int (*ForEachTaskCB)(LosTaskCB *tcb, void *arg);//回调任务函数,例如:进程被kill 9 时,通知所有任务善后处理
......@@ -394,7 +394,7 @@ typedef int (*ForEachTaskCB)(LosTaskCB *tcb, void *arg);//回调任务函数,例
* Maximum number of tasks.
*
*/
extern UINT32 g_taskMaxNum;//任务最大数量 默认128个
extern UINT32 g_taskMaxNum;///< 任务最大数量 默认128个
/**
......@@ -402,16 +402,16 @@ extern UINT32 g_taskMaxNum;//任务最大数量 默认128个
* Starting address of a task.
*
*/
extern LosTaskCB *g_taskCBArray;//外部变量 任务池 默认128个
extern LosTaskCB *g_taskCBArray;///< 外部变量 任务池 默认128个
/**
* @ingroup los_task
* Time slice structure.
*/
typedef struct {//时间片结构体,任务轮询
LosTaskCB *task; /**< Current running task */ //当前运行着的任务
UINT16 time; /**< Expiration time point */ //过期时间点
UINT16 timeout; /**< Expiration duration */ //有效期
LosTaskCB *task; /**< Current running task \n 当前运行着的任务*/
UINT16 time; /**< Expiration time point \n 过期时间点*/
UINT16 timeout; /**< Expiration duration \n 有效期*/
} OsTaskRobin;
//获取当前CPU core运行的任务
STATIC INLINE LosTaskCB *OsCurrTaskGet(VOID)
......@@ -484,18 +484,18 @@ STATIC INLINE BOOL OsTaskIsKilled(const LosTaskCB *taskCB)
/* get task info */
#define OS_ALL_TASK_MASK 0xFFFFFFFF
#define OS_TASK_WAIT_ANYPROCESS (1 << 0U) //任务等待任何进程出现
#define OS_TASK_WAIT_PROCESS (1 << 1U) //任务等待进程出现
#define OS_TASK_WAIT_GID (1 << 2U) //任务等待组ID
#define OS_TASK_WAIT_SEM (OS_TASK_WAIT_GID + 1) //任务等待信号量发生
#define OS_TASK_WAIT_QUEUE (OS_TASK_WAIT_SEM + 1) //任务等待队列到来
#define OS_TASK_WAIT_JOIN (OS_TASK_WAIT_QUEUE + 1) //任务等待
#define OS_TASK_WAIT_SIGNAL (OS_TASK_WAIT_JOIN + 1) //任务等待信号的到来
#define OS_TASK_WAIT_LITEIPC (OS_TASK_WAIT_SIGNAL + 1) //任务等待liteipc到来
#define OS_TASK_WAIT_MUTEX (OS_TASK_WAIT_LITEIPC + 1) //任务等待MUTEX到来
#define OS_TASK_WAIT_FUTEX (OS_TASK_WAIT_MUTEX + 1) //任务等待FUTEX到来
#define OS_TASK_WAIT_EVENT (OS_TASK_WAIT_FUTEX + 1) //任务等待事件发生
#define OS_TASK_WAIT_COMPLETE (OS_TASK_WAIT_EVENT + 1) //任务等待完成
#define OS_TASK_WAIT_ANYPROCESS (1 << 0U) ///< 任务等待任何进程出现
#define OS_TASK_WAIT_PROCESS (1 << 1U) ///< 任务等待进程出现
#define OS_TASK_WAIT_GID (1 << 2U) ///< 任务等待组ID
#define OS_TASK_WAIT_SEM (OS_TASK_WAIT_GID + 1) ///< 任务等待信号量发生
#define OS_TASK_WAIT_QUEUE (OS_TASK_WAIT_SEM + 1) ///< 任务等待队列到来
#define OS_TASK_WAIT_JOIN (OS_TASK_WAIT_QUEUE + 1) ///< 任务等待
#define OS_TASK_WAIT_SIGNAL (OS_TASK_WAIT_JOIN + 1) ///< 任务等待信号的到来
#define OS_TASK_WAIT_LITEIPC (OS_TASK_WAIT_SIGNAL + 1) ///< 任务等待liteipc到来
#define OS_TASK_WAIT_MUTEX (OS_TASK_WAIT_LITEIPC + 1) ///< 任务等待MUTEX到来
#define OS_TASK_WAIT_FUTEX (OS_TASK_WAIT_MUTEX + 1) ///< 任务等待FUTEX到来
#define OS_TASK_WAIT_EVENT (OS_TASK_WAIT_FUTEX + 1) ///< 任务等待事件发生
#define OS_TASK_WAIT_COMPLETE (OS_TASK_WAIT_EVENT + 1) ///< 任务等待完成
//设置事件阻塞掩码,即设置任务的等待事件.
STATIC INLINE VOID OsTaskWaitSetPendMask(UINT16 mask, UINTPTR lockID, UINT32 timeout)
......
......@@ -50,11 +50,11 @@ extern "C" {
#define OS_KHEAP_BLOCK_SIZE (512 * 1024UL)
typedef struct ArchMmuInitMapping {
PADDR_T phys;//物理地址
VADDR_T virt;//虚拟地址
size_t size;//大小
unsigned int flags;//标识 读/写/.. VM_MAP_REGION_FLAG_PERM_*
const char *name;//名称
PADDR_T phys;///< 物理地址
VADDR_T virt;///< 虚拟地址
size_t size;///< 大小
unsigned int flags;///< 标识 读/写/.. VM_MAP_REGION_FLAG_PERM_*
const char *name;///< 名称
} LosArchMmuInitMapping;
extern LosArchMmuInitMapping g_archMmuInitMapping[];
......
......@@ -90,23 +90,23 @@ extern "C" {
// |---------------------------|虚拟内存开始位置 0x00000000
/* user address space, defaults to below kernel space with a 16MB guard gap on either side */
#ifndef USER_ASPACE_BASE //用户地址空间,默认为低于内核空间,两侧各有16MB的保护间隙
#define USER_ASPACE_BASE ((vaddr_t)0x01000000UL) //用户空间基地址 从16M位置开始
#ifndef USER_ASPACE_BASE ///< 用户地址空间,默认为低于内核空间,两侧各有16MB的保护间隙
#define USER_ASPACE_BASE ((vaddr_t)0x01000000UL) ///< 用户空间基地址 从16M位置开始
#endif
#ifndef USER_ASPACE_SIZE
#define USER_ASPACE_SIZE ((vaddr_t)KERNEL_ASPACE_BASE - USER_ASPACE_BASE - 0x01000000UL)//用户空间 < 内核空间 2个16M
#define USER_ASPACE_SIZE ((vaddr_t)KERNEL_ASPACE_BASE - USER_ASPACE_BASE - 0x01000000UL)///< 用户空间 < 内核空间 2个16M
#endif
#define USER_ASPACE_TOP_MAX ((vaddr_t)(USER_ASPACE_BASE + USER_ASPACE_SIZE))//用户空间顶部位置
#define USER_HEAP_BASE ((vaddr_t)(USER_ASPACE_TOP_MAX >> 2)) //堆的开始地址
#define USER_MAP_BASE ((vaddr_t)(USER_ASPACE_TOP_MAX >> 1)) //用户映射区开始地址
#define USER_MAP_SIZE ((vaddr_t)(USER_ASPACE_SIZE >> 3)) //用户空间映射大小 = 1/8 用户空间
#define USER_ASPACE_TOP_MAX ((vaddr_t)(USER_ASPACE_BASE + USER_ASPACE_SIZE))///< 用户空间顶部位置
#define USER_HEAP_BASE ((vaddr_t)(USER_ASPACE_TOP_MAX >> 2)) ///< 堆的开始地址
#define USER_MAP_BASE ((vaddr_t)(USER_ASPACE_TOP_MAX >> 1)) ///< 用户映射区开始地址
#define USER_MAP_SIZE ((vaddr_t)(USER_ASPACE_SIZE >> 3)) ///< 用户空间映射大小 = 1/8 用户空间
#ifndef PAGE_SIZE
#define PAGE_SIZE (0x1000U) // 页大小4K
#define PAGE_SIZE (0x1000U) ///< 页大小4K
#endif
#define PAGE_MASK (~(PAGE_SIZE - 1)) //页掩码,用于页内偏移地址的计算
#define PAGE_SHIFT (12)// 12位 - 4K 偏移
#define PAGE_MASK (~(PAGE_SIZE - 1)) ///< 页掩码,用于页内偏移地址的计算
#define PAGE_SHIFT (12)///< 12位 - 4K 偏移
#define KB (1024UL)
#define MB (1024UL * 1024UL)
......@@ -119,14 +119,14 @@ extern "C" {
ROUNDOFFSET(7,4) = 3 ,ROUNDOFFSET(8,4) = 0 ,ROUNDOFFSET(9,4) = 1
发现规律看明白了吗?
******************************************************************/
#define ROUNDUP(a, b) (((a) + ((b) - 1)) & ~((b) - 1)) //向上圆整
#define ROUNDDOWN(a, b) ((a) & ~((b) - 1)) //向下圆整
#define ROUNDOFFSET(a, b) ((a) & ((b) - 1)) //圆整偏移
#define MIN2(a, b) (((a) < (b)) ? (a) : (b)) //找到最小值
#define ROUNDUP(a, b) (((a) + ((b) - 1)) & ~((b) - 1)) ///< 向上圆整
#define ROUNDDOWN(a, b) ((a) & ~((b) - 1)) ///< 向下圆整
#define ROUNDOFFSET(a, b) ((a) & ((b) - 1)) ///< 圆整偏移
#define MIN2(a, b) (((a) < (b)) ? (a) : (b)) ///< 找到最小值
#define IS_ALIGNED(a, b) (!(((UINTPTR)(a)) & (((UINTPTR)(b)) - 1)))//是否按指定的参数对齐
#define IS_PAGE_ALIGNED(x) IS_ALIGNED(x, PAGE_SIZE) //是否按页大小对齐 4K
#define IS_SECTION_ALIGNED(x) IS_ALIGNED(x, SECTION_SIZE)//是否按段大小对齐
#define IS_ALIGNED(a, b) (!(((UINTPTR)(a)) & (((UINTPTR)(b)) - 1)))///< 是否按指定的参数对齐
#define IS_PAGE_ALIGNED(x) IS_ALIGNED(x, PAGE_SIZE) ///< 是否按页大小对齐 4K
#define IS_SECTION_ALIGNED(x) IS_ALIGNED(x, SECTION_SIZE)///< 是否按段大小对齐
#define LOS_ERRNO_VM_NO_ERROR (0)
#define LOS_ERRNO_VM_GENERIC (-1)
......
......@@ -105,78 +105,78 @@ struct VmFileOps {// 文件操作 见于g_commVmOps
};
struct VmMapRegion {//线性区描述符,内核通过线性区管理虚拟地址,而线性地址就是虚拟地址
LosRbNode rbNode; /**< region red-black tree node */ //红黑树节点,通过它将本线性区挂在VmSpace.regionRbTree
LosVmSpace *space; //所属虚拟空间,虚拟空间由多个线性区组成
LOS_DL_LIST node; /**< region dl list */ //链表节点,通过它将本线性区挂在VmSpace.regions上
LosVmMapRange range; /**< region address range */ //记录线性区的范围
VM_OFFSET_T pgOff; /**< region page offset to file */ //以文件开始处的偏移量, 必须是分页大小的整数倍, 通常为0, 表示从文件头开始映射。
UINT32 regionFlags; /**< region flags: cow, user_wired *///线性区标签
UINT32 shmid; /**< shmid about shared region */ //shmid为共享线性区id,id背后就是共享线性区
UINT8 forkFlags; /**< vm space fork flags: COPY, ZERO, */ //fork的方式
UINT8 regionType; /**< vm region type: ANON, FILE, DEV */ //映射类型是匿名,文件,还是设备,所谓匿名可理解为内存映射
LosRbNode rbNode; /**< region red-black tree node \n 红黑树节点,通过它将本线性区挂在VmSpace.regionRbTree*/
LosVmSpace *space; ///< 所属虚拟空间,虚拟空间由多个线性区组成
LOS_DL_LIST node; /**< region dl list \n 链表节点,通过它将本线性区挂在VmSpace.regions上*/
LosVmMapRange range; /**< region address range \n 记录线性区的范围*/
VM_OFFSET_T pgOff; /**< region page offset to file \n 以文件开始处的偏移量, 必须是分页大小的整数倍, 通常为0, 表示从文件头开始映射。*/
UINT32 regionFlags; /**< region flags: cow, user_wired \n 线性区标签*/
UINT32 shmid; /**< shmid about shared region \n shmid为共享线性区id,id背后就是共享线性区*/
UINT8 forkFlags; /**< vm space fork flags: COPY, ZERO, \n fork的方式*/
UINT8 regionType; /**< vm region type: ANON, FILE, DEV \n 映射类型是匿名,文件,还是设备,所谓匿名可理解为内存映射*/
union {
struct VmRegionFile {//文件映射
int f_oflags;
struct Vnode *vnode;
const LosVmFileOps *vmFOps;//文件处理各操作接口
const LosVmFileOps *vmFOps;///< 文件处理各操作接口
} rf;
struct VmRegionAnon {//匿名映射可理解为就是物理内存
LOS_DL_LIST node; /**< region LosVmPage list */ //线性区虚拟页链表
LOS_DL_LIST node; /**< region LosVmPage list \n 线性区虚拟页链表*/
} ra;
struct VmRegionDev {//设备映射
LOS_DL_LIST node; /**< region LosVmPage list */ //线性区虚拟页链表
const LosVmFileOps *vmFOps; //设备也是一种文件
LOS_DL_LIST node; /**< region LosVmPage list \n 线性区虚拟页链表*/
const LosVmFileOps *vmFOps; ///< 设备也是一种文件
} rd;
} unTypeData;
};
typedef struct VmSpace {
LOS_DL_LIST node; /**< vm space dl list */ //节点,通过它挂到全局虚拟空间 g_vmSpaceList 链表上
LosRbTree regionRbTree; /**< region red-black tree root */ //采用红黑树方式管理本空间各个线性区
LosMux regionMux; /**< region list mutex lock */ //虚拟空间的互斥锁
VADDR_T base; /**< vm space base addr */ //虚拟空间的基地址,常用于判断地址是否在内核还是用户空间
UINT32 size; /**< vm space size */ //虚拟空间大小
VADDR_T heapBase; /**< vm space heap base address */ //用户进程专用,堆区基地址,表堆区范围起点
VADDR_T heapNow; /**< vm space heap base now */ //用户进程专用,堆区结束地址,表堆区范围终点,do_brk()直接修改堆的大小返回新的堆区结束地址, heapNow >= heapBase
LosVmMapRegion *heap; /**< heap region */ //堆区是个特殊的线性区,用于满足进程的动态内存需求,大家熟知的malloc,realloc,free其实就是在操作这个区
VADDR_T mapBase; /**< vm space mapping area base */ //虚拟空间映射区基地址,L1,L2表存放在这个区
UINT32 mapSize; /**< vm space mapping area size */ //虚拟空间映射区大小,映射区是个很大的区。
LosArchMmu archMmu; /**< vm mapping physical memory */ //MMU记录<虚拟地址,物理地址>的映射情况
LOS_DL_LIST node; /**< vm space dl list \n 节点,通过它挂到全局虚拟空间 g_vmSpaceList 链表上*/
LosRbTree regionRbTree; /**< region red-black tree root \n 采用红黑树方式管理本空间各个线性区*/
LosMux regionMux; /**< region list mutex lock \n 虚拟空间的互斥锁*/
VADDR_T base; /**< vm space base addr \n 虚拟空间的基地址,常用于判断地址是否在内核还是用户空间*/
UINT32 size; /**< vm space size \n 虚拟空间大小*/
VADDR_T heapBase; /**< vm space heap base address \n 用户进程专用,堆区基地址,表堆区范围起点*/
VADDR_T heapNow; /**< vm space heap base now \n 用户进程专用,堆区结束地址,表堆区范围终点,do_brk()直接修改堆的大小返回新的堆区结束地址, heapNow >= heapBase*/
LosVmMapRegion *heap; /**< heap region \n 堆区是个特殊的线性区,用于满足进程的动态内存需求,大家熟知的malloc,realloc,free其实就是在操作这个区*/
VADDR_T mapBase; /**< vm space mapping area base \n 虚拟空间映射区基地址,L1,L2表存放在这个区 */
UINT32 mapSize; /**< vm space mapping area size \n 虚拟空间映射区大小,映射区是个很大的区。*/
LosArchMmu archMmu; /**< vm mapping physical memory \n MMU记录<虚拟地址,物理地址>的映射情况 */
#ifdef LOSCFG_DRIVERS_TZDRIVER
VADDR_T codeStart; /**< user process code area start */
VADDR_T codeEnd; /**< user process code area end */
#endif
} LosVmSpace;
#define VM_MAP_REGION_TYPE_NONE (0x0)//初始化使用
#define VM_MAP_REGION_TYPE_ANON (0x1)//匿名映射线性区
#define VM_MAP_REGION_TYPE_FILE (0x2)//文件映射线性区
#define VM_MAP_REGION_TYPE_DEV (0x4)//设备映射线性区
#define VM_MAP_REGION_TYPE_MASK (0x7)//映射线性区掩码
#define VM_MAP_REGION_TYPE_NONE (0x0)///< 初始化使用
#define VM_MAP_REGION_TYPE_ANON (0x1)///< 匿名映射线性区
#define VM_MAP_REGION_TYPE_FILE (0x2)///< 文件映射线性区
#define VM_MAP_REGION_TYPE_DEV (0x4)///< 设备映射线性区
#define VM_MAP_REGION_TYPE_MASK (0x7)///< 映射线性区掩码
/* the high 8 bits(24~31) should reserved, shm will use it */
#define VM_MAP_REGION_FLAG_CACHED (0<<0) //缓冲区
#define VM_MAP_REGION_FLAG_UNCACHED (1<<0) //非缓冲区
#define VM_MAP_REGION_FLAG_CACHED (0<<0) ///< 缓冲区
#define VM_MAP_REGION_FLAG_UNCACHED (1<<0) ///< 非缓冲区
#define VM_MAP_REGION_FLAG_UNCACHED_DEVICE (2<<0) /* only exists on some arches, otherwise UNCACHED */
#define VM_MAP_REGION_FLAG_STRONGLY_ORDERED (3<<0) /* only exists on some arches, otherwise UNCACHED */
#define VM_MAP_REGION_FLAG_CACHE_MASK (3<<0) //缓冲区掩码
#define VM_MAP_REGION_FLAG_PERM_USER (1<<2) //用户区
#define VM_MAP_REGION_FLAG_PERM_READ (1<<3) //可读取区
#define VM_MAP_REGION_FLAG_PERM_WRITE (1<<4) //可写入区
#define VM_MAP_REGION_FLAG_PERM_EXECUTE (1<<5) //可被执行区
#define VM_MAP_REGION_FLAG_PROT_MASK (0xF<<2) //访问权限掩码
#define VM_MAP_REGION_FLAG_CACHE_MASK (3<<0) ///< 缓冲区掩码
#define VM_MAP_REGION_FLAG_PERM_USER (1<<2) ///< 用户区
#define VM_MAP_REGION_FLAG_PERM_READ (1<<3) ///< 可读取区
#define VM_MAP_REGION_FLAG_PERM_WRITE (1<<4) ///< 可写入区
#define VM_MAP_REGION_FLAG_PERM_EXECUTE (1<<5) ///< 可被执行区
#define VM_MAP_REGION_FLAG_PROT_MASK (0xF<<2) ///< 访问权限掩码
#define VM_MAP_REGION_FLAG_NS (1<<6) /* NON-SECURE */
#define VM_MAP_REGION_FLAG_SHARED (1<<7) //MAP_SHARED:把对该内存段的修改保存到磁盘文件中 详见 OsCvtProtFlagsToRegionFlags ,要和 VM_MAP_REGION_FLAG_SHM区别理解
#define VM_MAP_REGION_FLAG_PRIVATE (1<<8) //MAP_PRIVATE:内存段私有,对它的修改值仅对本进程有效,详见 OsCvtProtFlagsToRegionFlags。
#define VM_MAP_REGION_FLAG_FLAG_MASK (3<<7) //掩码
#define VM_MAP_REGION_FLAG_STACK (1<<9) //线性区的类型:栈区
#define VM_MAP_REGION_FLAG_HEAP (1<<10) //线性区的类型:堆区
#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) //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_SHARED (1<<7) ///< MAP_SHARED:把对该内存段的修改保存到磁盘文件中 详见 OsCvtProtFlagsToRegionFlags ,要和 VM_MAP_REGION_FLAG_SHM区别理解
#define VM_MAP_REGION_FLAG_PRIVATE (1<<8) ///< MAP_PRIVATE:内存段私有,对它的修改值仅对本进程有效,详见 OsCvtProtFlagsToRegionFlags。
#define VM_MAP_REGION_FLAG_FLAG_MASK (3<<7) ///< 掩码
#define VM_MAP_REGION_FLAG_STACK (1<<9) ///< 线性区的类型:栈区
#define VM_MAP_REGION_FLAG_HEAP (1<<10) ///< 线性区的类型:堆区
#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) ///< 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_FIXED (1<<17)
#define VM_MAP_REGION_FLAG_FIXED_NOREPLACE (1<<18)
#define VM_MAP_REGION_FLAG_INVALID (1<<19) /* indicates that flags are not specified */
......
......@@ -226,7 +226,6 @@ driverif_input(struct netif *netif, struct pbuf *p)
LWIP_DEBUGF(DRIVERIF_DEBUG, ("driverif_input : received packet is processed\n"));
}
/*
* Should be called at the beginning of the program to set up the
* network interface. It calls the function low_level_init() to do the
......@@ -247,7 +246,7 @@ driverif_init(struct netif *netif)//网络接口驱动层初始化
if (netif == NULL) {
return ERR_IF;
}
link_layer_type = netif->link_layer_type;//链路层类?
link_layer_type = netif->link_layer_type;//链路层类?
LWIP_ERROR("driverif_init : invalid link_layer_type in netif", \
((link_layer_type == ETHERNET_DRIVER_IF) || (link_layer_type == WIFI_DRIVER_IF)), \
return ERR_IF);
......@@ -274,7 +273,7 @@ driverif_init(struct netif *netif)//网络接口驱动层初始化
NETIF_INIT_SNMP(netif, snmp_ifType_ethernet_csmacd, LINK_SPEED_OF_YOUR_NETIF_IN_BPS);
netif->output = etharp_output;//该函数接收来自TCP/IP层的数据
netif->linkoutput = driverif_output;//该函数实现底层数据包的发?
netif->linkoutput = driverif_output;//该函数实现底层数据包的发?
/* init the netif's full name */
driverif_init_ifname(netif);//初始化链路接口层名称
......@@ -294,7 +293,7 @@ driverif_init(struct netif *netif)//网络接口驱动层初始化
#endif
/**
@page RFC-2710 RFC-2710
@brief RFC-2710 RFC-2710
@par Compliant Sections
Section 5. Node State Transition Diagram
@par Behavior Description
......
git add -A
git commit -m ' 注解支持doxygen,输出 http://weharmonyos.com/doxygen
git commit -m ' 修改注解方式,支持doxygen格式
百万汉字注解 + 百篇博客分析 => 挖透鸿蒙内核源码
博客输出站点(国内):http://weharmonyos.com
博客输出站点(国外):https://weharmony.github.io
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册