内核模块打印不出消息的解决办法
 2015.04.21    |      内核学习    |     AilsonJack    |     暂无评论    |     4036 views
广告位C招租:1
By: Ailson Jack
Date: 2015-04-21
个人博客: http://www.only2fire.com/
<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&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0</span></p><p style="text-indent: 2em;"><span style="color: rgb(0, 112, 192);">#define KERN_ALERT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1</span></p><p style="text-indent: 2em;"><span style="color: rgb(0, 112, 192);">#define KERN_CRIT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 2</span></p><p style="text-indent: 2em;"><span style="color: rgb(0, 112, 192);">#define KERN_ERR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3</span></p><p style="text-indent: 2em;"><span style="color: rgb(0, 112, 192);">#define KERN_WARNING&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;4</span></p><p style="text-indent: 2em;"><span style="color: rgb(0, 112, 192);">#define KERN_NOTICE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;5</span></p><p style="text-indent: 2em;"><span style="color: rgb(0, 112, 192);">#define KERN_INFO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6</span></p><p style="text-indent: 2em;"><span style="color: rgb(0, 112, 192);">#define KERN_DEBUG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 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(&#39;/uploads/AilsonJack/2018.08.19/1534660617160934.png&#39;)"/></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(&#39;/uploads/AilsonJack/2018.08.19/1534660618307099.png&#39;)"/></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(&#39;/uploads/AilsonJack/2018.08.19/1534660617908004.png&#39;)"/></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&nbsp; /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(&#39;/uploads/AilsonJack/2018.08.19/1534660616916426.png&#39;)"/></span></p><p style="text-indent: 2em;"><span style="color: rgb(0, 0, 0);">可用命令:<span style="color: rgb(255, 0, 0);">echo&nbsp; 8&nbsp; &gt;&nbsp; /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(&#39;/uploads/AilsonJack/2018.08.19/1534660621199710.png&#39;)"/></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 &gt; /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(&#39;/uploads/AilsonJack/2018.08.19/1534660623780060.png&#39;)"/></span></p><p style="text-indent: 2em;"><span style="color: rgb(0, 0, 0);">本文的前面部分内容解决了内核模块消息打印不到控制台的问题,后面一些内容是和printk相关的一些内容,大家可做了解。<br/></span></p>
欢迎关注博主的公众号呀,精彩内容随时掌握:
热情邀请仔细浏览下博客中的广告,万一有对自己有用或感兴趣的呢。◕ᴗ◕。。
如果这篇文章对你有帮助,记得点赞和关注博主就行了^_^,当然了能够赞赏博主,那就非常感谢啦!
注: 转载请注明出处,谢谢!^_^
广告位C招租:2
广告位C招租:3
广告位D招租:1
广告位D招租:2
暂无评论,要不要来个沙发
发表评论

 
广告位E招租
Copyright © 2015~2021  说好一起走   保留所有权利   |  百度统计  蜀ICP备15004292号