参考 http://weharmonyos.com 官方文档完善注解

    百万汉字注解 + 百篇博客分析 => 挖透鸿蒙内核源码
    博客输出站点(国内):http://weharmonyos.comhttp://8.134.122.205
    博客输出站点(国外):https://weharmony.github.io
    注解文件系统:https://gitee.com/weharmony/third_party_NuttX
    注解协议栈:https://gitee.com/weharmony/third_party_lwip
上级 547a4b35
......@@ -102,7 +102,7 @@
要查看调用栈信息,必须添加编译选项宏-fno-omit-frame-pointer支持stack frame,否则编译时FP寄存器是关闭的。
参考
https://gitee.com/LiteOS/LiteOS/blob/master/doc/Huawei_LiteOS_Kernel_Developer_Guide_zh.md
http://weharmonyos.com/openharmony/zh-cn/device-dev/kernel/%E7%94%A8%E6%88%B7%E6%80%81%E5%BC%82%E5%B8%B8%E4%BF%A1%E6%81%AF%E8%AF%B4%E6%98%8E.html
******************************************************************************/
#define INVALID_CPUID 0xFFFF
#define OS_EXC_VMM_NO_REGION 0x0U
......@@ -1121,7 +1121,7 @@ LITE_OS_SEC_TEXT VOID STATIC OsExcPriorDisposal(ExcContext *excBufAddr)
#endif
#endif
}
//异常信息头部打印
LITE_OS_SEC_TEXT_INIT STATIC VOID OsPrintExcHead(UINT32 far)
{
#ifdef LOSCFG_KERNEL_VM
......@@ -1134,11 +1134,11 @@ LITE_OS_SEC_TEXT_INIT STATIC VOID OsPrintExcHead(UINT32 far)
LOS_DumpMemRegion(vaddr);
}
#endif
PrintExcInfo("##################excFrom: User!####################\n");
PrintExcInfo("##################excFrom: User!####################\n");//用户态异常信息说明
} else
#endif
{
PrintExcInfo("##################excFrom: kernel!###################\n");
PrintExcInfo("##################excFrom: kernel!###################\n");//内核态异常信息说明
}
}
......@@ -1164,7 +1164,7 @@ STATIC VOID OsSysStateRestore(UINT32 intCount, UINT32 lockCount)
* excBufAddr --- address of EXC buf
*/
LITE_OS_SEC_TEXT_INIT VOID OsExcHandleEntry(UINT32 excType, ExcContext *excBufAddr, UINT32 far, UINT32 fsr)
{
{//异常信息处理入口
#ifdef LOSCFG_SAVE_EXCINFO
UINT32 intCount;
UINT32 lockCount;
......@@ -1176,7 +1176,7 @@ LITE_OS_SEC_TEXT_INIT VOID OsExcHandleEntry(UINT32 excType, ExcContext *excBufAd
OsExcPriorDisposal(excBufAddr);
OsPrintExcHead(far);
OsPrintExcHead(far);//打印异常信息头部信息 ##################excFrom: User!####################
#if (LOSCFG_KERNEL_SMP == YES)
OsAllCpuStatusOutput();//打印各CPU core的状态
......
......@@ -577,7 +577,7 @@ OUT_UNLOCK:
(VOID)pthread_mutex_unlock(&g_mqueueMutex);
return ret;
}
//获取描述符指定的消息队列属性
int OsMqGetAttr(mqd_t personal, struct mq_attr *mqAttr)
{
struct mqarray *mqueueCB = NULL;
......@@ -608,7 +608,7 @@ int OsMqGetAttr(mqd_t personal, struct mq_attr *mqAttr)
(VOID)pthread_mutex_unlock(&g_mqueueMutex);
return 0;
}
//设置描述符指定的消息队列属性
int OsMqSetAttr(mqd_t personal, const struct mq_attr *mqSetAttr, struct mq_attr *mqOldAttr)
{
struct mqpersonal *privateMqPersonal = NULL;
......@@ -729,7 +729,7 @@ STATIC INLINE BOOL MqParamCheck(mqd_t personal, const char *msg, size_t msgLen)
}
int mq_timedsend(mqd_t personal, const char *msg, size_t msgLen, unsigned int msgPrio,
const struct timespec *absTimeout)
{
{//此API用于在预定时间将具有指定内容和长度的消息放入具有描述符的消息队列中
UINT32 mqueueID, err;
UINT64 absTicks;
struct mqarray *mqueueCB = NULL;
......@@ -764,7 +764,7 @@ ERROUT_UNLOCK:
ERROUT:
return -1;
}
//此API用于从具有指定描述符的消息队列消息中获取具有指定消息内容和长度的消息
ssize_t mq_timedreceive(mqd_t personal, char *msg, size_t msgLen, unsigned int *msgPrio,
const struct timespec *absTimeout)
{
......@@ -820,13 +820,13 @@ ERROUT_UNLOCK:
ERROUT:
return -1;
}
//此API用于将具有指定内容和长度的消息放入具有指定描述符的消息队列中
/* not support the prio */
int mq_send(mqd_t personal, const char *msg_ptr, size_t msg_len, unsigned int msg_prio)
{
return mq_timedsend(personal, msg_ptr, msg_len, msg_prio, NULL);
}
//此API用于从具有指定描述符的消息队列中删除最老的消息,并将其放入msg_ptr所指向的缓冲区中
ssize_t mq_receive(mqd_t personal, char *msg_ptr, size_t msg_len, unsigned int *msg_prio)
{
return mq_timedreceive(personal, msg_ptr, msg_len, msg_prio, NULL);
......
......@@ -160,7 +160,7 @@ int pthread_attr_getschedpolicy(const pthread_attr_t *attr, int *policy)
return ENOERR;
}
//设置调度参数,调度参数是在 param 结构中定义的。仅支持优先级参数。新创建的线程使用此优先级运行。
//设置线程属性对象的调度参数属性,调度参数是在 param 结构中定义的。仅支持优先级参数。新创建的线程使用此优先级运行。
int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param)
{
if ((attr == NULL) || (param == NULL)) {
......@@ -173,7 +173,7 @@ int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *p
return ENOERR;
}
//获取调度参数
//获取线程属性对象的调度参数属性
int pthread_attr_getschedparam(const pthread_attr_t *attr, struct sched_param *param)
{
if ((attr == NULL) || (param == NULL)) {
......
......@@ -92,7 +92,7 @@ int pthread_condattr_setpshared(pthread_condattr_t *attr, int shared)
return 0;
}
//销毁条件变量属性对象
int pthread_condattr_destroy(pthread_condattr_t *attr)
{
if (attr == NULL) {
......@@ -101,7 +101,7 @@ int pthread_condattr_destroy(pthread_condattr_t *attr)
return 0;
}
//初始化条件变量属性对象
int pthread_condattr_init(pthread_condattr_t *attr)
{
if (attr == NULL) {
......@@ -110,7 +110,7 @@ int pthread_condattr_init(pthread_condattr_t *attr)
return 0;
}
//销毁条件变量
int pthread_cond_destroy(pthread_cond_t *cond)
{
if (cond == NULL) {
......@@ -132,7 +132,7 @@ int pthread_cond_destroy(pthread_cond_t *cond)
cond->mutex = NULL;
return ENOERR;
}
//条件变量初始化
//初始化条件变量
int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr)
{
int ret = ENOERR;
......@@ -171,7 +171,7 @@ STATIC VOID PthreadCondValueModify(pthread_cond_t *cond)
}
}
}
//解除阻塞所有线程
//解除若干已被等待条件阻塞的线程
int pthread_cond_broadcast(pthread_cond_t *cond)
{
int ret = ENOERR;
......@@ -194,7 +194,7 @@ int pthread_cond_broadcast(pthread_cond_t *cond)
return ret;
}
//解除阻塞一个线程
//解除被阻塞的线程
int pthread_cond_signal(pthread_cond_t *cond)
{
int ret = ENOERR;
......@@ -262,7 +262,7 @@ STATIC INT32 ProcessReturnVal(pthread_cond_t *cond, INT32 val)
}
return ret;
}
//在指定的时间之前阻塞,函数会一直阻塞,直到该条件获得信号,或者最后一个参数所指定的时间已过为止。
//等待条件 在指定的时间之前阻塞,函数会一直阻塞,直到该条件获得信号,或者最后一个参数所指定的时间已过为止。
int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex,
const struct timespec *absTime)
{
......
......@@ -112,7 +112,7 @@ int pthread_mutexattr_settype(pthread_mutexattr_t *attr, int type)
{
return LOS_MuxAttrSetType(attr, type);
}
//初始化互斥锁
/* Initialize mutex. If mutexAttr is NULL, use default attributes. */
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexAttr)
{//初始化互斥锁。 如果 mutexAttr 为 NULL,则使用默认属性。
......@@ -130,23 +130,23 @@ int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexA
return (int)ret;
}
//销毁互斥锁
int pthread_mutex_destroy(pthread_mutex_t *mutex)
{
return LOS_MuxDestroy(mutex);
}
//互斥锁加锁操作
/* Lock mutex, waiting for it if necessary. */
int pthread_mutex_lock(pthread_mutex_t *mutex)
{
return LOS_MuxLock(mutex, LOS_WAIT_FOREVER);
}
//互斥锁尝试加锁操作
int pthread_mutex_trylock(pthread_mutex_t *mutex)
{
return LOS_MuxTrylock(mutex);
}
//解锁互斥锁
int pthread_mutex_unlock(pthread_mutex_t *mutex)
{
return LOS_MuxUnlock(mutex);
......
......@@ -34,7 +34,7 @@
#include "map_error.h"
#include "time_posix.h"
//创建并初始化一个无名信号量
/* Initialize semaphore to value, shared is not supported in Huawei LiteOS. */
int sem_init(sem_t *sem, int shared, unsigned int value)//初始化信号量,Huawei LiteOS 不支持共享
{
......@@ -56,7 +56,7 @@ int sem_init(sem_t *sem, int shared, unsigned int value)//初始化信号量,H
return 0;
}
//销毁指定的无名信号量
int sem_destroy(sem_t *sem)
{
UINT32 ret;
......@@ -72,7 +72,7 @@ int sem_destroy(sem_t *sem)
}
return 0;
}
//获取信号量
/* Decrement value if >0 or wait for a post. */
int sem_wait(sem_t *sem)
{
......@@ -90,7 +90,7 @@ int sem_wait(sem_t *sem)
return -1;
}
}
//尝试获取信号量
/* Decrement value if >0, return -1 if not. */
int sem_trywait(sem_t *sem)
{
......@@ -111,7 +111,7 @@ int sem_trywait(sem_t *sem)
return -1;
}
}
//设置获取信号量时间,时间到了不管是否获取也返回.
int sem_timedwait(sem_t *sem, const struct timespec *timeout)
{
UINT32 ret;
......@@ -135,7 +135,7 @@ int sem_timedwait(sem_t *sem, const struct timespec *timeout)
return -1;
}
}
//增加信号量计数
int sem_post(sem_t *sem)
{
UINT32 ret;
......
......@@ -555,7 +555,7 @@ static int CpuClockGetres(const clockid_t clockID, struct timespec *tp)
return error;
}
#endif
//获取时钟的时间
int clock_gettime(clockid_t clockID, struct timespec *tp)
{
UINT32 intSave;
......@@ -744,7 +744,7 @@ EXIT:
PRINT_ERR("Dsipatch signals failed!, ret: %d\r\n", ret);
return;
}
//为进程创建计时器
int OsTimerCreate(clockid_t clockID, struct ksigevent *evp, timer_t *timerID)
{
UINT32 ret;
......@@ -799,7 +799,7 @@ int OsTimerCreate(clockid_t clockID, struct ksigevent *evp, timer_t *timerID)
*timerID = (timer_t)(UINTPTR)swtmrID;
return 0;
}
//为进程删除计时器
int timer_delete(timer_t timerID)
{
UINT16 swtmrID = (UINT16)(UINTPTR)timerID;
......@@ -829,7 +829,7 @@ ERROUT:
errno = EINVAL;
return -1;
}
//为进程设置计时器
int timer_settime(timer_t timerID, int flags,
const struct itimerspec *value, /* new value */
struct itimerspec *oldValue) /* old value to return, always 0 */
......@@ -959,12 +959,12 @@ STATIC INT32 DoNanoSleep(UINT64 useconds)
}
return -1;
}
//休眠(微秒单位
int usleep(unsigned useconds)
{
return DoNanoSleep((UINT64)useconds);
}
//暂停当前线程直到指定的时间到达
int nanosleep(const struct timespec *rqtp, struct timespec *rmtp)
{
UINT64 useconds;
......
......@@ -55,6 +55,24 @@
#include <sys/types.h>
#include "los_hash.h"
/***************************************************
FAT文件系统是File Allocation Table(文件配置表)的简称,主要包括DBR区、FAT区、DATA区三个区域。
其中,FAT区各个表项记录存储设备中对应簇的信息,包括簇是否被使用、文件下一个簇的编号、是否文件结尾等。
FAT文件系统有FAT12、FAT16、FAT32等多种格式,其中,12、16、32表示对应格式中FAT表项的字节数。
FAT文件系统支持多种介质,特别在可移动存储介质(U盘、SD卡、移动硬盘等)上广泛使用,
使嵌入式设备和Windows、Linux等桌面系统保持很好的兼容性,方便用户管理操作文件。
OpenHarmony内核支持FAT12、FAT16与FAT32三种格式的FAT文件系统,
具有代码量小、资源占用小、可裁切、支持多种物理介质等特性,并且与Windows、Linux等系统保持兼容,
支持多设备、多分区识别等功能。OpenHarmony内核支持硬盘多分区,可以在主分区以及逻辑分区上创建FAT文件系统。
驱动适配
FAT文件系统的使用需要底层MMC相关驱动的支持。在一个带MMC存储设备的板子上运行FATFS,需要:
1、适配板端EMMC驱动,实现disk_status、disk_initialize、disk_read、disk_write、disk_ioctl接口;
2、新增fs_config.h文件,配置FS_MAX_SS(存储设备最大sector大小)、FF_VOLUME_STRS(分区名)等信息,
***************************************************/
struct VnodeOps fatfs_vops; /* forward define */
struct file_operations_vfs fatfs_fops;
......
......@@ -48,20 +48,7 @@
extern "C" {
#endif /* __cplusplus */
#endif /* __cplusplus */
/***************************************************
FAT文件系统是File Allocation Table(文件配置表)的简称,FAT文件系统有FAT12、FAT16、FAT32。
FAT文件系统将硬盘分为MBR区、DBR区、FAT区、DIR区、DATA区等5个区域。
FAT文件系统支持多种介质,特别在可移动存储介质(U盘、SD卡、移动硬盘等)上广泛使用。
可以使嵌入式设备和Windows、Linux等桌面系统保持很好的兼容性,方便用户管理操作文件。
OpenHarmony内核的FAT文件系统具有代码量和资源占用小、可裁切、支持多种物理介质等特性,
并且与Windows、Linux等系统保持兼容,支持多设备、多分区识别等功能。
OpenHarmony内核支持硬盘多分区,可以在主分区以及逻辑分区上创建FAT文件系统。
同时OpenHarmony内核也可以识别出硬盘上其他类型的文件系统。
***************************************************/
#define MAX_LFNAME_LENGTH 256
#define LABEL_LEN 12
#define FAT_RESERVED_NUM 2
......
......@@ -42,6 +42,14 @@
#include "los_trace.h"
#endif
/**************************************************************
内存信息包括内存池大小、内存使用量、剩余内存大小、最大空闲内存、内存水线、内存节点数统计、碎片率等。
内存水线:即内存池的最大使用量,每次申请和释放时,都会更新水线值,实际业务可根据该值,优化内存池大小;
碎片率:衡量内存池的碎片化程度,碎片率高表现为内存池剩余内存很多,但是最大空闲内存块很小,可以用公式(fragment=100-最大空闲内存块大小/剩余内存大小)来度量;
**************************************************************/
/* Used to cut non-essential functions. */
#define OS_MEM_FREE_BY_TASKID 0
......@@ -56,8 +64,8 @@
/* column num of the output info of mem node */
#define OS_MEM_COLUMN_NUM 8
UINT8 *m_aucSysMem0 = NULL;
UINT8 *m_aucSysMem1 = NULL;
UINT8 *m_aucSysMem0 = NULL; //异常交互动态内存池地址的起始地址,当不支持异常交互特性时,m_aucSysMem0等于m_aucSysMem1。
UINT8 *m_aucSysMem1 = NULL; //系统动态内存池地址的起始地址
#ifdef LOSCFG_MEM_MUL_POOL
VOID *g_poolHead = NULL;
......@@ -1798,9 +1806,9 @@ STATIC INLINE VOID OsMemInfoGet(struct OsMemPoolHead *poolInfo, struct OsMemNode
poolStatus->usedNodeNum += usedNodeNum;
poolStatus->freeNodeNum += freeNodeNum;
}
//内存水线获取:调用LOS_MemInfoGet接口,第1个参数是内存池首地址,第2个参数是LOS_MEM_POOL_STATUS类型的句柄,其中字段usageWaterLine即水线值
UINT32 LOS_MemInfoGet(VOID *pool, LOS_MEM_POOL_STATUS *poolStatus)
{
{//内存碎片率计算:同样调用LOS_MemInfoGet接口,可以获取内存池的剩余内存大小和最大空闲内存块大小,然后根据公式(fragment=100-最大空闲内存块大小/剩余内存大小)得出此时的动态内存池碎片率。
struct OsMemPoolHead *poolInfo = pool;
if (poolStatus == NULL) {
......@@ -1926,7 +1934,7 @@ UINT32 LOS_MemFreeNodeShow(VOID *pool)
return LOS_OK;
}
//内核空间动态内存(堆内存)初始化
STATUS_T OsKHeapInit(size_t size)
{
STATUS_T ret;
......
......@@ -69,13 +69,13 @@ extern "C" {
* The start address of exc interaction dynamic memory pool address, when the exc
* interaction feature not support, m_aucSysMem0 equals to m_aucSysMem1.
*/
extern UINT8 *m_aucSysMem0;
extern UINT8 *m_aucSysMem0;//异常交互动态内存池地址的起始地址,当不支持异常交互特性时,m_aucSysMem0等于m_aucSysMem1。
/**
* @ingroup los_memory
* The start address of system dynamic memory pool address.
*/
extern UINT8 *m_aucSysMem1;
extern UINT8 *m_aucSysMem1;//系统动态内存池地址的起始地址
/**
* @ingroup los_memory
......@@ -135,14 +135,14 @@ extern UINT32 LOS_MemPoolList(VOID);
* @ingroup los_memory
* Memory pool extern information structure
*/
typedef struct {
UINT32 totalUsedSize;
UINT32 totalFreeSize;
UINT32 maxFreeNodeSize;
UINT32 usedNodeNum;
UINT32 freeNodeNum;
#if defined(OS_MEM_WATERLINE) && (OS_MEM_WATERLINE == YES)
UINT32 usageWaterLine;
typedef struct {//内存池外部信息结构
UINT32 totalUsedSize; // 内存池的内存使用量
UINT32 totalFreeSize; // 内存池的剩余内存大小
UINT32 maxFreeNodeSize; // 内存池的最大空闲内存块大小
UINT32 usedNodeNum; // 内存池的非空闲内存块个数
UINT32 freeNodeNum; // 内存池的空闲内存块个数
#if defined(OS_MEM_WATERLINE) && (OS_MEM_WATERLINE == YES)// 默认打开,如需关闭,在target_config.h中将该宏设置为0
UINT32 usageWaterLine; // 内存池的水线值
#endif
} LOS_MEM_POOL_STATUS;
......
......@@ -1218,7 +1218,7 @@ int SysFtruncate(int fd, off_t length)
}
return ret;
}
//获取文件系统信息
//获取指定路径下文件的文件系统信息
int SysStatfs(const char *path, struct statfs *buf)
{
int ret;
......
git add -A
git commit -m ' http://weharmonyos.com 上线
git commit -m ' 参考 http://weharmonyos.com 官方文档完善注解
百万汉字注解 + 百篇博客分析 => 挖透鸿蒙内核源码
博客输出站点(国内):https://weharmonyos.com 或 http://8.134.122.205
博客输出站点(国内):http://weharmonyos.com 或 http://8.134.122.205
博客输出站点(国外):https://weharmony.github.io
注解文件系统:https://gitee.com/weharmony/third_party_NuttX
注解协议栈:https://gitee.com/weharmony/third_party_lwip
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册