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

对 cpu sortlink 部分代码注释

鸿蒙内核源码分析系列 【 CSDN | OSCHINA | WIKI 】
鸿蒙内核源码注释中文版 【 CSDN仓 | Gitee仓 | Github仓 | Coding仓 】四大仓库每日同步更新代码和wiki
项目给鸿蒙内核源码逐行加上中文注解,详细阐述框架和代码细节, 精读 HarmonyOS 内核源码, 将迅速拔高对计算机整体理解,从此高屋建瓴看问题.
上级 6e00749b
......@@ -45,14 +45,14 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsSortLinkInit(SortLinkAttribute *sortLinkHeader)
LOS_DL_LIST *listObject = NULL;
UINT32 index;
size = sizeof(LOS_DL_LIST) << OS_TSK_SORTLINK_LOGLEN;//这行代码很精彩,得到 8个 LOS_DL_LIST
listObject = (LOS_DL_LIST *)LOS_MemAlloc(m_aucSysMem0, size); /* system resident resource *///常驻内存
size = sizeof(LOS_DL_LIST) << OS_TSK_SORTLINK_LOGLEN;//这行代码很精彩, size=64个字节 每个LOS_DL_LIST8个字节,即等于 8个LOS_DL_LIST
listObject = (LOS_DL_LIST *)LOS_MemAlloc(m_aucSysMem0, size); /* system resident resource *///常驻内存 size表示字节的意思
if (listObject == NULL) {
return LOS_NOK;
}
(VOID)memset_s(listObject, size, 0, size);//清0
sortLinkHeader->sortLink = listObject;//可以知道 sortLink是个链表数组
sortLinkHeader->sortLink = listObject;//可以知道 sortLink是个链表数组,这个很重要
sortLinkHeader->cursor = 0;//游标默认为0
for (index = 0; index < OS_TSK_SORTLINK_LEN; index++, listObject++) {// OS_TSK_SORTLINK_LEN = 8
LOS_ListInit(listObject);//初始化8个链表
......@@ -92,7 +92,7 @@ LITE_OS_SEC_TEXT VOID OsAdd2SortLink(const SortLinkAttribute *sortLinkHeader, So
} else {
listSorted = LOS_DL_LIST_ENTRY(listObject->pstNext, SortLinkList, sortLinkNode);//取出SortLinkList
do {
if (ROLLNUM(listSorted->idxRollNum) <= ROLLNUM(sortList->idxRollNum)) {// @note_? 这块没看懂,谁能帮帮我
if (ROLLNUM(listSorted->idxRollNum) <= ROLLNUM(sortList->idxRollNum)) {// @note_why 这块没看懂,谁能帮帮我
ROLLNUM_SUB(sortList->idxRollNum, listSorted->idxRollNum);
} else {
ROLLNUM_SUB(listSorted->idxRollNum, sortList->idxRollNum);
......@@ -110,7 +110,7 @@ LITE_OS_SEC_TEXT STATIC VOID OsCheckSortLink(const LOS_DL_LIST *listHead, const
{
LOS_DL_LIST *tmp = listNode->pstPrev;
/* recursive check until double link round to itself */
/* recursive check until double link round to itself */ //递归检查,直到双链接循环到自身
while (tmp != listNode) {
if (tmp == listHead) {
goto FOUND;
......@@ -125,17 +125,17 @@ LITE_OS_SEC_TEXT STATIC VOID OsCheckSortLink(const LOS_DL_LIST *listHead, const
FOUND:
return;
}
//删除排序链表
LITE_OS_SEC_TEXT VOID OsDeleteSortLink(const SortLinkAttribute *sortLinkHeader, SortLinkList *sortList)
{
LOS_DL_LIST *listObject = NULL;
SortLinkList *nextSortList = NULL;
UINT32 sortIndex;
sortIndex = SORT_INDEX(sortList->idxRollNum);
listObject = sortLinkHeader->sortLink + sortIndex;
sortIndex = SORT_INDEX(sortList->idxRollNum);//找出对应索引,索引是通过滚动的idxRollNum来定位的
listObject = sortLinkHeader->sortLink + sortIndex;//找出索引对应的链表
/* check if pstSortList node is on the right sortlink */
/* check if pstSortList node is on the right sortlink */ //检查pstSortList节点是否在正确的sortlink上
OsCheckSortLink(listObject, &sortList->sortLinkNode);
if (listObject != sortList->sortLinkNode.pstNext) {
......
......@@ -165,20 +165,20 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsSwtmrInit(VOID)
/*
* Description: Start Software Timer
* Input : swtmr --- Need to start software timer
*/
*/ //开始定时器
LITE_OS_SEC_TEXT VOID OsSwtmrStart(SWTMR_CTRL_S *swtmr)
{
if ((swtmr->ucOverrun == 0) && ((swtmr->ucMode == LOS_SWTMR_MODE_ONCE) ||
(swtmr->ucMode == LOS_SWTMR_MODE_OPP) ||
(swtmr->ucMode == LOS_SWTMR_MODE_NO_SELFDELETE))) {
SET_SORTLIST_VALUE(&(swtmr->stSortList), swtmr->uwExpiry);
SET_SORTLIST_VALUE(&(swtmr->stSortList), swtmr->uwExpiry);//设置过期时间
} else {
SET_SORTLIST_VALUE(&(swtmr->stSortList), swtmr->uwInterval);
}
OsAdd2SortLink(&OsPercpuGet()->swtmrSortLink, &swtmr->stSortList);
OsAdd2SortLink(&OsPercpuGet()->swtmrSortLink, &swtmr->stSortList); //通过stSortList节点挂到CPU的软件定时器排序链表上
swtmr->ucState = OS_SWTMR_STATUS_TICKING;
swtmr->ucState = OS_SWTMR_STATUS_TICKING;//定时器状态成正在 ticking 中
#if (LOSCFG_KERNEL_SMP == YES)
swtmr->uwCpuid = ArchCurrCpuid();
......@@ -279,24 +279,24 @@ LITE_OS_SEC_TEXT UINT32 OsSwtmrGetNextTimeout(VOID)//获取下一个timeout
/*
* Description: Stop of Software Timer interface
* Input : swtmr --- the software timer contrl handler
*/
*/ //停止定时器
LITE_OS_SEC_TEXT STATIC VOID OsSwtmrStop(SWTMR_CTRL_S *swtmr)
{
SortLinkAttribute *sortLinkHeader = NULL;
#if (LOSCFG_KERNEL_SMP == YES)
/*
* the timer is running on the specific processor,
* we need delete the timer from that processor's sortlink.
* the timer is running on the specific processor, //计时器正在特定处理器上运行
* we need delete the timer from that processor's sortlink. //我们需要从处理器的sortlink中删除计时器
*/
sortLinkHeader = &g_percpu[swtmr->uwCpuid].swtmrSortLink;
sortLinkHeader = &g_percpu[swtmr->uwCpuid].swtmrSortLink;//找到定时器所属CPU的 sortlind
#else
sortLinkHeader = &g_percpu[0].swtmrSortLink;
#endif
OsDeleteSortLink(sortLinkHeader, &swtmr->stSortList);
OsDeleteSortLink(sortLinkHeader, &swtmr->stSortList);//将自己摘出去
swtmr->ucState = OS_SWTMR_STATUS_CREATED;
swtmr->ucOverrun = 0;
swtmr->ucState = OS_SWTMR_STATUS_CREATED;//状态变成已创建,又可以再利用.
swtmr->ucOverrun = 0;//计次器清0
}
/*
......@@ -359,13 +359,13 @@ LITE_OS_SEC_TEXT_INIT UINT32 LOS_SwtmrCreate(UINT32 interval,
SWTMR_UNLOCK(intSave);
swtmr->uwOwnerPid = OsCurrProcessGet()->processID;//定时器进程归属设定
swtmr->pfnHandler = handler;
swtmr->ucMode = mode;
swtmr->ucOverrun = 0;
swtmr->uwInterval = interval;
swtmr->uwExpiry = interval;
swtmr->uwArg = arg;
swtmr->ucState = OS_SWTMR_STATUS_CREATED;
swtmr->pfnHandler = handler;//时间到了的回调函数
swtmr->ucMode = mode; //定时器模式
swtmr->ucOverrun = 0; //重复计时的次数
swtmr->uwInterval = interval; //周期性超时间隔
swtmr->uwExpiry = interval; //一次性超时间隔
swtmr->uwArg = arg; //回调函数的参数
swtmr->ucState = OS_SWTMR_STATUS_CREATED; //已创建状态
SET_SORTLIST_VALUE(&(swtmr->stSortList), 0);
*swtmrID = swtmr->usTimerID;
......
......@@ -75,7 +75,7 @@ typedef struct {
UINT16 queueTail; /**< Node tail */ //队列尾部节点
UINT16 readWriteableCnt[OS_QUEUE_N_RW]; /**< Count of readable or writable resources, 0:readable, 1:writable */
LOS_DL_LIST readWriteList[OS_QUEUE_N_RW]; /**< the linked list to be read or written, 0:readlist, 1:writelist */
LOS_DL_LIST memList; /**< Pointer to the memory linked list */ //@note_? 这么尚未搞明白是啥意思
LOS_DL_LIST memList; /**< Pointer to the memory linked list */ //@note_why 这里尚未搞明白是啥意思
} LosQueueCB;//读写队列分离
/* queue state */
......
......@@ -81,7 +81,8 @@ extern "C" {
#define SET_SORTLIST_VALUE(sortList, value) (((SortLinkList *)(sortList))->idxRollNum = (value))
/**************************************** @note_pic
sortLink
sortLink[0:7]
+-------->+-----------------+
| sortLinkNode |
+-----------------+
......@@ -106,7 +107,7 @@ typedef struct {
UINT32 idxRollNum; //滚动数
} SortLinkList;
typedef struct {
LOS_DL_LIST *sortLink;//排序节点
LOS_DL_LIST *sortLink;//排序链表,看上图它指向的结构.
UINT16 cursor; //游标
UINT16 reserved; //保留用
} SortLinkAttribute;
......
......@@ -105,7 +105,7 @@ VOID OsExcStackInfo(VOID)
OsExcStackCheck();
}
/***************************************************************************************@note_pic
/*************************************************************************************** @note_pic
OsExcStackInfo 各个CPU栈布局图,其他栈也是一样,CPU各核硬件栈都是紧挨着
__undef_stack(SMP)
+-------------------+ <--- cpu1 top
......
......@@ -229,10 +229,10 @@ extern "C" {
* Software timer mode
*/
enum enSwTmrType {
LOS_SWTMR_MODE_ONCE, /**< One-off software timer */
LOS_SWTMR_MODE_PERIOD, /**< Periodic software timer */
LOS_SWTMR_MODE_NO_SELFDELETE, /**< One-off software timer, but not self-delete */
LOS_SWTMR_MODE_OPP /**< After the one-off timer finishes timing,
LOS_SWTMR_MODE_ONCE, /**< One-off software timer */ //一次性的软件计时器
LOS_SWTMR_MODE_PERIOD, /**< Periodic software timer */ //周期性的软件计时器
LOS_SWTMR_MODE_NO_SELFDELETE, /**< One-off software timer, but not self-delete */ //一次性软件计时器,但不能自删除
LOS_SWTMR_MODE_OPP /**< After the one-off timer finishes timing, //一次性完成后启用周期性软件计时器,鸿蒙目前暂时不支持这种方式
the periodic software timer is enabled.
This mode is not supported temporarily. */
};
......@@ -257,27 +257,27 @@ enum enSwTmrType {
* <ul><li>los_swtmr.h: the header file that contains the API declaration.</li></ul>
* @see None.
*/
typedef VOID (*SWTMR_PROC_FUNC)(UINTPTR arg);
typedef VOID (*SWTMR_PROC_FUNC)(UINTPTR arg); //函数指针, 赋值给 SWTMR_CTRL_S->pfnHandler,回调处理
/**
* @ingroup los_swtmr
* Software timer control structure
*/
typedef struct tagSwTmrCtrl {
typedef struct tagSwTmrCtrl {// @note_why 鸿蒙内核经常出现 uc uw 这样的变量前缀命名,到底是什么意思?
SortLinkList stSortList;
UINT8 ucState; /**< Software timer state */
UINT8 ucMode; /**< Software timer mode */
UINT8 ucOverrun; /**< Times that a software timer repeats timing */
UINT16 usTimerID; /**< Software timer ID */
UINT32 uwCount; /**< Times that a software timer works */
UINT32 uwInterval; /**< Timeout interval of a periodic software timer */
UINT32 uwExpiry; /**< Timeout interval of an one-off software timer */
UINT8 ucState; /**< Software timer state */ //软件计时器的状态
UINT8 ucMode; /**< Software timer mode */ //软件计时器的模式
UINT8 ucOverrun; /**< Times that a software timer repeats timing */ //软件计时器重复计时的次数
UINT16 usTimerID; /**< Software timer ID */ //软件计时器ID,唯一标识,由软件计时器池分配
UINT32 uwCount; /**< Times that a software timer works */ //软件计时器工作的时间
UINT32 uwInterval; /**< Timeout interval of a periodic software timer */ //周期性软件计时器的超时间隔
UINT32 uwExpiry; /**< Timeout interval of an one-off software timer */ //一次性软件计时器的超时间隔
#if (LOSCFG_KERNEL_SMP == YES)
UINT32 uwCpuid; /**< The cpu where the timer running on */
UINT32 uwCpuid; /**< The cpu where the timer running on */ //多核情况下,定时器运行的cpu
#endif
UINTPTR uwArg; /**< Parameter passed in when the callback function
UINTPTR uwArg; /**< Parameter passed in when the callback function //回调函数的参数
that handles software timer timeout is called */
SWTMR_PROC_FUNC pfnHandler; /**< Callback function that handles software timer timeout */
SWTMR_PROC_FUNC pfnHandler; /**< Callback function that handles software timer timeout */ //处理软件计时器超时的回调函数
UINT32 uwOwnerPid; /** Owner of this software timer */
} SWTMR_CTRL_S;
......
git add -A
git commit -m '开始对IPC Futex 部分代码注释,鸿蒙提供了多种IPC方式
git commit -m '对 cpu sortlink 部分代码注释
鸿蒙内核源码分析系列 【 CSDN | OSCHINA | WIKI 】
鸿蒙内核源码注释中文版 【 CSDN仓 | Gitee仓 | Github仓 | Coding仓 】四大仓库每日同步更新代码和wiki
项目给鸿蒙内核源码逐行加上中文注解,详细阐述框架和代码细节, 精读 HarmonyOS 内核源码, 将迅速拔高对计算机整体理解,从此高屋建瓴看问题.'
......
......@@ -5,6 +5,11 @@ typedef unsigned long PTE_T;
typedef unsigned long VADDR_T;
#define IS_ALIGNED(a, b) (!(((UINTPTR)(a)) & (((UINTPTR)(b)) - 1)))
typedef struct LOS_DL_LIST {
struct LOS_DL_LIST *pstPrev; /**< Current node's pointer to the previous node */
struct LOS_DL_LIST *pstNext; /**< Current node's pointer to the next node */
} LOS_DL_LIST;
//鸿蒙内核源码分析系列篇 https://blog.csdn.net/kuangyufei
void b(){
......@@ -17,6 +22,9 @@ void b(){
#define MMU_DESCRIPTOR_L1_SMALL_FRAME (~MMU_DESCRIPTOR_L1_SMALL_MASK)
#define MMU_DESCRIPTOR_L1_SMALL_SHIFT 20
#define MMU_DESCRIPTOR_L1_SECTION_ADDR(x) ((x) & MMU_DESCRIPTOR_L1_SMALL_FRAME)
#define OS_TSK_HIGH_BITS 3U
#define OS_TSK_LOW_BITS (32U - OS_TSK_HIGH_BITS) //29
#define OS_TSK_SORTLINK_LOGLEN OS_TSK_HIGH_BITS //3U
PTE_T l1Entry = pte1BasePtr + vaddr >> MMU_DESCRIPTOR_L1_SMALL_SHIFT;
printf("pte1BasePtr ad: %x\n",&pte1BasePtr);
......@@ -43,16 +51,13 @@ void round1(){
//printf("ROUNDUP %d\n",ROUNDUP(9, 2));
//printf("ROUNDDOWN %d\n",ROUNDDOWN(9, 2));
}
int aw;
int bw=99;
void Print(){
printf("ROUNDUP %d\n",ROUNDUP(0x00000200+512,1024));
}
int main()
{
int b = 0;
//printf("ROUNDUP %d\n",ROUNDUP(0x00000200+512,1024));
Print();
int size = 0;
size = sizeof(LOS_DL_LIST) << OS_TSK_SORTLINK_LOGLEN;
printf("LOS_DL_LIST %d\n",sizeof(LOS_DL_LIST *));
printf("size %d\n",size);
return 0;
}
文件已添加
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册