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: * * @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