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

对硬件中断部分源码注释,对CPU各个寄存器功能注释

鸿蒙内核源码分析系列 【 CSDN | OSCHINA | WIKI 】
鸿蒙内核源码注释中文版 【 CSDN仓 | Gitee仓 | Github仓 | Coding仓 】四大仓库每日同步更新代码和wiki
项目给鸿蒙内核源码逐行加上中文注解,详细阐述框架和代码细节, 精读 HarmonyOS 内核源码, 将迅速拔高对计算机整体理解,从此高屋建瓴看问题.
上级 497b2471
......@@ -356,6 +356,8 @@ BOOL OsArchMmuInit(LosArchMmu *archMmu, VADDR_T *virtTtb)
LOS_ListInit(&archMmu->ptList);//初始化页表,双循环进程所有物理页框 LOS_ListAdd(&processCB->vmSpace->archMmu.ptList, &(vmPage->node));
archMmu->virtTtb = virtTtb;//为L1页表在内存位置 section(".bss.prebss.translation_table") UINT8 g_firstPageTable[MMU_DESCRIPTOR_L1_SMALL_ENTRY_NUMBERS]
archMmu->physTtb = (VADDR_T)(UINTPTR)virtTtb - KERNEL_ASPACE_BASE + SYS_MEM_BASE;// TTB寄存器是CP15协处理器的C2寄存器,存页表的基地址
//SYS_MEM_BASE = 0x80000000 KERNEL_ASPACE_BASE = 0x40000000 见于 ..\vendor_hisi_hi35xx_hi3516dv300\config\board\include\board.h
//archMmu->physTtb = (VADDR_T)(UINTPTR)virtTtb + 0x40000000;
return TRUE;
}
//通过虚拟地址查询物理地址
......
......@@ -666,7 +666,7 @@ VOID BackTrace(UINT32 regFP)
//运行初始化
VOID OsExcInit(VOID)
{
OsExcStackInfoReg(g_excStack, sizeof(g_excStack) / sizeof(g_excStack[0]));
OsExcStackInfoReg(g_excStack, sizeof(g_excStack) / sizeof(g_excStack[0]));//内核栈信息注册
}
//由注册后回调
VOID OsExcHook(UINT32 excType, ExcContext *excBufAddr, UINT32 far, UINT32 fsr)
......
......@@ -37,7 +37,7 @@
extern "C" {
#endif /* __cplusplus */
#endif /* __cplusplus */
//节拍初始化
LITE_OS_SEC_TEXT_INIT UINT32 OsTickInit(UINT32 systemClock, UINT32 tickPerSecond)
{
if ((systemClock == 0) ||
......@@ -45,16 +45,16 @@ LITE_OS_SEC_TEXT_INIT UINT32 OsTickInit(UINT32 systemClock, UINT32 tickPerSecond
(tickPerSecond > systemClock)) {
return LOS_ERRNO_TICK_CFG_INVALID;
}
HalClockInit();
HalClockInit();//硬件时钟初始化
return LOS_OK;
}
//启动节拍
LITE_OS_SEC_TEXT_INIT VOID OsTickStart(VOID)
{
HalClockStart();
HalClockStart();//硬件时钟开始工作
}
//获得CPU周期
LITE_OS_SEC_TEXT_MINOR VOID LOS_GetCpuCycle(UINT32 *highCnt, UINT32 *lowCnt)
{
UINT64 cycle = HalClockGetCycles();
......
......@@ -43,57 +43,57 @@ extern "C" {
/**
* @ingroup los_sys
* Number of milliseconds in one second.
* Number of milliseconds in one second.
*/
#define OS_SYS_MS_PER_SECOND 1000
#define OS_SYS_MS_PER_SECOND 1000 //一秒多少毫秒
/**
* @ingroup los_sys
* Number of microseconds in one second.
*/
#define OS_SYS_US_PER_SECOND 1000000
#define OS_SYS_US_PER_SECOND 1000000 //一秒多少微秒
/**
* @ingroup los_sys
* Number of nanoseconds in one second.
*/
#define OS_SYS_NS_PER_SECOND 1000000000
#define OS_SYS_NS_PER_SECOND 1000000000 //一秒多少纳秒
/**
* @ingroup los_sys
* Number of microseconds in one milliseconds.
*/
#define OS_SYS_US_PER_MS 1000
#define OS_SYS_US_PER_MS 1000 //一毫秒都是微秒
/**
* @ingroup los_sys
* Number of nanoseconds in one milliseconds.
*/
#define OS_SYS_NS_PER_MS 1000000
#define OS_SYS_NS_PER_MS 1000000 //一毫秒都是纳秒
/**
* @ingroup los_sys
* Number of nanoseconds in one microsecond.
*/
#define OS_SYS_NS_PER_US 1000
#define OS_SYS_NS_PER_US 1000 //一微秒都是纳秒
/**
* @ingroup los_sys
* The maximum length of name.
*/
#define OS_SYS_APPVER_NAME_MAX 64
#define OS_SYS_APPVER_NAME_MAX 64 //名字的最大长度
/**
* @ingroup los_sys
* The magic word.
*/
#define OS_SYS_MAGIC_WORD 0xAAAAAAAA
#define OS_SYS_MAGIC_WORD 0xAAAAAAAA //魔法数字,还记得栈顶的魔法数字是多少吗? 0xCCCCCCCC
/**
* @ingroup los_sys
* The initialization value of stack space.
*/
#define OS_SYS_EMPTY_STACK 0xCACACACA
#define OS_SYS_EMPTY_STACK 0xCACACACA //栈的填充内容魔法数字
#ifdef __cplusplus
#if __cplusplus
......
......@@ -54,13 +54,13 @@ extern "C" {
| 包括 IO设备 |
| PERIPH_PMM_SIZE |
+----------------------------+ 外围设备基地址 PERIPH_DEVICE_BASE
| |
| Vmalloc段 |
| kernel heap |
| 128M |
| |
+----------------------------+ 内核动态分配开始地址 VMALLOC_START
| DDR_MEM_SIZE |
| |
| Uncached段 |
+----------------------------+ 未缓存虚拟空间基地址 UNCACHED_VMM_BASE
| 内核虚拟空间 |
| KERNEL_VMM_SIZE |
......@@ -82,13 +82,41 @@ extern "C" {
| 16M预留区 |
+----------------------------+ 0x00000000U
见于 ..\vendor_hisi_hi35xx_hi3516dv300\config\board\include\board.h
/* Physical memory address base and size * / //物理内存地址基地址和大小
#ifdef LOSCFG_TEE_ENABLE
#define DDR_MEM_ADDR 0x81000000
#define DDR_MEM_SIZE 0x1f000000
#else
#define DDR_MEM_ADDR 0x80000000
#define DDR_MEM_SIZE 0x20000000 //512M
#endif
/* Peripheral register address base and size * / 外围寄存器地址基和大小
#define PERIPH_PMM_BASE 0x10000000 // 256M
#define PERIPH_PMM_SIZE 0x10000000 // 256M
#ifdef LOSCFG_TEE_ENABLE
#define KERNEL_VADDR_BASE 0x41000000
#else
#define KERNEL_VADDR_BASE 0x40000000
#endif
#define KERNEL_VADDR_SIZE DDR_MEM_SIZE //512M
#define SYS_MEM_BASE DDR_MEM_ADDR //0x80000000
#define SYS_MEM_SIZE_DEFAULT 0x07f00000 //127M
#define SYS_MEM_END (SYS_MEM_BASE + SYS_MEM_SIZE_DEFAULT) //0x87f00000
#define EXC_INTERACT_MEM_SIZE 0x100000 //1M
*******************************************************************************************************/
#define DEFINE_(X) X##U
#define DEFINE(X) DEFINE_(X)
#define KERNEL_VMM_BASE DEFINE(KERNEL_VADDR_BASE)//内核虚拟内存开始位置
#define KERNEL_VMM_BASE DEFINE(KERNEL_VADDR_BASE)//内核虚拟内存开始位置 //0x40000000
#define KERNEL_VMM_SIZE DEFINE(KERNEL_VADDR_SIZE)//内核虚拟内存大小
#define KERNEL_ASPACE_BASE KERNEL_VMM_BASE //内核空间开始地址
......
......@@ -130,7 +130,7 @@ VOID OsExcStackInfo(VOID)
//注册栈信息
VOID OsExcStackInfoReg(const StackInfo *stackInfo, UINT32 stackNum)
{
g_stackInfo = stackInfo;
g_stackInfo = stackInfo; //g_excStack
g_stackNum = stackNum;
}
//task栈的初始化,设置固定的值. 0xcccccccc 和 0xcacacaca
......
......@@ -131,11 +131,11 @@ extern "C" {
extern UINT32 OsSystemInit(VOID);
extern VOID SystemInit(VOID);
//注册 HZ , tick
LITE_OS_SEC_TEXT_INIT VOID osRegister(VOID)
{
g_sysClock = OS_SYS_CLOCK;
g_tickPerSecond = LOSCFG_BASE_CORE_TICK_PER_SECOND;
g_sysClock = OS_SYS_CLOCK; //HZ
g_tickPerSecond = LOSCFG_BASE_CORE_TICK_PER_SECOND;//每秒节拍数 默认100 即一个tick = 10ms
return;
}
......
......@@ -69,8 +69,8 @@ extern UINT32 __heap_end; // 堆区结束地址
* @ingroup los_config
* System clock (unit: HZ)
*/
#ifndef OS_SYS_CLOCK
#define OS_SYS_CLOCK (get_bus_clk())
#ifndef OS_SYS_CLOCK //HZ:是每秒中的周期性变动重复次数的计量
#define OS_SYS_CLOCK (get_bus_clk()) //50000000 即50微秒 见于 ..\vendor_hisi_hi35xx_hi3516dv300\config\board\include\hisoc\clock.h
#endif
/**
* @ingroup los_config
......@@ -315,7 +315,7 @@ extern UINT32 __heap_end; // 堆区结束地址
/****************************** Memory module configuration **************************/
#ifndef OS_EXC_INTERACTMEM_SIZE
#define OS_EXC_INTERACTMEM_SIZE (EXC_INTERACT_MEM_SIZE)
#define OS_EXC_INTERACTMEM_SIZE (EXC_INTERACT_MEM_SIZE) //0x100000 //1M
#endif
/**
* @ingroup los_config
......
......@@ -87,7 +87,7 @@
#endif
#define OS_CYCLE_PER_TICK (g_sysClock / LOSCFG_BASE_CORE_TICK_PER_SECOND)
#define OS_CYCLE_PER_TICK (g_sysClock / LOSCFG_BASE_CORE_TICK_PER_SECOND) //每个tick多少周期
UINT32 HalClockFreqRead(VOID)
{
......@@ -126,18 +126,18 @@ UINT64 HalClockGetCycles(VOID)
cntpct = READ_TIMER_REG64(TIMER_REG_CT);
return cntpct;
}
//节拍回调函数
LITE_OS_SEC_TEXT VOID OsTickEntry(VOID)
{
TimerCtlWrite(0);
OsTickHandler();
OsTickHandler();//节拍处理主体函数
/*
/* //使用最近的 cval生成下一个tick的计时是绝对和准确的。
* use last cval to generate the next tick's timing is
* absolute and accurate. DO NOT use tval to drive the
* generic time in which case tick will be slower.
*/
*///不要使用tval来产生时间,在这种情况下,滴答声会变慢
TimerCvalWrite(TimerCvalRead() + OS_CYCLE_PER_TICK);
TimerCtlWrite(1);
}
......@@ -146,7 +146,7 @@ LITE_OS_SEC_TEXT_INIT VOID HalClockInit(VOID)
{
UINT32 ret;
g_sysClock = HalClockFreqRead();
g_sysClock = HalClockFreqRead();//读时间
ret = LOS_HwiCreate(OS_TICK_INT_NUM, MIN_INTERRUPT_PRIORITY, 0, OsTickEntry, 0);
if (ret != LOS_OK) {
PRINT_ERR("%s, %d create tick irq failed, ret:0x%x\n", __FUNCTION__, __LINE__, ret);
......
......@@ -81,11 +81,11 @@ VOID OsTickEntry(VOID)
/* clear private timer */
g_privateTimer->intStatus = 0x01;
}
//硬件时钟初始化
VOID HalClockInit(VOID)
{
UINT32 ret;
//创建一个硬时钟
ret = LOS_HwiCreate(PRVTIMER_INT_NUM, 0xa0, 0, OsTickEntry, NULL);
if (ret != LOS_OK) {
PRINT_ERR("%s, %d create tick irq failed, ret:0x%x\n", __FUNCTION__, __LINE__, ret);
......
......@@ -51,8 +51,9 @@ extern "C" {
STATIC CmdModInfo g_cmdInfo;
LOS_HAL_TABLE_BEGIN(g_shellcmd, shellcmd);
LOS_HAL_TABLE_END(g_shellcmdEnd, shellcmd);
LOS_HAL_TABLE_BEGIN(g_shellcmd, shellcmd);//硬件抽象层表开始 ,其中是两个汇编语句 直接编译到代码段指定位置
LOS_HAL_TABLE_END(g_shellcmdEnd, shellcmd);//硬件抽象层表结束
CmdModInfo *OsCmdInfoGet(VOID)
{
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册