内核模块打印不出消息的解决办法
<p style="text-indent: 2em;">最近在学习linux下的驱动程序开发时,遇到了在内核中使用printk打印的消息并没有显示在控制台上的问题,经过网上查找,解决了这个问题,这里分享出来,顺便说说printk打印的日志级别。</p><p style="text-indent: 2em;">使用printk(),内核会根据日志级别,可能把消息打印到当前控制台上。消息能够正常打印到控制台上的前提是日志输出级别小于console_loglevel(数字越小,优先级越高)。</p><p style="text-indent: 2em;">没有指定日志级别的printk语句默认采用的级别是<span style="color: rgb(0, 112, 192);">DEFAULT_MESSAGE_LOGLEVEL</span>(这个默认级别一般为4),即与<span style="color: rgb(0, 112, 192);">KERN_WARNING</span>在一个级别上。</p><p style="text-indent: 2em;">日志一共有8个级别,printk的日志级别定义如下:</p><p style="text-indent: 2em;"><span style="color: rgb(0, 112, 192);">#define KERN_EMERG 0</span></p><p style="text-indent: 2em;"><span style="color: rgb(0, 112, 192);">#define KERN_ALERT 1</span></p><p style="text-indent: 2em;"><span style="color: rgb(0, 112, 192);">#define KERN_CRIT 2</span></p><p style="text-indent: 2em;"><span style="color: rgb(0, 112, 192);">#define KERN_ERR 3</span></p><p style="text-indent: 2em;"><span style="color: rgb(0, 112, 192);">#define KERN_WARNING 4</span></p><p style="text-indent: 2em;"><span style="color: rgb(0, 112, 192);">#define KERN_NOTICE 5</span></p><p style="text-indent: 2em;"><span style="color: rgb(0, 112, 192);">#define KERN_INFO 6</span></p><p style="text-indent: 2em;"><span style="color: rgb(0, 112, 192);">#define KERN_DEBUG 7</span></p><p style="text-indent: 2em;"><span style="color: rgb(0, 0, 0);">当你的内核模块使用printk语句打印不出信息时,那么使printk的输出级别最高,例如:<span style="color: rgb(255, 0, 0);">printk(KERN_EMERG “Hello World!\n”);</span>然后重新编译该模块,加载它,此时消息应该被打印出来了吧<img src="/UEditor/dialogs/emotion/images/face/i_f01.gif"/>。</span><span style="color: rgb(0, 112, 192);"><br/></span></p><p style="text-indent: 2em;"><span style="color: rgb(0, 0, 0);">其实printk是能够输出信息的,只是不一定会打印到控制台上。我们可以到<span style="color: rgb(255, 0, 0);">/var/log/message</span>这个文件去查看。下面我使用的内核模块不会打印信息到控制台上,我通过查看<span style="color: rgb(255, 0, 0);">/var/log/message</span>文件,可以得知信息已经输出。</span></p><p style="text-indent: 2em;"><span style="color: rgb(0, 0, 0); background-color: rgb(118, 146, 60);">(1)、</span><span style="color: rgb(0, 0, 0);">打开两个终端</span></p><p style="text-indent: 2em;"><span style="color: rgb(0, 0, 0);">为了便于操作与查看,我打开了<span style="color: rgb(255, 0, 0);">两个</span>控制台,且都是<span style="color: rgb(255, 0, 0);">root</span>用户,然后编译自己编写的内核模块,加载,可以看到终端上没有信息输出:</span></p><p style="text-align:center"><span style="color: rgb(0, 0, 0);"><img src="/uploads/AilsonJack/2018.08.19/1534660617160934.png" onclick="preview_image('/uploads/AilsonJack/2018.08.19/1534660617160934.png')"/></span></p><p style="text-indent: 2em;"><span style="color: rgb(0, 0, 0); background-color: rgb(118, 146, 60);">(2)、</span><span style="color: rgb(0, 0, 0);">在另一个终端中执行命令:<span style="color: rgb(255, 0, 0);">cat /var/log/message</span>,可以看到这里出现了<span style="color: rgb(255, 0, 0);">Hello World!</span>:<br/></span></p><p style="text-align:center"><span style="color: rgb(0, 0, 0);"><img src="/uploads/AilsonJack/2018.08.19/1534660618307099.png" onclick="preview_image('/uploads/AilsonJack/2018.08.19/1534660618307099.png')"/></span></p><p style="text-indent: 2em;"><span style="color: rgb(0, 0, 0);">同理,执行<span style="color: rgb(255, 0, 0);">rmmod hello</span>命令时,查看<span style="color: rgb(255, 0, 0);">/var/log/message</span>文件结果如下:<br/></span></p><p style="text-align:center"><span style="color: rgb(0, 0, 0);"><img src="/uploads/AilsonJack/2018.08.19/1534660617908004.png" onclick="preview_image('/uploads/AilsonJack/2018.08.19/1534660617908004.png')"/></span></p><p style="text-indent: 2em;"><span style="color: rgb(0, 0, 0);">下面的这些内容,我实验了没有成功,也不知道是什么情况,有知道的朋友指点一下,这里先记下来吧。</span></p><p style="text-indent: 2em;"><span style="color: rgb(0, 0, 0);">通过读写<span style="color: rgb(255, 0, 0);">/proc/sys/kernel/printk</span>文件可以读取和修改控制台的日志级别。查看文件的方法如下:</span></p><p style="text-indent: 2em;"><span style="color: rgb(0, 0, 0);">执行命令:<span style="color: rgb(255, 0, 0);">cat /proc/sys/kernel/printk</span>,我这儿的输出结果为 <span style="color: rgb(255, 0, 0);">4 4 1 7</span>,这四个数据分别对应<span style="color: rgb(0, 112, 192);">控制台日志级别、默认的消息日志级别、最低的控制台日志级别、默认的控制台日志级别</span>:<br/></span></p><p style="text-align:center"><span style="color: rgb(0, 0, 0);"><img src="/uploads/AilsonJack/2018.08.19/1534660616916426.png" onclick="preview_image('/uploads/AilsonJack/2018.08.19/1534660616916426.png')"/></span></p><p style="text-indent: 2em;"><span style="color: rgb(0, 0, 0);">可用命令:<span style="color: rgb(255, 0, 0);">echo 8 > /proc/sys/kernel/printk</span>来设置控制台日志级别:<br/></span></p><p style="text-align:center"><span style="color: rgb(0, 0, 0);"><img src="/uploads/AilsonJack/2018.08.19/1534660621199710.png" onclick="preview_image('/uploads/AilsonJack/2018.08.19/1534660621199710.png')"/></span></p><p style="text-indent: 2em;"><span style="color: rgb(0, 0, 0);">设置多个级别:<span style="color: rgb(255, 0, 0);">echo 7 6 3 4 > /proc/sys/kernel/printk</span>:<br/></span></p><p style="text-align:center"><span style="color: rgb(0, 0, 0);"><img src="/uploads/AilsonJack/2018.08.19/1534660623780060.png" onclick="preview_image('/uploads/AilsonJack/2018.08.19/1534660623780060.png')"/></span></p><p style="text-indent: 2em;"><span style="color: rgb(0, 0, 0);">本文的前面部分内容解决了内核模块消息打印不到控制台的问题,后面一些内容是和printk相关的一些内容,大家可做了解。<br/></span></p>
你可能也喜欢:
暂无评论,要不要来个沙发
发表评论
JLink V9掉固件修复(灯不亮) 3Zephyr笔记2 - 在STM32F429上运行HelloWorld 2计算NandFlash要传入的行地址和列地址 1Linux MMC子系统 - 6.eMMC 5.1工作模式-设备识别模式 0Linux MMC子系统 - 5.eMMC 5.1工作模式-引导模式 0Linux MMC子系统 - 4.eMMC 5.1常用命令说明(2) 0
标签云
Linux嵌入式实用技巧ARM内核学习问题集合CC++编程语言阅读笔记汇编Linux内核完全注释Windows驱动开发计算机基础ARM11ARMv7-ASTM32IDESublimeLinux内核学习eMMCMMC子系统Ubuntu操作系统OfficeVMWareAPUEgccRTOS中断漫游世界随笔感悟开发工具软件应用编程VsCodearmccarmclang编译器ZephyrSPIJLink网卡驱动安装各种芯片库函数NFSμCOS内核sambaFlashUnix命令与脚本输入法Linux内核设计与实现gitRIFFWAVJATGFTPar8161安装centos有线上网μCGUI字库工程建立右键菜单网络文件系统Firefox百度NTFS文件系统CodeBlocksCentOS数据结构算法PhotoShop51KeilQTUltraEditscanfglibc宏定义UIDGID优先级娱乐天地SourceInsight磁盘扇区总线I2CPDFBComparePythonI2SFPUMakefileSWDCPUARP软件推荐FileZilla