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

Merge branch 'master' of gitee.com:weharmony/kernel_liteos_a_note

weharmonyos.com
......@@ -112,7 +112,7 @@ VADDR_T *OsGFirstTableGet(VOID)
return (VADDR_T *)g_firstPageTable;
}
//解除L1表的映射关系
/// 解除L1表的映射关系
STATIC INLINE UINT32 OsUnmapL1Invalid(vaddr_t *vaddr, UINT32 *count)
{
UINT32 unmapCount;
......
/*!
* @file los_asid.c
* @brief
*
* \n
* @link http://weharmonyos.com/blog/14.html
* @verbatim
asid(Adress Space ID) 进程标识符,属于CP15协处理器的C13号寄存器,ASID可用来唯一标识进程,并为进程提供地址空间保护。
......@@ -22,8 +20,6 @@
已经被置换到硬盘上了。明白了吗?只关注应用开发的同学当然可以说这关我鸟事,给我的感觉有就行了,但想熟悉内核的同学就必须要明白,
这是每分每秒都在发生的事情。
* @endverbatim
*
* \n
* @version
* @author weharmonyos.com
* @date 2021-11-16
......
......@@ -33,15 +33,15 @@
#include "los_task_pri.h"
/* support cpu vendors */
CpuVendor g_cpuTable[] = { //支持的CPU供应商
/* support cpu vendors | 支持的CPU供应商*/
CpuVendor g_cpuTable[] = {
/* armv7-a */
{ 0xc07, "Cortex-A7" },
{ 0xc09, "Cortex-A9" },
{ 0, NULL }
};
/* logical cpu mapping */ //逻辑层cpu映射
/* logical cpu mapping | cpu 逻辑层映射*/
UINT64 g_cpuMap[LOSCFG_KERNEL_CORE_NUM] = {
[0 ... LOSCFG_KERNEL_CORE_NUM - 1] = (UINT64)(-1) //统一赋值,这个赋值方式还挺别致的.
};
......@@ -69,7 +69,7 @@ VOID OsTaskEntrySetupLoopFrame(UINT32 arg0)
"\tpop {fp, pc}\n");
}
#endif
//内核态任务运行栈初始化
/// 内核态任务运行栈初始化
LITE_OS_SEC_TEXT_INIT VOID *OsTaskStackInit(UINT32 taskID, UINT32 stackSize, VOID *topStack, BOOL initFlag)
{
if (initFlag == TRUE) {
......@@ -112,17 +112,14 @@ LITE_OS_SEC_TEXT VOID OsUserCloneParentStack(VOID *childStack, UINTPTR parentTop
if (sigcb->sigContext != NULL) {
cloneStack = (VOID *)((UINTPTR)sigcb->sigContext - sizeof(TaskContext));
} else {
} else {//cloneStack指向 TaskContext
cloneStack = (VOID *)(((UINTPTR)parentTopOfStack + parentStackSize) - sizeof(TaskContext));
//cloneStack指向 TaskContext
}
(VOID)memcpy_s(childStack, sizeof(TaskContext), cloneStack, sizeof(TaskContext));//直接把任务上下文拷贝了一份
((TaskContext *)childStack)->R0 = 0;//R0寄存器为0,这个很重要, pid = fork() pid == 0 是子进程返回.
((TaskContext *)childStack)->R0 = 0;//R0寄存器为0,这个很重要!!! pid = fork() pid == 0 是子进程返回.
}
/*
用户态运行栈初始化,此时上下文还在内核区
*/
/// 用户态运行栈初始化,此时上下文还在内核区
LITE_OS_SEC_TEXT_INIT VOID OsUserTaskStackInit(TaskContext *context, UINTPTR taskEntry, UINTPTR stack)
{
LOS_ASSERT(context != NULL);
......
......@@ -51,18 +51,18 @@
#endif
///分区信息
struct PartitionInfo {
const CHAR *partName; //分区名称
const CHAR *cmdlineArgName; //命令行参数名称
const CHAR *partName; ///< 分区名称
const CHAR *cmdlineArgName; ///< 命令行参数名称
const CHAR *storageTypeArgName;
CHAR *storageType;
const CHAR *fsTypeArgName;
CHAR *fsType; //文件系统类型
CHAR *fsType; ///< 文件系统类型
const CHAR *addrArgName;
INT32 startAddr;
INT32 startAddr; ///< 开始地址
const CHAR *partSizeArgName;
INT32 partSize;
CHAR *devName;
UINT32 partNum; //分区编号
INT32 partSize; ///< 分区大小
CHAR *devName; ///< 设备名称
UINT32 partNum; ///< 分区编号
};
INT32 GetPartitionInfo(struct PartitionInfo *partInfo);
......
......@@ -47,7 +47,7 @@
STATIC CHAR *g_cmdLine = NULL;
STATIC UINT64 g_alignSize = 0;
STATIC struct BootArgs g_bootArgs[MAX_ARGS_NUM] = {0};
//读取环境变量bootcmd 来启动内核
/// 读取环境变量bootcmd 来启动内核
INT32 LOS_GetCmdLine(VOID)
{
int ret;
......
......@@ -93,7 +93,7 @@ UINT16 LOS_HighBitGet(UINT32 bitmap)
return (OS_BITMAP_MASK - CLZ(bitmap));//CLZ = count leading zeros 用于计算整数的前导零
}
///获取参数位图中最低位为1的索引位, 例如: 00110110 返回 1
/// 获取参数位图中最低位为1的索引位, 例如: 00110110 返回 1
UINT16 LOS_LowBitGet(UINT32 bitmap)
{
if (bitmap == 0) {
......@@ -102,7 +102,7 @@ UINT16 LOS_LowBitGet(UINT32 bitmap)
return CTZ(bitmap);// CTZ = count trailing zeros 用于计算给定整数的尾随零
}
///从start位置开始设置numsSet个bit位 置1
/// 从start位置开始设置numsSet个bit位 置1
VOID LOS_BitmapSetNBits(UINTPTR *bitmap, UINT32 start, UINT32 numsSet)
{
UINTPTR *p = bitmap + BITMAP_WORD(start);
......
......@@ -32,5 +32,5 @@
#include "los_percpu_pri.h"
Percpu g_percpu[LOSCFG_KERNEL_CORE_NUM];
Percpu g_percpu[LOSCFG_KERNEL_CORE_NUM]; ///< CPU池,池大小由CPU核数决定
......@@ -55,7 +55,7 @@
#include "los_test_pri.h"
#endif
STATIC SystemRebootFunc g_rebootHook = NULL;//系统重启钩子函数
STATIC SystemRebootFunc g_rebootHook = NULL;///< 系统重启钩子函数
/// 设置系统重启钩子函数
VOID OsSetRebootHook(SystemRebootFunc func)
{
......
......@@ -43,7 +43,7 @@
#endif
/**
* Register kernel init level labels.
* Register kernel init level labels. | 内核初始化等级
*/
OS_INIT_LEVEL_REG(kernel, 10, g_kernInitLevelList);
......@@ -51,9 +51,10 @@ STATIC volatile UINT32 g_initCurrentLevel = OS_INVALID_VALUE; //当前等级
STATIC volatile struct ModuleInitInfo *g_initCurrentModule = 0; //当前模块
STATIC Atomic g_initCount = 0;
STATIC SPIN_LOCK_INIT(g_initLock);
// 建议每个启动框架都封装一层自己的调用接口
/**
* It is recommended that each startup framework encapsulate a layer of its own calling interface.
* 建议每个启动框架都封装一层自己的调用接口
*/
STATIC VOID InitLevelCall(const CHAR *name, const UINT32 level, struct ModuleInitInfo *initLevelList[])
{
......
......@@ -62,7 +62,7 @@
typedef UINT32 (*OsInitHook)(VOID);//初始化钩子函数
struct ModuleInitInfo {//模块初始化信息
OsInitHook hook; //函数指针,钩子函数
OsInitHook hook; ///< 函数指针,钩子函数
#ifdef LOS_INIT_DEBUG
const CHAR *name;
#endif
......
......@@ -48,13 +48,13 @@
#endif
STATIC BOOL g_srandInit;
/// 打开ELF文件
STATIC INT32 OsELFOpen(const CHAR *fileName, INT32 oflags)
{
INT32 ret = -LOS_NOK;
INT32 procFd;
procFd = AllocProcessFd();
procFd = AllocProcessFd();//分配一个文件描述符
if (procFd < 0) {
return -EMFILE;
}
......@@ -63,13 +63,13 @@ STATIC INT32 OsELFOpen(const CHAR *fileName, INT32 oflags)
SetCloexecFlag(procFd);
}
ret = open(fileName, oflags);
ret = open(fileName, oflags);//打开文件
if (ret < 0) {
FreeProcessFd(procFd);
return -get_errno();
}
AssociateSystemFd(procFd, ret);
AssociateSystemFd(procFd, ret);//分配一个系统描述符
return procFd;
}
......@@ -146,7 +146,7 @@ STATIC INT32 OsReadELFInfo(INT32 procfd, UINT8 *buffer, size_t readSize, off_t o
}
return LOS_OK;
}
STATIC INT32 OsVerifyELFEhdr(const LD_ELF_EHDR *ehdr, UINT32 fileLen)
{
if (memcmp(ehdr->elfIdent, LD_ELFMAG, LD_SELFMAG) != 0) {
......@@ -161,7 +161,7 @@ STATIC INT32 OsVerifyELFEhdr(const LD_ELF_EHDR *ehdr, UINT32 fileLen)
PRINT_ERR("%s[%d], The type of machine is not EM_ARM!\n", __FUNCTION__, __LINE__);
return LOS_NOK;
}
if (ehdr->elfPhNum > ELF_PHDR_NUM_MAX) {
if (ehdr->elfPhNum > ELF_PHDR_NUM_MAX) {
PRINT_ERR("%s[%d], The num of program header is out of limit\n", __FUNCTION__, __LINE__);
return LOS_NOK;
}
......@@ -206,7 +206,7 @@ STATIC VOID OsLoadInit(ELFLoadInfo *loadInfo)
loadInfo->execInfo.procfd = INVALID_FD;
loadInfo->interpInfo.procfd = INVALID_FD;
}
STATIC INT32 OsReadEhdr(const CHAR *fileName, ELFInfo *elfInfo, BOOL isExecFile)
{
INT32 ret;
......@@ -221,7 +221,7 @@ STATIC INT32 OsReadEhdr(const CHAR *fileName, ELFInfo *elfInfo, BOOL isExecFile)
PRINT_ERR("%s[%d], Failed to open ELF file: %s!\n", __FUNCTION__, __LINE__, fileName);
return ret;
}
elfInfo->procfd = ret;
elfInfo->procfd = ret;
#ifdef LOSCFG_DRIVERS_TZDRIVER
if (isExecFile) {
......@@ -269,7 +269,7 @@ STATIC INT32 OsReadPhdrs(ELFInfo *elfInfo, BOOL isExecFile)
goto OUT;
}
elfInfo->elfPhdr = LOS_MemAlloc(m_aucSysMem0, size);
elfInfo->elfPhdr = LOS_MemAlloc(m_aucSysMem0, size);
if (elfInfo->elfPhdr == NULL) {
PRINT_ERR("%s[%d], Failed to allocate for elfPhdr!\n", __FUNCTION__, __LINE__);
return -ENOMEM;
......@@ -296,7 +296,7 @@ STATIC INT32 OsReadInterpInfo(ELFLoadInfo *loadInfo)
INT32 ret, i;
for (i = 0; i < loadInfo->execInfo.elfEhdr.elfPhNum; ++i, ++elfPhdr) {
if (elfPhdr->type != LD_PT_INTERP) {
if (elfPhdr->type != LD_PT_INTERP) {
continue;
}
......@@ -328,13 +328,13 @@ STATIC INT32 OsReadInterpInfo(ELFLoadInfo *loadInfo)
ret = -ENOEXEC;
goto OUT;
}
ret = OsReadEhdr(INTERP_FULL_PATH, &loadInfo->interpInfo, FALSE);
if (ret != LOS_OK) {
PRINT_ERR("%s[%d]\n", __FUNCTION__, __LINE__);
goto OUT;
}
ret = OsReadPhdrs(&loadInfo->interpInfo, FALSE);
if (ret != LOS_OK) {
goto OUT;
......@@ -448,7 +448,7 @@ INT32 OsGetKernelVaddr(const LosVmSpace *space, VADDR_T vaddr, VADDR_T *kvaddr)
return LOS_OK;
}
STATIC INT32 OsSetBss(const LD_ELF_PHDR *elfPhdr, INT32 fd, UINTPTR bssStart, UINT32 bssEnd, UINT32 elfProt)
{
UINTPTR bssStartPageAlign, bssEndPageAlign;
......@@ -469,7 +469,7 @@ STATIC INT32 OsSetBss(const LD_ELF_PHDR *elfPhdr, INT32 fd, UINTPTR bssStart, UI
bssMapSize = bssEndPageAlign - bssStartPageAlign;
if (bssMapSize > 0) {
stackFlags = MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS;
mapBase = (UINTPTR)LOS_MMap(bssStartPageAlign, bssMapSize, elfProt, stackFlags, -1, 0);
mapBase = (UINTPTR)LOS_MMap(bssStartPageAlign, bssMapSize, elfProt, stackFlags, -1, 0);
if (!LOS_IsUserAddress((VADDR_T)mapBase)) {
PRINT_ERR("%s[%d], Failed to map bss\n", __FUNCTION__, __LINE__);
return -ENOMEM;
......@@ -488,18 +488,18 @@ STATIC INT32 OsMmapELFFile(INT32 procfd, const LD_ELF_PHDR *elfPhdr, const LD_EL
INT32 ret, i;
INT32 fd = GetAssociatedSystemFd(procfd);
for (i = 0; i < elfEhdr->elfPhNum; ++i, ++elfPhdrTemp) {
if (elfPhdrTemp->type != LD_PT_LOAD) {
for (i = 0; i < elfEhdr->elfPhNum; ++i, ++elfPhdrTemp) {
if (elfPhdrTemp->type != LD_PT_LOAD) {
continue;
}
if (elfEhdr->elfType == LD_ET_EXEC) {
if (elfEhdr->elfType == LD_ET_EXEC) {
if (OsVerifyELFPhdr(elfPhdrTemp) != LOS_OK) {
return -ENOEXEC;
}
}
elfProt = OsGetProt(elfPhdrTemp->flags);
if ((elfProt & PROT_READ) == 0) {
elfProt = OsGetProt(elfPhdrTemp->flags);
if ((elfProt & PROT_READ) == 0) {
return -ENOEXEC;
}
elfFlags = MAP_PRIVATE | MAP_FIXED;
......@@ -507,7 +507,7 @@ STATIC INT32 OsMmapELFFile(INT32 procfd, const LD_ELF_PHDR *elfPhdr, const LD_EL
if ((vAddr == 0) && (*loadBase == 0)) {
elfFlags &= ~MAP_FIXED;
}
mapAddr = OsDoMmapFile(fd, (vAddr + *loadBase), elfPhdrTemp, elfProt, elfFlags, mapSize);
if (!LOS_IsUserAddress((VADDR_T)mapAddr)) {
return -ENOMEM;
......@@ -528,9 +528,9 @@ STATIC INT32 OsMmapELFFile(INT32 procfd, const LD_ELF_PHDR *elfPhdr, const LD_EL
}
if ((elfPhdrTemp->memSize > elfPhdrTemp->fileSize) && (elfPhdrTemp->flags & PF_W)) {
bssStart = mapAddr + ROUNDOFFSET(vAddr, PAGE_SIZE) + elfPhdrTemp->fileSize;
bssEnd = mapAddr + ROUNDOFFSET(vAddr, PAGE_SIZE) + elfPhdrTemp->memSize;
ret = OsSetBss(elfPhdrTemp, fd, bssStart, bssEnd, elfProt);
bssStart = mapAddr + ROUNDOFFSET(vAddr, PAGE_SIZE) + elfPhdrTemp->fileSize;
bssEnd = mapAddr + ROUNDOFFSET(vAddr, PAGE_SIZE) + elfPhdrTemp->memSize;
ret = OsSetBss(elfPhdrTemp, fd, bssStart, bssEnd, elfProt);
if (ret != LOS_OK) {
return ret;
}
......@@ -546,12 +546,12 @@ STATIC INT32 OsLoadInterpBinary(ELFLoadInfo *loadInfo, UINTPTR *interpMapBase)
UINT32 mapSize;
INT32 ret;
mapSize = OsGetAllocSize(loadInfo->interpInfo.elfPhdr, loadInfo->interpInfo.elfEhdr.elfPhNum);
mapSize = OsGetAllocSize(loadInfo->interpInfo.elfPhdr, loadInfo->interpInfo.elfEhdr.elfPhNum);
if (mapSize == 0) {
PRINT_ERR("%s[%d], Failed to get interp allocation size!\n", __FUNCTION__, __LINE__);
return -EINVAL;
}
ret = OsMmapELFFile(loadInfo->interpInfo.procfd, loadInfo->interpInfo.elfPhdr, &loadInfo->interpInfo.elfEhdr,
interpMapBase, mapSize, &loadBase);
if (ret != LOS_OK) {
......@@ -730,7 +730,7 @@ STATIC UINT32 OsGetRndOffset(const ELFLoadInfo *loadInfo)
(VOID)loadInfo;
#endif
return ROUNDDOWN(randomValue, PAGE_SIZE);
return ROUNDDOWN(randomValue, PAGE_SIZE);
}
STATIC VOID OsGetStackProt(ELFLoadInfo *loadInfo)
......@@ -787,7 +787,7 @@ OUT:
(VOID)LOS_MuxRelease(&space->regionMux);
return LOS_NOK;
}
STATIC INT32 OsSetArgParams(ELFLoadInfo *loadInfo, CHAR *const *argv, CHAR *const *envp)
{
UINT32 vmFlags;
......@@ -801,8 +801,8 @@ STATIC INT32 OsSetArgParams(ELFLoadInfo *loadInfo, CHAR *const *argv, CHAR *cons
}
}
(VOID)OsGetStackProt(loadInfo);
if (((UINT32)loadInfo->stackProt & (PROT_READ | PROT_WRITE)) != (PROT_READ | PROT_WRITE)) {
(VOID)OsGetStackProt(loadInfo);
if (((UINT32)loadInfo->stackProt & (PROT_READ | PROT_WRITE)) != (PROT_READ | PROT_WRITE)) {
return -ENOEXEC;
}
loadInfo->stackTopMax = USER_STACK_TOP_MAX - OsGetRndOffset(loadInfo);
......@@ -821,7 +821,7 @@ STATIC INT32 OsSetArgParams(ELFLoadInfo *loadInfo, CHAR *const *argv, CHAR *cons
loadInfo->argc = OsGetParamNum(argv);
loadInfo->envc = OsGetParamNum(envp);
ret = OsCopyParams(loadInfo, 1, (CHAR *const *)&loadInfo->fileName);
ret = OsCopyParams(loadInfo, 1, (CHAR *const *)&loadInfo->fileName);
if (ret != LOS_OK) {
PRINT_ERR("%s[%d], Failed to copy filename to user stack!\n", __FUNCTION__, __LINE__);
return ret;
......@@ -832,7 +832,7 @@ STATIC INT32 OsSetArgParams(ELFLoadInfo *loadInfo, CHAR *const *argv, CHAR *cons
if (ret != LOS_OK) {
return ret;
}
ret = OsCopyParams(loadInfo, loadInfo->argc, argv);
ret = OsCopyParams(loadInfo, loadInfo->argc, argv);
if (ret != LOS_OK) {
return ret;
}
......@@ -840,7 +840,7 @@ STATIC INT32 OsSetArgParams(ELFLoadInfo *loadInfo, CHAR *const *argv, CHAR *cons
return LOS_OK;
}
STATIC INT32 OsPutParamToStack(ELFLoadInfo *loadInfo, const UINTPTR *auxVecInfo, INT32 vecIndex)
{
UINTPTR *topMem = (UINTPTR *)ROUNDDOWN(loadInfo->topOfMem, sizeof(UINTPTR));
......@@ -944,7 +944,7 @@ STATIC INT32 OsMakeArgsStack(ELFLoadInfo *loadInfo, UINTPTR interpMapBase)
#endif
AUX_VEC_ENTRY(auxVector, vecIndex, AUX_NULL, 0);
ret = OsPutParamToStack(loadInfo, auxVecInfo, vecIndex);
ret = OsPutParamToStack(loadInfo, auxVecInfo, vecIndex);
if (ret != LOS_OK) {
PRINT_ERR("%s[%d], Failed to put param to user stack\n", __FUNCTION__, __LINE__);
return ret;
......@@ -989,7 +989,7 @@ STATIC INT32 OsLoadELFSegment(ELFLoadInfo *loadInfo)
return ret;
}
loadInfo->elfEntry = loadInfo->interpInfo.elfEhdr.elfEntry + interpMapBase;
loadInfo->elfEntry = loadInfo->interpInfo.elfEhdr.elfEntry + interpMapBase;
loadInfo->execInfo.elfEhdr.elfEntry = loadInfo->execInfo.elfEhdr.elfEntry + loadBase;
} else {
loadInfo->elfEntry = loadInfo->execInfo.elfEhdr.elfEntry;
......@@ -1011,14 +1011,14 @@ STATIC VOID OsFlushAspace(ELFLoadInfo *loadInfo)
{
LosProcessCB *processCB = OsCurrProcessGet();
OsExecDestroyTaskGroup();
OsExecDestroyTaskGroup();
loadInfo->oldSpace = processCB->vmSpace;
loadInfo->oldSpace = processCB->vmSpace;
processCB->vmSpace = loadInfo->newSpace;
processCB->vmSpace->heapBase += OsGetRndOffset(loadInfo);
processCB->vmSpace->heapNow = processCB->vmSpace->heapBase;
processCB->vmSpace->mapBase += OsGetRndOffset(loadInfo);
processCB->vmSpace->mapSize = loadInfo->stackBase - processCB->vmSpace->mapBase;
processCB->vmSpace->mapSize = loadInfo->stackBase - processCB->vmSpace->mapBase;
LOS_ArchMmuContextSwitch(&OsCurrProcessGet()->vmSpace->archMmu);
}
......@@ -1026,11 +1026,11 @@ STATIC VOID OsDeInitLoadInfo(ELFLoadInfo *loadInfo)
{
(VOID)close(loadInfo->randomDevFD);
if (loadInfo->execInfo.elfPhdr != NULL) {
if (loadInfo->execInfo.elfPhdr != NULL) {
(VOID)LOS_MemFree(m_aucSysMem0, loadInfo->execInfo.elfPhdr);
}
if (loadInfo->interpInfo.elfPhdr != NULL) {
if (loadInfo->interpInfo.elfPhdr != NULL) {
(VOID)LOS_MemFree(m_aucSysMem0, loadInfo->interpInfo.elfPhdr);
}
}
......@@ -1053,9 +1053,9 @@ INT32 OsLoadELFFile(ELFLoadInfo *loadInfo)
{
INT32 ret;
OsLoadInit(loadInfo);
OsLoadInit(loadInfo);
ret = OsReadEhdr(loadInfo->fileName, &loadInfo->execInfo, TRUE);
ret = OsReadEhdr(loadInfo->fileName, &loadInfo->execInfo, TRUE);
if (ret != LOS_OK) {
goto OUT;
}
......@@ -1065,7 +1065,7 @@ INT32 OsLoadELFFile(ELFLoadInfo *loadInfo)
goto OUT;
}
ret = OsReadInterpInfo(loadInfo);
ret = OsReadInterpInfo(loadInfo);
if (ret != LOS_OK) {
goto OUT;
}
......@@ -1077,14 +1077,14 @@ INT32 OsLoadELFFile(ELFLoadInfo *loadInfo)
OsFlushAspace(loadInfo);
ret = OsLoadELFSegment(loadInfo);
if (ret != LOS_OK) {
ret = OsLoadELFSegment(loadInfo);
if (ret != LOS_OK) {
OsCurrProcessGet()->vmSpace = loadInfo->oldSpace;
LOS_ArchMmuContextSwitch(&OsCurrProcessGet()->vmSpace->archMmu);
goto OUT;
}
OsDeInitLoadInfo(loadInfo);
OsDeInitLoadInfo(loadInfo);
return LOS_OK;
......
......@@ -32,7 +32,7 @@
#include "los_cir_buf.h"
//返回循环buf已使用的大小
/// 返回循环buf已使用的大小
UINT32 LOS_CirBufUsedSize(CirBuf *cirbufCB)
{
UINT32 size;
......@@ -73,7 +73,7 @@ STATIC UINT32 OsCirBufWriteLinear(CirBuf *cirbufCB, const CHAR *buf, UINT32 size
return cpSize;
}
/* 图形表示写循环buf loop 模式 ,图表示 写之前的样子 @note_pic
/* 图形表示写循环buf loop 模式 ,图表示 写之前的样子 @note_pic
* endIdx 第二阶段拷贝
* | | |
* X X X X X X X X 0 0 0 0 0 0 0 0 X X X X X X X X
......@@ -128,7 +128,7 @@ UINT32 LOS_CirBufWrite(CirBuf *cirbufCB, const CHAR *buf, UINT32 size)
return cpSize;
}
/* 图形表示读线性buf linear 模式 ,图表示 读之前的样子 @note_pic
/* 图形表示读线性buf linear 模式 ,图表示 读之前的样子 @note_pic
* endIdx
* |
* X X X X X X X X 0 0 0 0 0 0 0 0 X X X X X X X X
......
#git fetch
git pull origin master
git pull git@gitee.com:weharmony/kernel_liteos_a_note.git master
#git pull --rebase origin master
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册