最新新闻,最快送达

如何调试Linux内核?如何区别Linux的内核?

  • 发布时间:2020-09-11
  • 来源:中培教育网

  尽管Linux作为是一个操作系统,但归根结底,它仍然是一个程序。由于Linux是一个程序,因此可以通过debug来调试。但是,由于环境的不同,使用的方法和工具也不同。那么如何调试Linux内核?如何区别Linux的内核?Gdb是Linux下的常见调试工具,而Windows上的更多调试工具都是基于接口的。直接对应的中间变量的值和所请求存储器的地址将直观显示。在Linux上,主要通过命令查看它。实际上,它是命令的行的使用,这也是一些常见的命令。

  如何调试Linux内核?

  一、调试前的准备

  内核级bug具有行为不可靠,定义不清晰或者说很难再现的诸多特定,为内核级的bug跟踪和调试带来了很大的困难。

  对于一些定义不清楚地bug,问题的关键就是找到bug的源头,很多时候,当你精确地重现一个bug的时候,你就离成功不远了。

  二、内核中的bug

  从隐藏在源代码中的错误到展现在目击者面前的bug,其发作往往是一系列连锁反应的事件才可能出发的。

  虽然内核调试有一定的困难,但是通过你的努力和理解,说不定你会喜欢上这样的挑战。

  三、printk()

  内核提供的格式化打印函数。

  1、printk函数的健壮性

  健壮性是printk最容易被接受的一个特质,几乎在任何地方,任何时候内核都可以调用它(中断上下文、进程上下文、持有锁时、多处理器处理时等)。

  在系统启动过程中,终端初始化之前,在某些地方是不能调用的。

  2、记录等级

  printk函数可以指定一个记录级别,内核根据这个级别来判断是否在终端上打印消息。

  记录级别定义在中。

  调用方式:printk(KER_DEBUG“Thisisadebugnotice!/n”);内核用这个指定的纪录等级和当前终端的纪录等级console_loglevel比较,来决定是不是向终端打印。

  3、记录缓冲区

  内核消息都被保存在一个LOG_BUF_LEN大小的环形队列中。

  关于LOG_BUF_LEN定义:

  #define__LOG_BUF_LEN(1<

  变量CONFIG_LOG_BUF_SHIFT在内核编译时由配置文件定义,对于i386平台,其值定义如下(在Linux26/arch/i386/defconfig中):

  CONFIG_LOG_BUF_SHIFT=18

  缓冲区操作:

  ①消息被读出到用户空间时,此消息就会从环形队列中删除。

  ②当消息缓冲区满时,如果再有printk()调用时,新消息将覆盖队列中的老消息。

  ③在读写环形队列时,同步问题很容易得到解决。

  这个纪录缓冲区之所以称为环形,是因为它的读写都是按照环形队列的方式进行操作的。

  4、syslogd和klogd

  在标准的Linux系统上,用户空间的守护进程klogd从纪录缓冲区中获取内核消息,再通过syslogd守护进程把这些消息保存在系统日志文件中。klogd进程既可以从/proc/kmsg文件中,也可以通过syslog()系统调用读取这些消息。默认情况下,它选择读取/proc方式实现。klogd守护进程在消息缓冲区有新的消息之前,一直处于阻塞状态。一旦有新的内核消息,klogd被唤醒,读出内核消息并进行处理。默认情况下,处理例程就是把内核消息传给syslogd守护进程。

  syslogd守护进程一般把接收到的消息写入/var/log/messages文件中。不过,还是可以通过/etc/syslog.conf文件来进行配置,可以选择其他的输出文件。

  四、OOPS

  作为内核的开发者,必定将会经常处理OOPS。

  ksymoops

  在Linux中,调试系统崩溃的传统方法是分析在发生崩溃时发送到系统控制台的Oops消息。一旦您掌握了细节,就可以将消息发送到ksymoops实用程序,它将试图将代码转换为指令并将堆栈值映射到内核符号。

  ksymoops需要几项内容:Oops消息输出、来自正在运行的内核的System.map文件,还有/proc/ksyms、vmLinux和/proc/modules。

  关于如何使用ksymoops,内核源代码/usr/src/Linux/Documentation/oops-tracing.txt中或ksymoops手册页上有完整的说明可以参考。Ksymoops反汇编代码部分,指出发生错误的指令,并显示一个跟踪部分表明代码如何被调用。

  #cat/proc/kallsyms

  c0100240T_stext

  c0100240trun_init_process

  c0100240Tstext

  c0100269tinit

  五、内核调试配置选项

  在编译内核的时候,为了方便调试和测试代码,内核提供了许多配置选项。

  调试原子操作

  从内核2.5开发,为了检查各类由原子操作引发的问题,内核提供了极佳的工具。

  内核提供了一个原子操作计数器,它可以配置成,一旦在原子操作过程中,进城进入睡眠或者做了一些可能引起睡眠的操作,就打印警告信息并提供追踪线索。

  所以,包括在使用锁的时候调用schedule(),正使用锁的时候以阻塞方式请求分配内存等,各种潜在的bug都能够被探测到。

  下面这些选项可以最大限度地利用该特性:

  CONFIG_PREEMPT=y

  CONFIG_DEBUG_KERNEL=y

  CONFIG_KLLSYMS=y

  CONFIG_SPINLOCK_SLEEP=y

  六、引发bug并打印信息

  1、一些内核调用可以用来方便标记bug,提供断言并输出信息。最常用的两个是BUG()和BUG_ON()。

  当调用这两个宏的时候,它们会引发OOPS,导致栈的回溯和错误消息的打印。

  2、dump_stack()

  有些时候,只需要在终端上打印一下栈的回溯信息来帮助你调试。这时可以使用dump_stack()。这个函数只在终端上打印寄存器上下文和函数的跟踪线索。

  if(!debug_check){

  printk(KERN_DEBUG“providesomeinformation…/n”);

  dump_stack();

  }

  如何区别Linux的内核?

  Linux是一种开源电脑操作系统内核。它是一个用C语言写成,符合POSIX标准的类Unix操作系统。Linux最早是由芬兰黑客LinusTorvalds为尝试在英特尔x86架构上提供自由免费的类Unix操作系统而开发的。该计划开始于1991年,在计划的早期有一些Minix黑客提供了协助,而今天全球无数程序员正在为该计划无偿提供帮助。

  内核不止一种,所以我们应该怎么区别呢?

  Linux的内核版本有两种:1稳固版2开发版。

  Linux内核版本号是由3个数字构成:a.b.c

  a:目前发布的内核主版本。

  b:偶数表示稳固版本;奇数表示开发中版本。

  c:错误修补的次数。

  其中第一个数字是主版本号,第二个数字是次版本号,第三个数字是修订版本号。

  上述就是关于如何调试Linux内核,以及如何区别Linux内核的全部内容,想了解更多关于Linux的信息,请继续关注中培教育。

近期开班

phone
全国报名服务热线: 400-626-7377
合作伙伴
  • 国际APMG组织
  • 思科(Cisco)
  • 国际OPEN GROUP组织
  • 国家外专局培训中心
  • 上海银行
  • 中国石油管道局工程有限公司
  • 朗新科技
  • 中国国家博物馆
金牌客户
  • 中国石油天然气集团公司
  • 中国农业银行
  • 中国建设银行
  • 波司登集团
  • 浙江移动
合作机构
  • 美国项目管理协会
  • 人力资源和社会保障部
  • 中华人民共和国工业和信息化部
  • 中国计算机技术职业资格网
  • CITIF中国电子信息行业联合会
  • PEOPLECERT
微信公众号
公众号

微信号:zpitedu

  • 中培教育 Copyright © 2006-2020 北京中培伟业管理咨询有限公司 .All Rights Reserved
  • 京ICP备13024721号  gonganimg  京公网安备11010602007294号  增值电信业务经营许可证:京B2-20201348  全国统一报名专线:400-626-7377