更新日期: 2022/06/01 来源: https://gitee.com/weharmony/kernel_liteos_a_note
dmesg.c 文件参考

dmesg命令用于控制内核dmesg缓存区。 http://weharmonyos.com/openharmony/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-dmesg.html https://man7.org/linux/man-pages/man1/dmesg.1.html 更多...

浏览源代码.

函数

LITE_OS_SEC_BSS STATIC SPIN_LOCK_INIT (g_dmesgSpin)
 
STATIC VOID OsLockConsole (VOID)
 关闭控制台 更多...
 
STATIC VOID OsUnlockConsole (VOID)
 打开控制台 更多...
 
STATIC VOID OsLockUart (VOID)
 关闭串口 更多...
 
STATIC VOID OsUnlockUart (VOID)
 打开串口 更多...
 
STATIC UINT32 OsCheckError (VOID)
 读取dmesg日志 更多...
 
STATIC INT32 OsDmesgRead (CHAR *buf, UINT32 len)
 
STATIC INT32 OsCopyToNew (const VOID *addr, UINT32 size)
 把旧人账目移交给新人 更多...
 
STATIC UINT32 OsDmesgResetMem (const VOID *addr, UINT32 size)
 重置内存 更多...
 
STATIC UINT32 OsDmesgChangeSize (UINT32 size)
 调整缓冲区大小,如下五个步骤 更多...
 
UINT32 OsCheckConsoleLock (VOID)
 
UINT32 OsCheckUartLock (VOID)
 
UINT32 OsDmesgInit (VOID)
 初始化 dmesg 更多...
 
STATIC CHAR OsLogRecordChar (CHAR c)
 只记录一个字符 更多...
 
UINT32 OsLogRecordStr (const CHAR *str, UINT32 len)
 记录一个字符串 更多...
 
STATIC VOID OsBufFullWrite (const CHAR *dst, UINT32 logLen)
 
STATIC VOID OsWriteTailToHead (const CHAR *dst, UINT32 logLen)
 从头写入 更多...
 
STATIC VOID OsWriteTailToEnd (const CHAR *dst, UINT32 logLen)
 从尾写入 更多...
 
INT32 OsLogMemcpyRecord (const CHAR *buf, UINT32 logLen)
 内存拷贝日志 更多...
 
VOID OsLogShow (VOID)
 使用串口打印日志 更多...
 
STATIC INT32 OsDmesgLvSet (const CHAR *level)
 设置日志层级 更多...
 
STATIC INT32 OsDmesgMemSizeSet (const CHAR *size)
 
UINT32 OsDmesgLvGet (VOID)
 
UINT32 LOS_DmesgLvSet (UINT32 level)
 Set the dmesg level 更多...
 
VOID LOS_DmesgClear (VOID)
 Clear dmesg log. 更多...
 
UINT32 LOS_DmesgMemSet (const VOID *addr, UINT32 size)
 设置dmesg缓存大小 更多...
 
INT32 LOS_DmesgRead (CHAR *buf, UINT32 len)
 读取 dmesg 消息 更多...
 
INT32 OsDmesgWrite2File (const CHAR *fullpath, const CHAR *buf, UINT32 logSize)
 
INT32 LOS_DmesgToFile (const CHAR *filename)
 将dmesg 保存到文件中 更多...
 
INT32 LOS_DmesgToFile (CHAR *filename)
 
INT32 OsShellCmdDmesg (INT32 argc, const CHAR **argv)
 dmesg全称是display message (or display driver),即显示信息。 更多...
 
 SHELLCMD_ENTRY (dmesg_shellcmd, CMD_TYPE_STD, "dmesg", XARGS,(CmdCallBackFunc) OsShellCmdDmesg)
 
 LOS_MODULE_INIT (OsDmesgInit, LOS_INIT_LEVEL_EARLIEST)
 

变量

STATIC DmesgInfog_dmesgInfo = NULL
 保存在 g_mallocAddr 的开始位置,即头信息 更多...
 
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 const CHARg_levelString []
 

详细描述

dmesg命令用于控制内核dmesg缓存区。 http://weharmonyos.com/openharmony/zh-cn/device-dev/kernel/kernel-small-debug-shell-cmd-dmesg.html https://man7.org/linux/man-pages/man1/dmesg.1.html

   +-------------------------------------------------------+
   | Info |         log_space                             |
   +-------------------------------------------------------+
   |
   |__buffer_space

Case A:
   +-------------------------------------------------------+
   |          |#############################|             |
   +-------------------------------------------------------+
              |                             |
             Head                           Tail
Case B:
   +-------------------------------------------------------+
   |##########|                                   |#######|
   +-------------------------------------------------------+
             |                                    |
             Tail                                 Head
版本
作者
weharmonyos.com | 鸿蒙研究站 | 每天死磕一点点
日期
2021-11-25

在文件 dmesg.c 中定义.

函数说明

◆ LOS_DmesgClear()

VOID LOS_DmesgClear ( VOID  )

Clear dmesg log.

Description:
This API is used to clear dmesg log.
注意
None.
参数
None.
返回值
None.
Dependency:
  • dmesg.h: the header file that contains the API declaration.
参见
LOS_DmesgClear

在文件 dmesg.c621 行定义.

622{
623 UINT32 intSave;
624
625 LOS_SpinLockSave(&g_dmesgSpin, &intSave);
626 (VOID)memset_s(g_dmesgInfo->logBuf, g_logBufSize, 0, g_logBufSize);
627 g_dmesgInfo->logHead = 0;
628 g_dmesgInfo->logTail = 0;
629 g_dmesgInfo->logSize = 0;
630 LOS_SpinUnlockRestore(&g_dmesgSpin, intSave);
631}
STATIC UINT32 g_logBufSize
缓冲区内容体大小
Definition: dmesg.c:79
STATIC DmesgInfo * g_dmesgInfo
保存在 g_mallocAddr 的开始位置,即头信息
Definition: dmesg.c:78
VOID LOS_SpinUnlockRestore(SPIN_LOCK_S *lock, UINT32 intSave)
Definition: los_spinlock.c:108
VOID LOS_SpinLockSave(SPIN_LOCK_S *lock, UINT32 *intSave)
Definition: los_spinlock.c:98
unsigned int UINT32
Definition: los_typedef.h:57
UINT32 logTail
Definition: dmesg_pri.h:51
UINT32 logSize
Definition: dmesg_pri.h:49
UINT32 logHead
Definition: dmesg_pri.h:50
CHAR * logBuf
Definition: dmesg_pri.h:52
函数调用图:
这是这个函数的调用关系图:

◆ LOS_DmesgLvSet()

UINT32 LOS_DmesgLvSet ( UINT32  level)

Set the dmesg level

Description:
This API is used to set the level of log that want to stored in dmesg buffer.
注意
  • It would be useless if the level is less than print level.
参数
level[IN] Type UINT32 The level expected to set, range from 0 to 5.
返回值
#1Set dmesg level fail.
#0Set dmesg level success.
Dependency:
  • dmesg.h: the header file that contains the API declaration.
参见
LOS_DmesgLvSet

在文件 dmesg.c611 行定义.

612{
613 if (level > 5) { /* 5: count of level */
614 return LOS_NOK;
615 }
616
617 g_dmesgLogLevel = level;
618 return LOS_OK;
619}
STATIC UINT32 g_dmesgLogLevel
日志等级
Definition: dmesg.c:81
这是这个函数的调用关系图:

◆ LOS_DmesgMemSet()

UINT32 LOS_DmesgMemSet ( const VOID *  addr,
UINT32  size 
)

设置dmesg缓存大小

Set dmesg buffer.

在文件 dmesg.c633 行定义.

634{
635 UINT32 ret = 0;
636
637 if (addr == NULL) {
638 ret = OsDmesgChangeSize(size);
639 } else {
640 ret = OsDmesgResetMem(addr, size);
641 }
642 return ret;
643}
STATIC UINT32 OsDmesgResetMem(const VOID *addr, UINT32 size)
重置内存
Definition: dmesg.c:232
STATIC UINT32 OsDmesgChangeSize(UINT32 size)
调整缓冲区大小,如下五个步骤
Definition: dmesg.c:273
函数调用图:
这是这个函数的调用关系图:

◆ LOS_DmesgRead()

INT32 LOS_DmesgRead ( CHAR buf,
UINT32  len 
)

读取 dmesg 消息

Read log from dmesg buffer.

在文件 dmesg.c645 行定义.

646{
647 INT32 ret;
648 UINT32 intSave;
649
650 if (buf == NULL) {
651 return -1;
652 }
653 if (len == 0) {
654 return 0;
655 }
656
657 LOS_SpinLockSave(&g_dmesgSpin, &intSave);
658 ret = OsDmesgRead(buf, len);
659 LOS_SpinUnlockRestore(&g_dmesgSpin, intSave);
660 return ret;
661}
STATIC INT32 OsDmesgRead(CHAR *buf, UINT32 len)
Definition: dmesg.c:131
signed int INT32
Definition: los_typedef.h:60
函数调用图:

◆ LOS_DmesgToFile() [1/2]

INT32 LOS_DmesgToFile ( CHAR filename)

在文件 dmesg.c733 行定义.

734{
735 (VOID)filename;
736 PRINTK("File operation need VFS\n");
737 return -1;
738}

◆ LOS_DmesgToFile() [2/2]

INT32 LOS_DmesgToFile ( const CHAR filename)

将dmesg 保存到文件中

Copy log to file.

在文件 dmesg.c678 行定义.

679{
680 CHAR *fullpath = NULL;
681 CHAR *buf = NULL;
682 INT32 ret;
683 CHAR *shellWorkingDirectory = OsShellGetWorkingDirectory();//获取工作路径
684 UINT32 logSize, bufSize, head, tail, intSave;
685 CHAR *logBuf = NULL;
686
687 LOS_SpinLockSave(&g_dmesgSpin, &intSave);
688 if (OsCheckError()) {
689 LOS_SpinUnlockRestore(&g_dmesgSpin, intSave);
690 return -1;
691 }
692 logSize = g_dmesgInfo->logSize;
693 bufSize = g_logBufSize;
694 head = g_dmesgInfo->logHead;
695 tail = g_dmesgInfo->logTail;
696 logBuf = g_dmesgInfo->logBuf;
697 LOS_SpinUnlockRestore(&g_dmesgSpin, intSave);
698
699 ret = vfs_normalize_path(shellWorkingDirectory, filename, &fullpath);//获取绝对路径
700 if (ret != 0) {
701 return -1;
702 }
703
704 buf = (CHAR *)malloc(logSize);
705 if (buf == NULL) {
706 goto ERR_OUT2;
707 }
708
709 if (head < tail) {
710 ret = memcpy_s(buf, logSize, logBuf + head, logSize);
711 if (ret != EOK) {
712 goto ERR_OUT3;
713 }
714 } else {
715 ret = memcpy_s(buf, logSize, logBuf + head, bufSize - head);
716 if (ret != EOK) {
717 goto ERR_OUT3;
718 }
719 ret = memcpy_s(buf + bufSize - head, logSize - (bufSize - head), logBuf, tail);
720 if (ret != EOK) {
721 goto ERR_OUT3;
722 }
723 }
724
725 ret = OsDmesgWrite2File(fullpath, buf, logSize);//写文件
726ERR_OUT3:
727 free(buf);
728ERR_OUT2:
729 free(fullpath);
730 return ret;
731}
char * OsShellGetWorkingDirectory(void)
Definition: shcmd.c:94
STATIC UINT32 OsCheckError(VOID)
读取dmesg日志
Definition: dmesg.c:113
INT32 OsDmesgWrite2File(const CHAR *fullpath, const CHAR *buf, UINT32 logSize)
Definition: dmesg.c:663
int vfs_normalize_path(const char *directory, const char *filename, char **pathname)
Definition: fullpath.c:245
char CHAR
Definition: los_typedef.h:63
void * malloc(size_t size)
动态分配内存块大小
Definition: malloc.c:81
void free(void *ptr)
释放ptr所指向的内存空间
Definition: malloc.c:66
函数调用图:
这是这个函数的调用关系图:

◆ LOS_MODULE_INIT()

LOS_MODULE_INIT ( OsDmesgInit  ,
LOS_INIT_LEVEL_EARLIEST   
)

◆ OsBufFullWrite()

STATIC VOID OsBufFullWrite ( const CHAR dst,
UINT32  logLen 
)

在文件 dmesg.c382 行定义.

383{
384 UINT32 bufSize = g_logBufSize;
385 UINT32 tail = g_dmesgInfo->logTail;
386 CHAR *buf = g_dmesgInfo->logBuf;
387 errno_t ret;
388
389 if (!logLen || (dst == NULL)) {
390 return;
391 }
392 if (logLen > bufSize) { /* full re-write */
393 ret = memcpy_s(buf + tail, bufSize - tail, dst, bufSize - tail);
394 if (ret != EOK) {
395 PRINT_ERR("%s,%d memcpy_s failed, err:%d!\n", __FUNCTION__, __LINE__, ret);
396 return;
397 }
398 ret = memcpy_s(buf, bufSize, dst + bufSize - tail, tail);
399 if (ret != EOK) {
400 PRINT_ERR("%s,%d memcpy_s failed, err:%d!\n", __FUNCTION__, __LINE__, ret);
401 return;
402 }
403
404 OsBufFullWrite(dst + bufSize, logLen - bufSize);
405 } else {
406 if (logLen > (bufSize - tail)) { /* need cycle back to start */
407 ret = memcpy_s(buf + tail, bufSize - tail, dst, bufSize - tail);
408 if (ret != EOK) {
409 PRINT_ERR("%s,%d memcpy_s failed, err:%d!\n", __FUNCTION__, __LINE__, ret);
410 return;
411 }
412 ret = memcpy_s(buf, bufSize, dst + bufSize - tail, logLen - (bufSize - tail));
413 if (ret != EOK) {
414 PRINT_ERR("%s,%d memcpy_s failed, err:%d!\n", __FUNCTION__, __LINE__, ret);
415 return;
416 }
417
418 g_dmesgInfo->logTail = logLen - (bufSize - tail);
420 } else { /* no need cycle back to start */
421 ret = memcpy_s(buf + tail, bufSize - tail, dst, logLen);
422 if (ret != EOK) {
423 PRINT_ERR("%s,%d memcpy_s failed, err:%d!\n", __FUNCTION__, __LINE__, ret);
424 return;
425 }
426 g_dmesgInfo->logTail += logLen;
427 if (g_dmesgInfo->logTail > BUF_MAX_INDEX) {
428 g_dmesgInfo->logTail = 0;
429 }
431 }
432 }
433}
STATIC VOID OsBufFullWrite(const CHAR *dst, UINT32 logLen)
Definition: dmesg.c:382
函数调用图:
这是这个函数的调用关系图:

◆ OsCheckConsoleLock()

UINT32 OsCheckConsoleLock ( VOID  )

在文件 dmesg.c323 行定义.

324{
325 return g_consoleLock;
326}
STATIC UINT32 g_consoleLock
用于关闭和打开控制台
Definition: dmesg.c:82
这是这个函数的调用关系图:

◆ OsCheckError()

STATIC UINT32 OsCheckError ( VOID  )

读取dmesg日志

在文件 dmesg.c113 行定义.

这是这个函数的调用关系图:

◆ OsCheckUartLock()

UINT32 OsCheckUartLock ( VOID  )

在文件 dmesg.c328 行定义.

329{
330 return g_uartLock;
331}
STATIC UINT32 g_uartLock
用于关闭和打开串口
Definition: dmesg.c:83
这是这个函数的调用关系图:

◆ OsCopyToNew()

STATIC INT32 OsCopyToNew ( const VOID *  addr,
UINT32  size 
)

把旧人账目移交给新人

在文件 dmesg.c182 行定义.

183{
184 UINT32 copyStart = 0;
185 UINT32 copyLen;
186 CHAR *temp = NULL;
187 CHAR *newBuf = (CHAR *)addr + sizeof(DmesgInfo);
188 UINT32 bufSize = size - sizeof(DmesgInfo);
189 INT32 ret;
190 UINT32 intSave;
191
192 LOS_SpinLockSave(&g_dmesgSpin, &intSave);
193 if (g_dmesgInfo->logSize == 0) {
194 LOS_SpinUnlockRestore(&g_dmesgSpin, intSave);
195 return 0;
196 }
197
198 temp = (CHAR *)malloc(g_dmesgInfo->logSize);
199 if (temp == NULL) {
200 LOS_SpinUnlockRestore(&g_dmesgSpin, intSave);
201 return -1;
202 }
203
204 (VOID)memset_s(temp, g_dmesgInfo->logSize, 0, g_dmesgInfo->logSize);
205 copyLen = ((bufSize < g_dmesgInfo->logSize) ? bufSize : g_dmesgInfo->logSize);
206 if (bufSize < g_dmesgInfo->logSize) {
207 copyStart = g_dmesgInfo->logSize - bufSize;
208 }
209
210 ret = OsDmesgRead(temp, g_dmesgInfo->logSize);
211 if (ret <= 0) {
212 goto FREE_OUT;
213 }
214
215 /* if new buf size smaller than logSize */
216 ret = memcpy_s(newBuf, bufSize, temp + copyStart, copyLen);
217 if (ret != EOK) {
218 goto FREE_OUT;
219 }
220 LOS_SpinUnlockRestore(&g_dmesgSpin, intSave);
221 free(temp);
222
223 return (INT32)copyLen;
224
225FREE_OUT:
226 LOS_SpinUnlockRestore(&g_dmesgSpin, intSave);
227 PRINT_ERR("%s,%d failed, err:%d!\n", __FUNCTION__, __LINE__, ret);
228 free(temp);
229 return -1;
230}
函数调用图:
这是这个函数的调用关系图:

◆ OsDmesgChangeSize()

STATIC UINT32 OsDmesgChangeSize ( UINT32  size)

调整缓冲区大小,如下五个步骤

在文件 dmesg.c273 行定义.

274{
275 VOID *temp = NULL;
276 INT32 copyLen;
277 CHAR *newString = NULL;
278 UINT32 intSave;
279
280 if (size == 0) {
281 return LOS_NOK;
282 }
283 //1. 重新整一块新地方
284 newString = (CHAR *)malloc(size + sizeof(DmesgInfo));
285 if (newString == NULL) {//新人未找到,旧人得接着用
286 return LOS_NOK;
287 }
288
289 LOS_SpinLockSave(&g_dmesgSpin, &intSave);
290 temp = g_dmesgInfo;
291 LOS_SpinUnlockRestore(&g_dmesgSpin, intSave);
292 //2.把旧人账目移交给新人
293 copyLen = OsCopyToNew(newString, size + sizeof(DmesgInfo));
294 if (copyLen < 0) {
295 goto ERR_OUT;
296 }
297 //3.以新换旧
298 LOS_SpinLockSave(&g_dmesgSpin, &intSave);
299 g_logBufSize = size;
300 g_dmesgInfo = (DmesgInfo *)newString;
301 g_dmesgInfo->logBuf = (CHAR *)newString + sizeof(DmesgInfo);
302 g_dmesgInfo->logSize = copyLen;
303 g_dmesgInfo->logTail = ((copyLen == g_logBufSize) ? 0 : copyLen);
304 g_dmesgInfo->logHead = 0;
305 //4. 有新欢了,释放旧人去找寻真爱
306 if (temp == g_mallocAddr) {
307 goto FREE_OUT;
308 }
309 g_mallocAddr = newString;//5. 正式和新人媾和
310 LOS_SpinUnlockRestore(&g_dmesgSpin, intSave);
311
312 return LOS_OK;
313ERR_OUT:
314 free(newString);
315 return LOS_NOK;
316FREE_OUT:
317 g_mallocAddr = newString;
318 LOS_SpinUnlockRestore(&g_dmesgSpin, intSave);
319 free(temp);
320 return LOS_OK;
321}
STATIC VOID * g_mallocAddr
缓存区开始位置,即头位置
Definition: dmesg.c:80
STATIC INT32 OsCopyToNew(const VOID *addr, UINT32 size)
把旧人账目移交给新人
Definition: dmesg.c:182
函数调用图:
这是这个函数的调用关系图:

◆ OsDmesgInit()

UINT32 OsDmesgInit ( VOID  )

初始化 dmesg

在文件 dmesg.c333 行定义.

334{
335 CHAR* buffer = NULL;
336
337 buffer = (CHAR *)malloc(KERNEL_LOG_BUF_SIZE + sizeof(DmesgInfo));//总内存分 头 + 体两部分
338 if (buffer == NULL) {
339 return LOS_NOK;
340 }
341 g_mallocAddr = buffer;
342 g_dmesgInfo = (DmesgInfo *)buffer;//全局变量
343 g_dmesgInfo->logHead = 0;//读取开始位置 记录在头部
344 g_dmesgInfo->logTail = 0;//写入开始位置 记录在头部
345 g_dmesgInfo->logSize = 0;//日志已占用数量 记录在头部
346 g_dmesgInfo->logBuf = buffer + sizeof(DmesgInfo);//身体部分开始位置
347 g_logBufSize = KERNEL_LOG_BUF_SIZE;//身体部分总大小位置
348
349 return LOS_OK;
350}
函数调用图:

◆ OsDmesgLvGet()

UINT32 OsDmesgLvGet ( VOID  )

在文件 dmesg.c606 行定义.

607{
608 return g_dmesgLogLevel;
609}
这是这个函数的调用关系图:

◆ OsDmesgLvSet()

STATIC INT32 OsDmesgLvSet ( const CHAR level)

设置日志层级

在文件 dmesg.c563 行定义.

564{
565 UINT32 levelNum, ret;
566 CHAR *p = NULL;
567
568 levelNum = strtoul(level, &p, 0);
569 if (*p != 0) {
570 PRINTK("dmesg: invalid option or parameter.\n");
571 return -1;
572 }
573
574 ret = LOS_DmesgLvSet(levelNum);
575 if (ret == LOS_OK) {
576 PRINTK("Set current dmesg log level %s\n", g_levelString[g_dmesgLogLevel]);
577 return LOS_OK;
578 } else {
579 PRINTK("current dmesg log level %s\n", g_levelString[g_dmesgLogLevel]);
580 PRINTK("dmesg -l [num] can access as 0:EMG 1:COMMON 2:ERROR 3:WARN 4:INFO 5:DEBUG\n");
581 return -1;
582 }
583}
UINT32 LOS_DmesgLvSet(UINT32 level)
Set the dmesg level
Definition: dmesg.c:611
STATIC const CHAR * g_levelString[]
Definition: dmesg.c:84
函数调用图:
这是这个函数的调用关系图:

◆ OsDmesgMemSizeSet()

STATIC INT32 OsDmesgMemSizeSet ( const CHAR size)

在文件 dmesg.c585 行定义.

586{
587 UINT32 sizeVal;
588 CHAR *p = NULL;
589
590 sizeVal = strtoul(size, &p, 0);
591 if (sizeVal > MAX_KERNEL_LOG_BUF_SIZE) {
592 goto ERR_OUT;
593 }
594
595 if (!(LOS_DmesgMemSet(NULL, sizeVal))) {
596 PRINTK("Set dmesg buf size %u success\n", sizeVal);
597 return LOS_OK;
598 } else {
599 goto ERR_OUT;
600 }
601
602ERR_OUT:
603 PRINTK("Set dmesg buf size %u fail\n", sizeVal);
604 return LOS_NOK;
605}
UINT32 LOS_DmesgMemSet(const VOID *addr, UINT32 size)
设置dmesg缓存大小
Definition: dmesg.c:633
函数调用图:
这是这个函数的调用关系图:

◆ OsDmesgRead()

STATIC INT32 OsDmesgRead ( CHAR buf,
UINT32  len 
)

在文件 dmesg.c131 行定义.

132{
133 UINT32 readLen;
134 UINT32 logSize = g_dmesgInfo->logSize;
135 UINT32 head = g_dmesgInfo->logHead;
136 UINT32 tail = g_dmesgInfo->logTail;
137 CHAR *logBuf = g_dmesgInfo->logBuf;
138 errno_t ret;
139
140 if (OsCheckError()) {
141 return -1;
142 }
143 if (logSize == 0) {
144 return 0;
145 }
146
147 readLen = len < logSize ? len : logSize;
148
149 if (head < tail) { /* Case A */
150 ret = memcpy_s(buf, len, logBuf + head, readLen);
151 if (ret != EOK) {
152 return -1;
153 }
154 g_dmesgInfo->logHead += readLen;
155 g_dmesgInfo->logSize -= readLen;
156 } else { /* Case B */
157 if (readLen <= (g_logBufSize - head)) {
158 ret = memcpy_s(buf, len, logBuf + head, readLen);
159 if (ret != EOK) {
160 return -1;
161 }
162 g_dmesgInfo->logHead += readLen;
163 g_dmesgInfo->logSize -= readLen;
164 } else {
165 ret = memcpy_s(buf, len, logBuf + head, g_logBufSize - head);
166 if (ret != EOK) {
167 return -1;
168 }
169
170 ret = memcpy_s(buf + g_logBufSize - head, len - (g_logBufSize - head),
171 logBuf, readLen - (g_logBufSize - head));
172 if (ret != EOK) {
173 return -1;
174 }
175 g_dmesgInfo->logHead = readLen - (g_logBufSize - head);
176 g_dmesgInfo->logSize -= readLen;
177 }
178 }
179 return (INT32)readLen;
180}
函数调用图:
这是这个函数的调用关系图:

◆ OsDmesgResetMem()

STATIC UINT32 OsDmesgResetMem ( const VOID *  addr,
UINT32  size 
)

重置内存

在文件 dmesg.c232 行定义.

233{
234 VOID *temp = NULL;
235 INT32 copyLen;
236 UINT32 intSave;
237
238 if (size <= sizeof(DmesgInfo)) {
239 return LOS_NOK;
240 }
241
242 LOS_SpinLockSave(&g_dmesgSpin, &intSave);
243 temp = g_dmesgInfo;
244 LOS_SpinUnlockRestore(&g_dmesgSpin, intSave);
245 copyLen = OsCopyToNew(addr, size);
246 if (copyLen < 0) {
247 return LOS_NOK;
248 }
249
250 LOS_SpinLockSave(&g_dmesgSpin, &intSave);
251 g_logBufSize = size - sizeof(DmesgInfo);
252 g_dmesgInfo = (DmesgInfo *)addr;
253 g_dmesgInfo->logBuf = (CHAR *)addr + sizeof(DmesgInfo);
254 g_dmesgInfo->logSize = copyLen;
255 g_dmesgInfo->logTail = ((copyLen == g_logBufSize) ? 0 : copyLen);
256 g_dmesgInfo->logHead = 0;
257
258 /* if old mem came from malloc */
259 if (temp == g_mallocAddr) {
260 goto FREE_OUT;
261 }
262 LOS_SpinUnlockRestore(&g_dmesgSpin, intSave);
263
264 return LOS_OK;
265
266FREE_OUT:
267 g_mallocAddr = NULL;
268 LOS_SpinUnlockRestore(&g_dmesgSpin, intSave);
269 free(temp);
270 return LOS_OK;
271}
函数调用图:
这是这个函数的调用关系图:

◆ OsDmesgWrite2File()

INT32 OsDmesgWrite2File ( const CHAR fullpath,
const CHAR buf,
UINT32  logSize 
)

在文件 dmesg.c663 行定义.

664{
665 INT32 ret;
666
667 INT32 fd = open(fullpath, O_CREAT | O_RDWR | O_APPEND, 0644); /* 0644:file right */
668 if (fd < 0) {
669 return -1;
670 }
671 ret = write(fd, buf, logSize);
672 (VOID)close(fd);
673 return ret;
674}
这是这个函数的调用关系图:

◆ OsLockConsole()

STATIC VOID OsLockConsole ( VOID  )

关闭控制台

在文件 dmesg.c93 行定义.

94{
95 g_consoleLock = 1;
96}
这是这个函数的调用关系图:

◆ OsLockUart()

STATIC VOID OsLockUart ( VOID  )

关闭串口

在文件 dmesg.c103 行定义.

104{
105 g_uartLock = 1;
106}
这是这个函数的调用关系图:

◆ OsLogMemcpyRecord()

INT32 OsLogMemcpyRecord ( const CHAR buf,
UINT32  logLen 
)

内存拷贝日志

在文件 dmesg.c508 行定义.

509{
510 UINT32 intSave;
511
512 LOS_SpinLockSave(&g_dmesgSpin, &intSave);
513 if (OsCheckError()) {
514 LOS_SpinUnlockRestore(&g_dmesgSpin, intSave);
515 return -1;
516 }
519 OsWriteTailToEnd(buf, logLen);
520 } else {
521 OsWriteTailToHead(buf, logLen);
522 }
523 } else {
524 OsBufFullWrite(buf, logLen);
525 }
526 LOS_SpinUnlockRestore(&g_dmesgSpin, intSave);
527
528 return LOS_OK;
529}
STATIC VOID OsWriteTailToHead(const CHAR *dst, UINT32 logLen)
从头写入
Definition: dmesg.c:435
STATIC VOID OsWriteTailToEnd(const CHAR *dst, UINT32 logLen)
从尾写入
Definition: dmesg.c:470
函数调用图:
这是这个函数的调用关系图:

◆ OsLogRecordChar()

STATIC CHAR OsLogRecordChar ( CHAR  c)

只记录一个字符

在文件 dmesg.c352 行定义.

353{
355
356 if (g_dmesgInfo->logTail > BUF_MAX_INDEX) {
357 g_dmesgInfo->logTail = 0;
358 }
359
361 (g_dmesgInfo->logSize)++;
362 } else {
364 }
365 return c;
366}
这是这个函数的调用关系图:

◆ OsLogRecordStr()

UINT32 OsLogRecordStr ( const CHAR str,
UINT32  len 
)

记录一个字符串

在文件 dmesg.c368 行定义.

369{
370 UINT32 i = 0;
371 UINTPTR intSave;
372
373 LOS_SpinLockSave(&g_dmesgSpin, &intSave);
374 while (len--) {
375 (VOID)OsLogRecordChar(str[i]);
376 i++;
377 }
378 LOS_SpinUnlockRestore(&g_dmesgSpin, intSave);
379 return i;
380}
STATIC CHAR OsLogRecordChar(CHAR c)
只记录一个字符
Definition: dmesg.c:352
unsigned long UINTPTR
Definition: los_typedef.h:68
函数调用图:
这是这个函数的调用关系图:

◆ OsLogShow()

VOID OsLogShow ( VOID  )

使用串口打印日志

在文件 dmesg.c531 行定义.

532{
533 UINT32 intSave;
534 UINT32 index;
535 UINT32 i = 0;
536 CHAR *p = NULL;
537
538 LOS_SpinLockSave(&g_dmesgSpin, &intSave);
539 index = g_dmesgInfo->logHead;
540
541 p = (CHAR *)malloc(g_dmesgInfo->logSize + 1);
542 if (p == NULL) {
543 LOS_SpinUnlockRestore(&g_dmesgSpin, intSave);
544 return;
545 }
546 (VOID)memset_s(p, g_dmesgInfo->logSize + 1, 0, g_dmesgInfo->logSize + 1);
547
548 while (i < g_dmesgInfo->logSize) {//一个一个字符拷贝
549 *(p + i) = *(g_dmesgInfo->logBuf + index++);
550 if (index > BUF_MAX_INDEX) {//循环buf,读到尾了得从头开始读
551 index = 0;
552 }
553 i++;
554 if (index == g_dmesgInfo->logTail) {//一直读到写入位置,才退出
555 break;
556 }
557 }
558 LOS_SpinUnlockRestore(&g_dmesgSpin, intSave);
559 UartPuts(p, i, UART_WITH_LOCK);//串口输出
560 free(p);//释放内存
561}
VOID UartPuts(const CHAR *s, UINT32 len, BOOL isLock)
函数调用图:
这是这个函数的调用关系图:

◆ OsShellCmdDmesg()

INT32 OsShellCmdDmesg ( INT32  argc,
const CHAR **  argv 
)

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。

参数
argc
argv
返回
INT32

开启控制台打印。

在文件 dmesg.c763 行定义.

764{
765 if (argc == 1) {
766 PRINTK("\n");
767 OsLogShow();
768 return LOS_OK;
769 } else if (argc == 2) { /* 2: count of parameters */
770 if (argv == NULL) {
771 goto ERR_OUT;
772 }
773
774 if (!strcmp(argv[1], "-c")) {//打印缓存区内容并清空缓存区
775 PRINTK("\n");
776 OsLogShow();//打印缓存区内容
778 return LOS_OK;
779 } else if (!strcmp(argv[1], "-C")) {//清空缓存区。
781 return LOS_OK;
782 } else if (!strcmp(argv[1], "-D")) {//关闭控制台打印。
784 return LOS_OK;
785 } else if (!strcmp(argv[1], "-E")) {///开启控制台打印。
787 return LOS_OK;
788 } else if (!strcmp(argv[1], "-L")) {//关闭串口打印
789 OsLockUart();
790 return LOS_OK;
791 } else if (!strcmp(argv[1], "-U")) {//开启串口打印
792 OsUnlockUart();
793 return LOS_OK;
794 }
795 } else if (argc == 3) { /* 3: count of parameters */
796 if (argv == NULL) {
797 goto ERR_OUT;
798 }
799
800 if (!strcmp(argv[1], ">")) {//将缓存区内容写入文件
801 if (LOS_DmesgToFile((CHAR *)argv[2]) < 0) { /* 2:index of parameters */
802 PRINTK("Dmesg write log to %s fail \n", argv[2]); /* 2:index of parameters */
803 return -1;
804 } else {
805 PRINTK("Dmesg write log to %s success \n", argv[2]); /* 2:index of parameters */
806 return LOS_OK;
807 }
808 } else if (!strcmp(argv[1], "-l")) {//设置缓存等级
809 return OsDmesgLvSet(argv[2]); /* 2:index of parameters */
810 } else if (!strcmp(argv[1], "-s")) {//设置缓存区大小 size是要设置的大小
811 return OsDmesgMemSizeSet(argv[2]); /* 2:index of parameters */
812 }
813 }
814
815ERR_OUT:
816 PRINTK("dmesg: invalid option or parameter.\n");
817 return -1;
818}
STATIC VOID OsLockUart(VOID)
关闭串口
Definition: dmesg.c:103
INT32 LOS_DmesgToFile(const CHAR *filename)
将dmesg 保存到文件中
Definition: dmesg.c:678
STATIC VOID OsUnlockConsole(VOID)
打开控制台
Definition: dmesg.c:98
VOID OsLogShow(VOID)
使用串口打印日志
Definition: dmesg.c:531
STATIC INT32 OsDmesgMemSizeSet(const CHAR *size)
Definition: dmesg.c:585
STATIC VOID OsLockConsole(VOID)
关闭控制台
Definition: dmesg.c:93
STATIC VOID OsUnlockUart(VOID)
打开串口
Definition: dmesg.c:108
STATIC INT32 OsDmesgLvSet(const CHAR *level)
设置日志层级
Definition: dmesg.c:563
VOID LOS_DmesgClear(VOID)
Clear dmesg log.
Definition: dmesg.c:621
函数调用图:

◆ OsUnlockConsole()

STATIC VOID OsUnlockConsole ( VOID  )

打开控制台

在文件 dmesg.c98 行定义.

99{
100 g_consoleLock = 0;
101}
这是这个函数的调用关系图:

◆ OsUnlockUart()

STATIC VOID OsUnlockUart ( VOID  )

打开串口

在文件 dmesg.c108 行定义.

109{
110 g_uartLock = 0;
111}
这是这个函数的调用关系图:

◆ OsWriteTailToEnd()

STATIC VOID OsWriteTailToEnd ( const CHAR dst,
UINT32  logLen 
)

从尾写入

在文件 dmesg.c470 行定义.

471{
472 UINT32 writeLen;
473 UINT32 bufSize = g_logBufSize;
474 UINT32 tail = g_dmesgInfo->logTail;
475 CHAR *buf = g_dmesgInfo->logBuf;
476 errno_t ret;
477
478 if ((!logLen) || (dst == NULL)) {
479 return;
480 }
481 if (logLen >= (bufSize - tail)) { /* need cycle to start ,then became B */
482 writeLen = bufSize - tail;
483 ret = memcpy_s(buf + tail, writeLen, dst, writeLen);
484 if (ret != EOK) {
485 PRINT_ERR("%s,%d memcpy_s failed, err:%d!\n", __FUNCTION__, __LINE__, ret);
486 return;
487 }
488
489 g_dmesgInfo->logSize += writeLen;
490 g_dmesgInfo->logTail = 0;
491 if (g_dmesgInfo->logSize == g_logBufSize) { /* Tail = Head is 0 */
492 OsBufFullWrite(dst + writeLen, logLen - writeLen);
493 } else {
494 OsWriteTailToHead(dst + writeLen, logLen - writeLen);
495 }
496 } else { /* just do serial copy */
497 ret = memcpy_s(buf + tail, bufSize - tail, dst, logLen);
498 if (ret != EOK) {
499 PRINT_ERR("%s,%d memcpy_s failed, err:%d!\n", __FUNCTION__, __LINE__, ret);
500 return;
501 }
502
503 g_dmesgInfo->logTail += logLen;
504 g_dmesgInfo->logSize += logLen;
505 }
506}
函数调用图:
这是这个函数的调用关系图:

◆ OsWriteTailToHead()

STATIC VOID OsWriteTailToHead ( const CHAR dst,
UINT32  logLen 
)

从头写入

在文件 dmesg.c435 行定义.

436{
437 UINT32 writeLen = 0;
438 UINT32 bufSize = g_logBufSize;
439 UINT32 logSize = g_dmesgInfo->logSize;
440 UINT32 tail = g_dmesgInfo->logTail;
441 CHAR *buf = g_dmesgInfo->logBuf;
442 errno_t ret;
443
444 if ((!logLen) || (dst == NULL)) {
445 return;
446 }
447 if (logLen > (bufSize - logSize)) { /* space-need > space-remain */
448 writeLen = bufSize - logSize;
449 ret = memcpy_s(buf + tail, bufSize - tail, dst, writeLen);
450 if (ret != EOK) {
451 PRINT_ERR("%s,%d memcpy_s failed, err:%d!\n", __FUNCTION__, __LINE__, ret);
452 return;
453 }
454
457 OsBufFullWrite(dst + writeLen, logLen - writeLen);
458 } else {
459 ret = memcpy_s(buf + tail, bufSize - tail, dst, logLen);
460 if (ret != EOK) {
461 PRINT_ERR("%s,%d memcpy_s failed, err:%d!\n", __FUNCTION__, __LINE__, ret);
462 return;
463 }
464
465 g_dmesgInfo->logTail += logLen;
466 g_dmesgInfo->logSize += logLen;
467 }
468}
函数调用图:
这是这个函数的调用关系图:

◆ SHELLCMD_ENTRY()

SHELLCMD_ENTRY ( dmesg_shellcmd  ,
CMD_TYPE_STD  ,
"dmesg"  ,
XARGS  ,
(CmdCallBackFunc OsShellCmdDmesg 
)

◆ SPIN_LOCK_INIT()

LITE_OS_SEC_BSS STATIC SPIN_LOCK_INIT ( g_dmesgSpin  )

变量说明

◆ g_consoleLock

STATIC UINT32 g_consoleLock = 0

用于关闭和打开控制台

在文件 dmesg.c82 行定义.

◆ g_dmesgInfo

STATIC DmesgInfo* g_dmesgInfo = NULL

保存在 g_mallocAddr 的开始位置,即头信息

在文件 dmesg.c78 行定义.

◆ g_dmesgLogLevel

STATIC UINT32 g_dmesgLogLevel = 3

日志等级

在文件 dmesg.c81 行定义.

◆ g_levelString

STATIC const CHAR* g_levelString[]
初始值:
= {
"EMG",
"COMMON",
"ERR",
"WARN",
"INFO",
"DEBUG"
}

在文件 dmesg.c84 行定义.

◆ g_logBufSize

STATIC UINT32 g_logBufSize = 0

缓冲区内容体大小

在文件 dmesg.c79 行定义.

◆ g_mallocAddr

STATIC VOID* g_mallocAddr = NULL

缓存区开始位置,即头位置

在文件 dmesg.c80 行定义.

◆ g_uartLock

STATIC UINT32 g_uartLock = 0

用于关闭和打开串口

在文件 dmesg.c83 行定义.