diff --git a/bsd/dev/usb/usb_debug.c b/bsd/dev/usb/usb_debug.c
index e715de309d864f178ee5bd438589eff1c3025e1f..7b3377a06e8bb965631449b59af9a21efb610628 100644
--- a/bsd/dev/usb/usb_debug.c
+++ b/bsd/dev/usb/usb_debug.c
@@ -1 +1 @@
-../../../../../third_party/FreeBSD/sys/dev/usb/usb_debug.c
\ No newline at end of file
+../../../../../third_party/FreeBSD/sys/dev/usb/usb_debug.c
diff --git a/bsd/dev/usb/usb_dev.c b/bsd/dev/usb/usb_dev.c
index 87796e1ba3e252a8c558deb38771409bdb3db05a..6967eae5cc67dde36970c06787bb68136b1aec4a 100644
--- a/bsd/dev/usb/usb_dev.c
+++ b/bsd/dev/usb/usb_dev.c
@@ -1 +1 @@
-../../../../../third_party/FreeBSD/sys/dev/usb/usb_dev.c
\ No newline at end of file
+../../../../../third_party/FreeBSD/sys/dev/usb/usb_dev.c
diff --git a/bsd/dev/usb/usb_device.c b/bsd/dev/usb/usb_device.c
index fb9877ec5971669b9b34a4d88861f176dcc6ef92..cf2a60fbc232fad0a92059ae85515ea24dfa972f 100644
--- a/bsd/dev/usb/usb_device.c
+++ b/bsd/dev/usb/usb_device.c
@@ -1 +1 @@
-../../../../../third_party/FreeBSD/sys/dev/usb/usb_device.c
\ No newline at end of file
+../../../../../third_party/FreeBSD/sys/dev/usb/usb_device.c
diff --git a/compat/posix/src/time.c b/compat/posix/src/time.c
index 92194f285912dfc6d64c87f1d10b764aedcfbb4a..375f2ee1568e85c428fa85ff2dd9afc1a5adf4e0 100644
--- a/compat/posix/src/time.c
+++ b/compat/posix/src/time.c
@@ -133,11 +133,11 @@ STATIC const long long g_adjPacement = (((LOSCFG_BASE_CORE_ADJ_PER_SECOND * SCHE
LOSCFG_BASE_CORE_TICK_PER_SECOND) * OS_SYS_NS_PER_US);
/* accumulative time delta from continuous modify, such as adjtime */
-STATIC struct timespec64 g_accDeltaFromAdj;
+STATIC struct timespec64 g_accDeltaFromAdj;//连续修改的累积时间增量,例如 adjtime
/* accumulative time delta from discontinuous modify, such as settimeofday */
-STATIC struct timespec64 g_accDeltaFromSet;
+STATIC struct timespec64 g_accDeltaFromSet;//来自不连续修改的累积时间增量,例如 settimeofday
-VOID OsAdjTime(VOID)
+VOID OsAdjTime(VOID)//时间调整
{
UINT32 intSave;
@@ -272,12 +272,12 @@ STATIC INLINE struct timespec64 OsTimeSpecSub(const struct timespec64 t1, const
return ret;
}
-
+//获取硬件时间
STATIC VOID OsGetHwTime(struct timespec64 *hwTime)
{
UINT64 nowNsec;
- nowNsec = LOS_CurrNanosec();
+ nowNsec = LOS_CurrNanosec();//当前纳秒
hwTime->tv_sec = nowNsec / OS_SYS_NS_PER_SECOND;
hwTime->tv_nsec = nowNsec - hwTime->tv_sec * OS_SYS_NS_PER_SECOND;
}
@@ -1096,7 +1096,7 @@ int getitimer(int which, struct itimerval *value)
}
#ifdef LOSCFG_KERNEL_VDSO
-VOID OsVdsoTimeGet(VdsoDataPage *vdsoDataPage)
+VOID OsVdsoTimeGet(VdsoDataPage *vdsoDataPage)//获取数据页信息
{
UINT32 intSave;
struct timespec64 tmp = {0};
@@ -1109,11 +1109,11 @@ VOID OsVdsoTimeGet(VdsoDataPage *vdsoDataPage)
OsGetHwTime(&hwTime);
LOS_SpinLockSave(&g_timeSpin, &intSave);
- tmp = OsTimeSpecAdd(hwTime, g_accDeltaFromAdj);
+ tmp = OsTimeSpecAdd(hwTime, g_accDeltaFromAdj);//添加时间
vdsoDataPage->monoTimeSec = tmp.tv_sec;
vdsoDataPage->monoTimeNsec = tmp.tv_nsec;
- tmp = OsTimeSpecAdd(tmp, g_accDeltaFromSet);
+ tmp = OsTimeSpecAdd(tmp, g_accDeltaFromSet);//添加时间
vdsoDataPage->realTimeSec = tmp.tv_sec;
vdsoDataPage->realTimeNsec = tmp.tv_nsec;
LOS_SpinUnlockRestore(&g_timeSpin, intSave);
diff --git a/fs/include/fs/mount.h b/fs/include/fs/mount.h
index d6581a50e77cb422c58063dd34e00e0fba7d2f63..27dbda769cbc060efdcc93c1ea2a0dffa4060b17 100644
--- a/fs/include/fs/mount.h
+++ b/fs/include/fs/mount.h
@@ -52,7 +52,7 @@ struct Mount {//装载
int vnodeSize; /* size of vnode list */ //节点数量
LIST_HEAD activeVnodeList; /* list of active vnodes */ //激活的节点链表
int activeVnodeSize; /* szie of active vnodes list *///激活的节点数量
- void *data; /* private data */ //私有数据
+ void *data; /* private data */ //私有数据,可使用这个成员作为一个指向它们自己内部数据的指针
uint32_t hashseed; /* Random seed for vfs hash */ //vfs 哈希随机种子
unsigned long mountFlags; /* Flags for mount */ //装载标签
char pathName[PATH_MAX]; /* path name of mount point */ //装载点路径名称
diff --git a/fs/vfs/operation/fs_init.c b/fs/vfs/operation/fs_init.c
index 78f132cac69b63d03fc2e927bd3488fd43e9bd14..2674092224357d3917c6df938b50b4dc45b82d3c 100644
--- a/fs/vfs/operation/fs_init.c
+++ b/fs/vfs/operation/fs_init.c
@@ -105,4 +105,4 @@ void los_vfs_init(void)//只能调用一次,多次调用将会造成文件系
g_vfs_init = true;
}
-LOS_MODULE_INIT(los_vfs_init, LOS_INIT_LEVEL_KMOD_BASIC);
+LOS_MODULE_INIT(los_vfs_init, LOS_INIT_LEVEL_KMOD_BASIC);//文件模块初始化
diff --git a/kernel/base/core/los_task.c b/kernel/base/core/los_task.c
index b42f7486c796310d9e25e0c39b6e3b356db7d98d..f0beda06250353485c692d002447c602b1be5a35 100644
--- a/kernel/base/core/los_task.c
+++ b/kernel/base/core/los_task.c
@@ -1776,4 +1776,4 @@ LITE_OS_SEC_TEXT UINT32 OsResourceFreeTaskCreate(VOID)
return ret;
}
-LOS_MODULE_INIT(OsResourceFreeTaskCreate, LOS_INIT_LEVEL_KMOD_TASK);
+LOS_MODULE_INIT(OsResourceFreeTaskCreate, LOS_INIT_LEVEL_KMOD_TASK);//资源回收任务初始化
diff --git a/kernel/base/mp/los_mp.c b/kernel/base/mp/los_mp.c
index 3ca90c3eaa6e3816bf81dc754204e93c58de5099..df659eafb72490f83527492cde21c9ea5e1b767c 100644
--- a/kernel/base/mp/los_mp.c
+++ b/kernel/base/mp/los_mp.c
@@ -123,7 +123,7 @@ UINT32 OsMpInit(VOID)
return LOS_OK;
}
-LOS_MODULE_INIT(OsMpInit, LOS_INIT_LEVEL_KMOD_TASK);
+LOS_MODULE_INIT(OsMpInit, LOS_INIT_LEVEL_KMOD_TASK);//多处理器模块初始化
#endif
diff --git a/kernel/base/sched/sched_sq/los_sched.c b/kernel/base/sched/sched_sq/los_sched.c
index cd530f36f5b1fa9864e2e792df1c3d6536180e51..13e7a82c60cc9474fa0b0b6304b2e2d5b0e93818 100644
--- a/kernel/base/sched/sched_sq/los_sched.c
+++ b/kernel/base/sched/sched_sq/los_sched.c
@@ -812,7 +812,7 @@ UINT32 OsSchedInit(VOID)
#endif
return LOS_OK;
}
-
+//获取优先级最高的任务
STATIC LosTaskCB *OsGetTopTask(VOID)
{
UINT32 priority, processPriority;
@@ -849,7 +849,7 @@ FIND_TASK:
OsSchedDeTaskQueue(newTask, OS_PCB_FROM_PID(newTask->processID));
return newTask;
}
-
+//开始调度,每个CPU核都会执行这个函数一次.
VOID OsSchedStart(VOID)
{
UINT32 cpuid = ArchCurrCpuid();
diff --git a/kernel/base/vm/los_vm_dump.c b/kernel/base/vm/los_vm_dump.c
index d1a549b7be74d1ba52433f9b29eff232e9042891..2645980796e944c04e0cddd4db8fc44ef24cefc2 100644
--- a/kernel/base/vm/los_vm_dump.c
+++ b/kernel/base/vm/los_vm_dump.c
@@ -80,7 +80,7 @@ const CHAR *OsGetRegionNameOrFilePath(LosVmMapRegion *region)
}
return "";
}
-
+//
INT32 OsRegionOverlapCheckUnlock(LosVmSpace *space, LosVmMapRegion *region)
{
LosVmMapRegion *regionTemp = NULL;
diff --git a/kernel/base/vm/oom.c b/kernel/base/vm/oom.c
index 55422c9ed85a324c88f176ec558f3280508044d6..951dbddb6733c977366947f8fa0e7eaf341fc972 100644
--- a/kernel/base/vm/oom.c
+++ b/kernel/base/vm/oom.c
@@ -247,7 +247,7 @@ LITE_OS_SEC_TEXT_MINOR UINT32 OomTaskInit(VOID)
#endif
}
-LOS_MODULE_INIT(OomTaskInit, LOS_INIT_LEVEL_KMOD_TASK);
+LOS_MODULE_INIT(OomTaskInit, LOS_INIT_LEVEL_KMOD_TASK);//初始化内存监控模块
#endif
diff --git a/kernel/base/vm/shm.c b/kernel/base/vm/shm.c
index 371776934775dd75923755225c10c93325163111..e0ae77d6ef5041a3a22110da57a1168ff1166877 100644
--- a/kernel/base/vm/shm.c
+++ b/kernel/base/vm/shm.c
@@ -179,9 +179,9 @@ ERROR:
VM_ERR("ShmInit fail\n");
return LOS_NOK;
}
-//共享内存反初始化
-LOS_MODULE_INIT(ShmInit, LOS_INIT_LEVEL_VM_COMPLETE);
+LOS_MODULE_INIT(ShmInit, LOS_INIT_LEVEL_VM_COMPLETE);//共享内存模块初始化
+//共享内存反初始化
UINT32 ShmDeinit(VOID)
{
UINT32 ret;
diff --git a/kernel/common/los_hilog.c b/kernel/common/los_hilog.c
index 9fa7db987e489504279c3c2ee5836817346e9f96..1d60d2598cf00e3b30729d9f190f3b014d818a2a 100644
--- a/kernel/common/los_hilog.c
+++ b/kernel/common/los_hilog.c
@@ -144,12 +144,12 @@ static int HiLogBufferCopy(unsigned char *dst, unsigned dstLen, unsigned char *s
}
return retval;
}
-
+//读取ring buffer
static int HiLogReadRingBuffer(unsigned char *buffer, size_t bufLen)
{
size_t retval;
size_t bufLeft = HILOG_BUFFER - g_hiLogDev.headOffset;
- if (bufLeft > bufLen) {
+ if (bufLeft > bufLen) {//计算出读取方向
retval = HiLogBufferCopy(buffer, bufLen, HiLogBufferHead(), bufLen);
} else {
retval = HiLogBufferCopy(buffer, bufLen, HiLogBufferHead(), bufLeft);
@@ -336,4 +336,4 @@ int OsHiLogDriverInit(VOID)
return register_driver(HILOG_DRIVER, &g_hilogFops, DRIVER_MODE, NULL);//注册字符设备驱动程序,生成inode节点
}
-LOS_MODULE_INIT(OsHiLogDriverInit, LOS_INIT_LEVEL_KMOD_EXTENDED);
+LOS_MODULE_INIT(OsHiLogDriverInit, LOS_INIT_LEVEL_KMOD_EXTENDED);//日志模块初始化
diff --git a/kernel/common/los_init.h b/kernel/common/los_init.h
index 0cd68a415374c8739f9b8a39d5666fc8e37d0b46..b79c630ec6523e1aa30690754752f4332a738eaf 100644
--- a/kernel/common/los_init.h
+++ b/kernel/common/los_init.h
@@ -42,10 +42,10 @@
#define LOS_INIT_LEVEL_PLATFORM_EARLY 2 //平台早期
#define LOS_INIT_LEVEL_KMOD_PREVM 3 //内存模块即将开始
#define LOS_INIT_LEVEL_VM_COMPLETE 4 //内存模块完成
-#define LOS_INIT_LEVEL_ARCH 5 // 架构级
-#define LOS_INIT_LEVEL_PLATFORM 6 // 平台级
-#define LOS_INIT_LEVEL_KMOD_BASIC 7 // 基础级
-#define LOS_INIT_LEVEL_KMOD_EXTENDED 8 //
+#define LOS_INIT_LEVEL_ARCH 5 //架构级
+#define LOS_INIT_LEVEL_PLATFORM 6 //平台级
+#define LOS_INIT_LEVEL_KMOD_BASIC 7 //基础级
+#define LOS_INIT_LEVEL_KMOD_EXTENDED 8 //扩展级
#define LOS_INIT_LEVEL_KMOD_TASK 9 //任务级
#define LOS_INIT_LEVEL_FINISH 10
@@ -72,7 +72,7 @@
* @par Dependency:
*
- los_init.h: the header file that contains the API declaration.
* @see
- */ //将启动模块注册到启动过程
+ */ //将启动模块注册到启动过程,在内核启动过程中注册一个新模块作为内核功能组件的一部分。
#define LOS_MODULE_INIT(_hook, _level) OS_INIT_HOOK_REG(kernel, _hook, _level)
#endif /* _LOS_INIT_H */
diff --git a/kernel/extended/cpup/los_cpup.c b/kernel/extended/cpup/los_cpup.c
index b714f3c07b2bf1ec763bfb787712a5c661c237a7..d22d069eaabb3587fd86e8c89f26a5fce4d083b4 100644
--- a/kernel/extended/cpup/los_cpup.c
+++ b/kernel/extended/cpup/los_cpup.c
@@ -38,7 +38,7 @@
#ifdef LOSCFG_KERNEL_CPUP
-LITE_OS_SEC_BSS STATIC UINT16 cpupSwtmrID;
+LITE_OS_SEC_BSS STATIC UINT16 cpupSwtmrID; //监测CPU使用情况定时器s
LITE_OS_SEC_BSS STATIC UINT16 cpupInitFlg = 0;
LITE_OS_SEC_BSS OsIrqCpupCB *g_irqCpup = NULL;
LITE_OS_SEC_BSS STATIC UINT16 cpupMaxNum;
@@ -59,7 +59,7 @@ LITE_OS_SEC_BSS STATIC UINT64 cpupIntTimeStart[LOSCFG_KERNEL_CORE_NUM];
#define CPUP_PRE_POS(pos) (((pos) == 0) ? (OS_CPUP_HISTORY_RECORD_NUM - 1) : ((pos) - 1))
#define CPUP_POST_POS(pos) (((pos) == (OS_CPUP_HISTORY_RECORD_NUM - 1)) ? 0 : ((pos) + 1))
-
+//获取CPU周期
STATIC UINT64 OsGetCpuCycle(VOID)
{
UINT32 high;
@@ -134,7 +134,7 @@ LITE_OS_SEC_TEXT_INIT VOID OsCpupGuard(VOID)
SCHEDULER_UNLOCK(intSave);
}
-
+//创建cpu使用统计定时器
LITE_OS_SEC_TEXT_INIT UINT32 OsCpupGuardCreator(VOID)
{
(VOID)LOS_SwtmrCreate(LOSCFG_BASE_CORE_TICK_PER_SECOND, LOS_SWTMR_MODE_PERIOD,
diff --git a/kernel/extended/vdso/include/los_vdso.h b/kernel/extended/vdso/include/los_vdso.h
index aedc45920ddb4cc666a1c64894804b686dd3af3d..182a294d7a6b9df8c6616b2d89c0a46b9f95eae2 100644
--- a/kernel/extended/vdso/include/los_vdso.h
+++ b/kernel/extended/vdso/include/los_vdso.h
@@ -42,7 +42,6 @@
extern "C" {
#endif /* __cplusplus */
#endif /* __cplusplus */
-
extern UINT32 OsVdsoInit(VOID);
extern vaddr_t OsVdsoLoad(const LosProcessCB *);
extern VOID OsVdsoTimevalUpdate(VOID);
diff --git a/kernel/extended/vdso/include/los_vdso_datapage.h b/kernel/extended/vdso/include/los_vdso_datapage.h
index 3df321a40c2c1cb4421e35fbc9997c7dd1f8fc33..82468b13707704562f0d54b97c95c47d1384d0c6 100644
--- a/kernel/extended/vdso/include/los_vdso_datapage.h
+++ b/kernel/extended/vdso/include/los_vdso_datapage.h
@@ -40,14 +40,14 @@ extern "C" {
#endif /* __cplusplus */
#endif /* __cplusplus */
-typedef struct {
+typedef struct {//Vdso数据页结构体
/* Timeval */
INT64 realTimeSec;
INT64 realTimeNsec;
INT64 monoTimeSec;
INT64 monoTimeNsec;
/* lock DataPage 0:Unlock State 1:Lock State */
- UINT64 lockCount;
+ UINT64 lockCount;//数据页被锁数量
} VdsoDataPage;
#define ELF_HEAD "\177ELF"
diff --git a/kernel/extended/vdso/include/los_vdso_pri.h b/kernel/extended/vdso/include/los_vdso_pri.h
index 3e56a487e2c8150485c56d663cfaf2a4cf0bb852..f5eff2f265dbc461ff8ff84874dc8e62e0c8da7d 100644
--- a/kernel/extended/vdso/include/los_vdso_pri.h
+++ b/kernel/extended/vdso/include/los_vdso_pri.h
@@ -41,13 +41,13 @@ extern "C" {
#endif /* __cplusplus */
#endif /* __cplusplus */
-#define LITE_VDSO_DATAPAGE __attribute__((section(".data.vdso.datapage")))
+#define LITE_VDSO_DATAPAGE __attribute__((section(".data.vdso.datapage")))//vdso分页数据区
extern VOID OsVdsoTimeGet(VdsoDataPage *);
-extern CHAR __vdso_data_start;
-extern CHAR __vdso_text_start;
-extern CHAR __vdso_text_end;
+extern CHAR __vdso_data_start; //数据段起始地址,他们本质是在内核区的一个虚拟地址
+extern CHAR __vdso_text_start; //代码段起始地址
+extern CHAR __vdso_text_end; //代码段结束地址
#ifdef __cplusplus
#if __cplusplus
diff --git a/kernel/extended/vdso/src/los_vdso.c b/kernel/extended/vdso/src/los_vdso.c
index 80b2cc5600c03f6ac077625a637f950d146d7c4c..1053218cd6470e2182a322c97856bcda20e5e32b 100644
--- a/kernel/extended/vdso/src/los_vdso.c
+++ b/kernel/extended/vdso/src/los_vdso.c
@@ -36,14 +36,23 @@
#include "los_vm_lock.h"
#include "los_vm_phys.h"
#include "los_process_pri.h"
+/*
+ vdso 新型系统调用机制 ,虚拟动态共享库VDSO就是Virtual Dynamic Shared Object,
+就是内核提供的虚拟的.so,这类.so文件不在磁盘上,而是包含在内核里面。内核把包含
+某一.so的物理页在程序启动的时候映射入其进程的内存空间,对应的程序就可以当普通的.so来使用里头的函数
-LITE_VDSO_DATAPAGE VdsoDataPage g_vdsoDataPage __attribute__((__used__));
+参考:http://lishiwen4.github.io/linux/vdso-and-syscall
+ https://vvl.me/2019/06/linux-syscall-and-vsyscall-vdso-in-x86/
-STATIC size_t g_vdsoSize;
+#cat /proc/self/maps
+*/
+LITE_VDSO_DATAPAGE VdsoDataPage g_vdsoDataPage __attribute__((__used__));//使用这个数据区
+STATIC size_t g_vdsoSize;
+//vdso初始化
UINT32 OsVdsoInit(VOID)
{
- g_vdsoSize = &__vdso_text_end - &__vdso_data_start;
+ g_vdsoSize = &__vdso_text_end - &__vdso_data_start;//vDSO 会映射两块内存区域:代码段 [vdso],只读数据区 [vvar] 数据页
if (memcmp((CHAR *)(&__vdso_text_start), ELF_HEAD, ELF_HEAD_LEN)) {
PRINT_ERR("VDSO Init Failed!\n");
@@ -53,7 +62,8 @@ UINT32 OsVdsoInit(VOID)
}
LOS_MODULE_INIT(OsVdsoInit, LOS_INIT_LEVEL_KMOD_EXTENDED);
-
+//映射,这里先通过内核地址找到 vdso的物理地址,再将物理地址映射到进程的线性区.
+//结论是每个进程都可以拥有自己的 vdso区,映射到同一个块物理地址.
STATIC INT32 OsVdsoMap(LosVmSpace *space, size_t len, PADDR_T paddr, VADDR_T vaddr, UINT32 flag)
{
STATUS_T ret;
@@ -70,26 +80,26 @@ STATIC INT32 OsVdsoMap(LosVmSpace *space, size_t len, PADDR_T paddr, VADDR_T vad
}
return LOS_OK;
}
-
+//为每个进程加载 vsdo
vaddr_t OsVdsoLoad(const LosProcessCB *processCB)
{
INT32 ret = -1;
LosVmMapRegion *vdsoRegion = NULL;
UINT32 flag = VM_MAP_REGION_FLAG_PERM_USER | VM_MAP_REGION_FLAG_PERM_READ | VM_MAP_REGION_FLAG_PERM_EXECUTE;
-
+ //用户区,可读可执行
if ((processCB == NULL) || (processCB->vmSpace == NULL)) {
return 0;
}
(VOID)LOS_MuxAcquire(&processCB->vmSpace->regionMux);
-
+ //由虚拟空间提供加载内存
vdsoRegion = LOS_RegionAlloc(processCB->vmSpace, 0, g_vdsoSize, flag, 0);
if (vdsoRegion == NULL) {
PRINT_ERR("%s %d, region alloc failed in vdso load\n", __FUNCTION__, __LINE__);
goto LOCK_RELEASE;
}
- vdsoRegion->regionFlags |= VM_MAP_REGION_FLAG_VDSO;
-
+ vdsoRegion->regionFlags |= VM_MAP_REGION_FLAG_VDSO;//标识为 vdso区
+ //为vsdo做好映射,如此通过访问进程的虚拟地址就可以访问到真正的vsdo
ret = OsVdsoMap(processCB->vmSpace, g_vdsoSize, LOS_PaddrQuery((VOID *)(&__vdso_data_start)),
vdsoRegion->range.base, flag);
if (ret != LOS_OK) {
@@ -107,22 +117,22 @@ LOCK_RELEASE:
}
return 0;
}
-
+//对数据页加锁
STATIC VOID LockVdsoDataPage(VdsoDataPage *vdsoDataPage)
{
vdsoDataPage->lockCount = 1;
DMB;
}
-
+//对数据页加锁
STATIC VOID UnlockVdsoDataPage(VdsoDataPage *vdsoDataPage)
{
DMB;
vdsoDataPage->lockCount = 0;
}
-
+//更新时间,
VOID OsVdsoTimevalUpdate(VOID)
{
- VdsoDataPage *kVdsoDataPage = (VdsoDataPage *)(&__vdso_data_start);
+ VdsoDataPage *kVdsoDataPage = (VdsoDataPage *)(&__vdso_data_start);//获取vdso 数据区
LockVdsoDataPage(kVdsoDataPage);
OsVdsoTimeGet(kVdsoDataPage);
diff --git a/kernel/extended/vdso/src/los_vdso_text.S b/kernel/extended/vdso/src/los_vdso_text.S
index fcf8224ecbfc2b31f9d9ddf94b33fb052e0f5764..75e3d93c514d74511df578646d743ce12624430a 100644
--- a/kernel/extended/vdso/src/los_vdso_text.S
+++ b/kernel/extended/vdso/src/los_vdso_text.S
@@ -27,8 +27,8 @@
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
+ */
.globl __vdso_text_start
.section .data.vdso.text
-__vdso_text_start:
- .incbin "../usr/OHOS-vdso.so"
\ No newline at end of file
+__vdso_text_start: @vdso代码段入口
+ .incbin "../usr/OHOS-vdso.so" @ include bin的意思
\ No newline at end of file
diff --git a/shell/full/include/dmesg_pri.h b/shell/full/include/dmesg_pri.h
index 6f73ca19b448700da67abe734c765bc05449f579..1c0431e34e8df0ba5323021d12e049a7682150e8 100644
--- a/shell/full/include/dmesg_pri.h
+++ b/shell/full/include/dmesg_pri.h
@@ -45,7 +45,7 @@ extern "C" {
/*
* The dmesg buffer is start with this info structure, then the log.
*/
-typedef struct {
+typedef struct {//dmesg信息管理器,环形buf
UINT32 logSize; /* The size of log in buffer */
UINT32 logHead; /* The index of the first log data. Data_out_flag */
UINT32 logTail; /* The index where to write, write in and plus one. Data_it_flag */
diff --git a/shell/full/src/base/shell_lk.c b/shell/full/src/base/shell_lk.c
index a9606bd865931badf4bf7f300a946cb173f4df33..4e9962a85667120a0554b224040fd4874d6915d2 100644
--- a/shell/full/src/base/shell_lk.c
+++ b/shell/full/src/base/shell_lk.c
@@ -43,7 +43,7 @@
#ifdef LOSCFG_SHELL_LK
-typedef enum {
+typedef enum {//模块等级
MODULE0 = 0,
MODULE1 = 1,
MODULE2 = 2,
@@ -52,9 +52,9 @@ typedef enum {
} MODULE_FLAG;
typedef struct {
- INT32 module_level;
- INT32 trace_level;
- FILE *fp;
+ INT32 module_level;//模块等级
+ INT32 trace_level;//跟踪等级
+ FILE *fp; //文件描述结构体
} Logger;
STATIC INT32 g_tracelevel;
@@ -119,7 +119,32 @@ FILE *OsLogFpGet(VOID)
{
return g_logger.fp;
}
+/**************************************************************
+log命令用于修改&查询日志配置,即选择打印哪种日志?
+该命令依赖于LOSCFG_SHELL_LK,使用时通过menuconfig在配置项中开启"Enable Shell lk":
+Debug ---> Enable a Debug Version ---> Enable Shell ---> Enable Shell lK。
+
+log level命令用于配置日志的打印等级,包括6个等级
+
+TRACE_EMG = 0,
+
+TRACE_COMMON = 1,
+
+TRACE_ERROR = 2,
+
+TRACE_WARN = 3,
+
+TRACE_INFO = 4,
+
+TRACE_DEBUG = 5
+
+若level不在有效范围内,会打印提示信息。
+
+若log level命令不加[levelNum]参数,则默认查看当前打印等级,并且提示使用方法。
+
+输入log level 4
+***************************************************************/
INT32 CmdLog(INT32 argc, const CHAR **argv)
{
size_t level;
@@ -166,7 +191,7 @@ INT32 CmdLog(INT32 argc, const CHAR **argv)
}
#ifdef LOSCFG_SHELL_DMESG
-STATIC INLINE VOID OsLogCycleRecord(INT32 level)
+STATIC INLINE VOID OsLogCycleRecord(INT32 level)//日志循环记录
{
UINT32 tmpLen;
if (level != LOS_COMMON_LEVEL && (level > LOS_EMG_LEVEL && level <= LOS_TRACE_LEVEL)) {
@@ -176,7 +201,7 @@ STATIC INLINE VOID OsLogCycleRecord(INT32 level)
}
}
#endif
-
+//默认打印函数,用于回调函数
VOID OsLkDefaultFunc(INT32 level, const CHAR *func, INT32 line, const CHAR *fmt, va_list ap)
{
if (level > OsLkTraceLvGet()) {
@@ -193,7 +218,7 @@ VOID OsLkDefaultFunc(INT32 level, const CHAR *func, INT32 line, const CHAR *fmt,
}
LkDprintf(fmt, ap);
}
-
+//打印
VOID LOS_LkPrint(INT32 level, const CHAR *func, INT32 line, const CHAR *fmt, ...)
{
va_list ap;
@@ -203,12 +228,12 @@ VOID LOS_LkPrint(INT32 level, const CHAR *func, INT32 line, const CHAR *fmt, ...
va_end(ap);
}
}
-
+//设置回调函数
VOID LOS_LkRegHook(LK_FUNC hook)
{
g_osLkHook = hook;
}
-
+//内核日志初始化
UINT32 OsLkLoggerInit(VOID)
{
(VOID)memset_s(&g_logger, sizeof(Logger), 0, sizeof(Logger));
@@ -224,6 +249,6 @@ UINT32 OsLkLoggerInit(VOID)
SHELLCMD_ENTRY(log_shellcmd, CMD_TYPE_EX, "log", 1, (CmdCallBackFunc)CmdLog);
#endif
-LOS_MODULE_INIT(OsLkLoggerInit, LOS_INIT_LEVEL_EARLIEST);
+LOS_MODULE_INIT(OsLkLoggerInit, LOS_INIT_LEVEL_EARLIEST);//日志模块初始化
#endif
diff --git a/shell/full/src/cmds/dmesg.c b/shell/full/src/cmds/dmesg.c
index 8c100c7c89b16d3b7d95e13856ba134c5aeb2e0d..f7f60aa3116ddbc79e033b8733c047a56745a056 100644
--- a/shell/full/src/cmds/dmesg.c
+++ b/shell/full/src/cmds/dmesg.c
@@ -69,9 +69,9 @@ LITE_OS_SEC_BSS STATIC SPIN_LOCK_INIT(g_dmesgSpin);
STATIC DmesgInfo *g_dmesgInfo = NULL;
STATIC UINT32 g_logBufSize = 0;
STATIC VOID *g_mallocAddr = NULL;
-STATIC UINT32 g_dmesgLogLevel = 3;
-STATIC UINT32 g_consoleLock = 0;
-STATIC UINT32 g_uartLock = 0;
+STATIC UINT32 g_dmesgLogLevel = 3;//日志等级
+STATIC UINT32 g_consoleLock = 0;//用于关闭和打开控制台
+STATIC UINT32 g_uartLock = 0;//用于关闭和打开串口
STATIC const CHAR *g_levelString[] = {
"EMG",
"COMMON",
@@ -80,22 +80,22 @@ STATIC const CHAR *g_levelString[] = {
"INFO",
"DEBUG"
};
-
+//关闭控制台
STATIC VOID OsLockConsole(VOID)
{
g_consoleLock = 1;
}
-
+//打开控制台
STATIC VOID OsUnlockConsole(VOID)
{
g_consoleLock = 0;
}
-
+//关闭串口
STATIC VOID OsLockUart(VOID)
{
g_uartLock = 1;
}
-
+//打开串口
STATIC VOID OsUnlockUart(VOID)
{
g_uartLock = 0;
@@ -300,7 +300,7 @@ UINT32 OsCheckUartLock(VOID)
{
return g_uartLock;
}
-
+//初始化 dmesg
UINT32 OsDmesgInit(VOID)
{
CHAR* buffer = NULL;
@@ -708,7 +708,26 @@ INT32 LOS_DmesgToFile(CHAR *filename)
}
#endif
+}
+/*************************************************************
+dmesg全称是display message (or display driver),即显示信息。
+
+dmesg命令用于控制内核dmesg缓存区
+dmesg命令用于显示开机信息
+该命令依赖于LOSCFG_SHELL_DMESG,使用时通过menuconfig在配置项中开启"Enable Shell dmesg":
+Debug ---> Enable a Debug Version ---> Enable Shell ---> Enable Shell dmesg
+
+dmesg参数缺省时,默认打印缓存区内容。
+
+各“ - ”选项不能混合使用。
+
+写入文件需确保已挂载文件系统。
+关闭串口打印会影响shell使用,建议先连接telnet再尝试关闭串口。
+
+dmesg > /usr/dmesg.log。
+
+**************************************************************/
INT32 OsShellCmdDmesg(INT32 argc, const CHAR **argv)
{
if (argc == 1) {
@@ -720,24 +739,24 @@ INT32 OsShellCmdDmesg(INT32 argc, const CHAR **argv)
goto ERR_OUT;
}
- if (!strcmp(argv[1], "-c")) {
+ if (!strcmp(argv[1], "-c")) {//打印缓存区内容并清空缓存区
PRINTK("\n");
- OsLogShow();
+ OsLogShow();//打印缓存区内容
LOS_DmesgClear();
return LOS_OK;
- } else if (!strcmp(argv[1], "-C")) {
+ } else if (!strcmp(argv[1], "-C")) {//清空缓存区。
LOS_DmesgClear();
return LOS_OK;
- } else if (!strcmp(argv[1], "-D")) {
+ } else if (!strcmp(argv[1], "-D")) {//关闭控制台打印。
OsLockConsole();
return LOS_OK;
- } else if (!strcmp(argv[1], "-E")) {
+ } else if (!strcmp(argv[1], "-E")) {///开启控制台打印。
OsUnlockConsole();
return LOS_OK;
- } else if (!strcmp(argv[1], "-L")) {
+ } else if (!strcmp(argv[1], "-L")) {//关闭串口打印
OsLockUart();
return LOS_OK;
- } else if (!strcmp(argv[1], "-U")) {
+ } else if (!strcmp(argv[1], "-U")) {//开启串口打印
OsUnlockUart();
return LOS_OK;
}
@@ -746,7 +765,7 @@ INT32 OsShellCmdDmesg(INT32 argc, const CHAR **argv)
goto ERR_OUT;
}
- if (!strcmp(argv[1], ">")) {
+ if (!strcmp(argv[1], ">")) {//将缓存区内容写入文件
if (LOS_DmesgToFile((CHAR *)argv[2]) < 0) { /* 2:index of parameters */
PRINTK("Dmesg write log to %s fail \n", argv[2]); /* 2:index of parameters */
return -1;
@@ -754,9 +773,9 @@ INT32 OsShellCmdDmesg(INT32 argc, const CHAR **argv)
PRINTK("Dmesg write log to %s success \n", argv[2]); /* 2:index of parameters */
return LOS_OK;
}
- } else if (!strcmp(argv[1], "-l")) {
+ } else if (!strcmp(argv[1], "-l")) {//设置缓存等级
return OsDmesgLvSet(argv[2]); /* 2:index of parameters */
- } else if (!strcmp(argv[1], "-s")) {
+ } else if (!strcmp(argv[1], "-s")) {//设置缓存区大小 size是要设置的大小
return OsDmesgMemSizeSet(argv[2]); /* 2:index of parameters */
}
}
@@ -764,9 +783,8 @@ INT32 OsShellCmdDmesg(INT32 argc, const CHAR **argv)
ERR_OUT:
PRINTK("dmesg: invalid option or parameter.\n");
return -1;
-}
SHELLCMD_ENTRY(dmesg_shellcmd, CMD_TYPE_STD, "dmesg", XARGS, (CmdCallBackFunc)OsShellCmdDmesg);
-LOS_MODULE_INIT(OsDmesgInit, LOS_INIT_LEVEL_EARLIEST);
+LOS_MODULE_INIT(OsDmesgInit, LOS_INIT_LEVEL_EARLIEST);//在非常早期调用
#endif
diff --git a/syscall/los_syscall.c b/syscall/los_syscall.c
index 5daa2a7c2ec188d618a037b287745838200a1721..ebdef183bbc322eb69fa5806804819bd9fccb244 100644
--- a/syscall/los_syscall.c
+++ b/syscall/los_syscall.c
@@ -82,7 +82,7 @@ typedef UINT32 (*SyscallFun7)(UINT32, UINT32, UINT32, UINT32, UINT32, UINT32, UI
static UINTPTR g_syscallHandle[SYS_CALL_NUM] = {0}; //系统调用入口函数注册
static UINT8 g_syscallNArgs[(SYS_CALL_NUM + 1) / NARG_PER_BYTE] = {0};//保存系统调用对应的参数数量
-//系统调用初始化,完成对系统调用的注册
+//系统调用初始化,完成对系统调用的注册,将系统调用添加到全局变量中 g_syscallHandle,g_syscallNArgs
void OsSyscallHandleInit(void)
{
#define SYSCALL_HAND_DEF(id, fun, rType, nArg) \
@@ -95,7 +95,7 @@ void OsSyscallHandleInit(void)
#undef SYSCALL_HAND_DEF
}
-LOS_MODULE_INIT(OsSyscallHandleInit, LOS_INIT_LEVEL_KMOD_EXTENDED);
+LOS_MODULE_INIT(OsSyscallHandleInit, LOS_INIT_LEVEL_KMOD_EXTENDED);//注册系统调用模块
/* The SYSCALL ID is in R7 on entry. Parameters follow in R0..R6 */
/******************************************************************
由汇编调用,见于 los_hw_exc.s / BLX OsArmA32SyscallHandle
@@ -125,7 +125,7 @@ VOID OsArmA32SyscallHandle(TaskContext *regs)
return;
}
//regs[0-6] 记录系统调用的参数,这也是由R7寄存器保存系统调用号的原因
- OsSigIntLock();
+ OsSigIntLock();//禁止响应信号
switch (nArgs) {//参数的个数
case ARG_NUM_0:
case ARG_NUM_1:
@@ -143,8 +143,8 @@ VOID OsArmA32SyscallHandle(TaskContext *regs)
ret = (*(SyscallFun7)handle)(regs->R0, regs->R1, regs->R2, regs->R3, regs->R4, regs->R5, regs->R6);
}
- regs->R0 = ret;
- OsSigIntUnlock();
+ regs->R0 = ret;//系统返回值,保存在R0寄存器
+ OsSigIntUnlock();//打开响应信号
return;
}
diff --git a/zzz/git/push.sh b/zzz/git/push.sh
index 285c0d0568221a3fe8d6d363dafe0fae4e5ab3e5..c613dec1cdb5b8211c52c00b99093f3f371b2268 100644
--- a/zzz/git/push.sh
+++ b/zzz/git/push.sh
@@ -1,5 +1,5 @@
git add -A
-git commit -m '上传linux经典书籍
+git commit -m '对 vdso 实现注解
百万汉字注解 + 百篇博客分析 => 挖透鸿蒙内核源码
国内:https://weharmony.21cloudbox.com
国外:https://weharmony.github.io