http://blog.chinaunix.net/uid-20564848-id-73208.html

内核文档:[root@localhost Documentation]# pwd
/usr/src/kernels/linux-2.6.32/Documentation
[root@localhost Documentation]# ls
00-INDEX                      i2o                        parport.txt
ABI                           ia64                       PCI
accounting                    ics932s401                 pcmcia
acpi                          ide                        pi-futex.txt
aoe                           infiniband                 pnp.txt
applying-patches.txt          initrd.txt                 power
arm                           input                      powerpc
atomic_ops.txt                Intel-IOMMU.txt            pps
auxdisplay                    intel_txt.txt              prctl
bad_memory.txt                ioctl                      preempt-locking.txt
basic_profiling.txt           io-mapping.txt             printk-formats.txt
binfmt_misc.txt               IO-mapping.txt             prio_tree.txt
blackfin                      io_ordering.txt            rbtree.txt
block                         iostats.txt                RCU
blockdev                      IPMI.txt                   rfkill.txt
braille-console.txt           IRQ-affinity.txt           robust-futex-ABI.txt
bt8xxgpio.txt                 irqflags-tracing.txt       robust-futexes.txt
btmrvl.txt                    IRQ.txt                    rtc.txt
BUG-HUNTING                   isapnp.txt                 rt-mutex-design.txt
c2port.txt                    isdn                       rt-mutex.txt
cachetlb.txt                  ja_JP                      s390
cdrom                         java.txt                   SAK.txt
cgroups                       kbuild                     scheduler
Changes                       kdump                      scsi
CodingStyle                   kernel-doc-nano-HOWTO.txt  SecurityBugs
connector                     kernel-docs.txt            SELinux.txt
console                       kernel-parameters.txt      serial
cpu-freq                      keys-request-key.txt       serial-console.txt
cpu-hotplug.txt               keys.txt                   sgi-ioc4.txt
cpuidle                       kmemcheck.txt              sgi-visws.txt
cpu-load.txt                  kmemleak.txt               sh
cputopology.txt               kobject.txt                slow-work.txt
credentials.txt               ko_KR                      SM501.txt
cris                          kprobes.txt                Smack.txt
crypto                        kref.txt                   sound
dcdbas.txt                    kvm                        sparc
debugging-modules.txt         laptops                    sparse.txt
debugging-via-ohci1394.txt    ldm.txt                    spi
dell_rbu.txt                  leds-class.txt             spinlocks.txt
development-process           leds-lp3944.txt            stable_api_nonsense.txt
device-mapper                 lguest                     stable_kernel_rules.txt
devices.txt                   local_ops.txt              SubmitChecklist
DMA-API.txt                   lockdep-design.txt         SubmittingDrivers
DMA-attributes.txt            lockstat.txt               SubmittingPatches
dmaengine.txt                 logo.gif                   svga.txt
DMA-ISA-LPC.txt               logo.txt                   sysctl
DMA-mapping.txt               m68k                       sysfs-rules.txt
DocBook                       magic-number.txt           sysrq.txt
dontdiff                      make                       telephony
driver-model                  Makefile                   thermal
dvb                           ManagementStyle            timers
dynamic-debug-howto.txt       mca.txt                    tomoyo.txt
early-userspace               md.txt                     trace
edac.txt                      memory-barriers.txt        uml
eisa.txt                      memory-hotplug.txt         unaligned-memory-access.txt
email-clients.txt             memory.txt                 unicode.txt
fault-injection               mips                       unshare.txt
fb                            misc-devices               usb
feature-removal-schedule.txt  mn10300                    vgaarbiter.txt
filesystems                   mono.txt                   VGA-softcursor.txt
firmware_class                mtd                        video4linux
flexible-arrays.txt           mutex-design.txt           video-output.txt
frv                           namespaces                 vm
futex-requeue-pi.txt          netlabel                   volatile-considered-harmful.txt
gcov.txt                      networking                 voyager.txt
gpio.txt                      nmi_watchdog.txt           w1
highuid.txt                   nommu-mmap.txt             watchdog
HOWTO                         numastat.txt               wimax
hwmon                         oops-tracing.txt           x86
hw_random.txt                 parisc                     zh_CN
i2c                           parport-lowlevel.txt       zorro.txt

内核书籍:LDK:LINUX内核设计与实现ULK:深入理解LINUX内核LDD:LINUX 设备驱动程序LVMM:深入理解LINUX 虚拟内存管理深入理解LINUX网络内幕

内核社区:http://vger.kernel.org/vger-lists.html#linux-kernel

http://dir.gmane.org/gmane.linux.usb.general

https://www.kernel.org/

http://linux.chinaunix.net/

printk小结1 printk 消息级别定义#define KERN_EMERG   "<0>"   /*紧急事件,一般是系统崩溃之前的提示消息*/#define KERN_ALERT   "<1>"   /*必须立即采取行动*/#define KERN_CRIT    "<2>"   /*临界状态,通常涉及严重的硬件或者软件操作失败*/#define KERN_ERR     "<3>"   /*用于报告错误状态,设备驱动会经常使用KERN_ERR来报告硬件错误*/#define KERN_WARNING "<4>"   /*对可能出现问题的情况进行警告,这类情况通常不会对系统造成严重问题 */#define KERN_NOTICE  "<5>"   /*有必要进行提示的正常情形,许多与安全相关的状况用这个级别进行汇报*/#define KERN_INFO    "<6>"   /*内核提示性信息,很多驱动程序在启动的时候以这个级别打印找到的硬件信息*/#define KERN_DEBUG   "<7>"   /*用于调试信息*/2  使用方法printk(KERN_ALERT "XXXXXX",XXXX);
3 /proc/sys/kernel/printk该文件可以调节printk的输出等级,文件中有四个数字值。(1)  控制台日志级别:优先级高于该值的消息将被打印至控制台。(2)  默认的消息日志级别:用该优先级来打印未定义优先级的消息。(3) 最低的控制台日志级别:控制台日志界别可被设置的最小值。(4) 默认的控制台日志级别:控制台日志级别的默认值。4 通过如下命令可以使得Linux内核的任何printk都被输出到控制台#echo 8 > /proc/sys/kernel/printk

 5. cat /proc/kmsg    这个文件用于检索用printk生成的内核消息。任何时刻只能有一个具有超级用户权限的进程可以读取这个文件。也可以用系统调用syslog检索这些消息。    通常使用工具dmesg或守护进程klogd检索这些消息。

printk---------------->log buffer  --------------->klogd---------------->syslogd------->文件
printk---------------->log buffer  --------------->klogd---------------->文件
printk---------------->log buffer------------------>dmesg

内核模块:   OOPS:LINUX 系统崩溃,LINUX 不能使用

1.EIP2.CALL TRACE3.OBJDUMP 反汇编 EIP

GDB调试内核:

[root@localhost linux-2.6.32]# pwd
  /usr/src/kernels/linux-2.6.32
 [root@localhost linux-2.6.32]# gdb vmlinux /proc/kcore

刷新GDB缓存:

(gdb) core-file /proc/kcore
 [New process 1]
 Core was generated by `ro root=LABEL=/ rhgb quiet'.
 #0 0x0000000000000000 in per_cpu.irq_stack_union ()

(gdb) print jiffies
$11 = -109 '\223'

(gdb) core-file /proc/kcore
[New process 1]
Core was generated by `ro root=LABEL=/ rhgb quiet'.
#0 0x0000000000000000 in per_cpu.irq_stack_union ()
(gdb) print jiffies
$12 = 42 '*'

其他内核调试器:

KGDB

http://blog.csdn.net/hejinjing_tom_com/article/details/9932451

KDB

KPROBES

KDUMP

硬件调试器

BDM/JTAG

SysRq:
0-9 设定终端输出的内核 log 优先级

b 立即重启系统
c 内核live reboot,并输出错误信息
d 显示所有排它锁
e 向除 init 外进程发送 SIGTERM 信号,让其自行结束
f 人为触发 OOM Killer (out of memory)
g 当进入内核模式时,以 framebuttter 代替输出
h 输出帮助
i 向除 init 以外所有进程发送 SIGKILL 信号,强制结束进程
k 结束与当前控制台相关的全部进程
m 内存使用信息
n 重置所有进程的 nice(优先级)
o 关机
p 输出cpu 寄存器信息
q Display all active high-resolution timers and clock sources.
r 把键盘设置为 ASCII 模式,使按键可以穿透 x server 捕捉传递给内核
s 同步缓冲区数据到硬盘
t 输出进程列表
u 重新挂载所有文件系统为只读模式
v 输出 Voyager SMP 处理信息
w 输出 block(d状态)进程列表
hello.c 内核模块编绎

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>static int init_hello_4(void)
{printk(KERN_ALERT "Hello, world 4 ");return 0;
}static void cleanup_hello_4(void)
{printk(KERN_ALERT "Goodbye, world 4 ");
}module_init(init_hello_4);
module_exit(cleanup_hello_4);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Playmud");
MODULE_DESCRIPTION("Test only!");

配置Makefile和执行ko编译

[root@server1 ~]#  echo "obj-m:=hello.o" > Makefile

[root@server1 ~]# make -C /lib/modules/`uname -r`/build M=`pwd` modules
  make: Entering directory `/usr/src/kernels/2.6.32-431.23.3.el6.x86_64'
  Building modules, stage 2.
  MODPOST 1 modules
  make: Leaving directory `/usr/src/kernels/2.6.32-431.23.3.el6.x86_64'

/lib/modules/`uname -r`/build就是本地机子的module编译配置目录不是为正在运行的内核编译模块:
make -C M=`pwd`
为正在运行的内核编译模块:
make -C /lib/modules/`uname -r`/build M=`pwd` modulesprintk没有在console上打印出提示,通过

[root@server1 ~]# dmesg |tail -1
  Hello, world

可以查到,具体配置可以查看
vim /etc/syslog.conf

sysrq常使用的魔术键:echo  1>/proc/sys/kernel/sysrq 打开sysrq功能echo 't' >/proc/sysrq-trigger   打印进程栈,调试时很有用echo 'c' >/proc/sysrq-trigger  常常用来测试dump模式

printk打印不能显示到终端的问题【原型】int printk(const char * fmt,…);【示例】与大多数展示printf的功能一样,我们也用一个helloworld的程序来演示printk的输出:编写一个内核模块:#include#include#if CONFIG_MODVERSIONS==1#define MODVERSIONS#include#endifMODULE_LICENSE("GPL");int init_module(){printk("hello.word-this is the kernel speaking\n");return 0;}void cleanup_module(){printk("Short is the life of a kernel module\n");}保存为文件hello.c编写一个Makefile:CC=gccMODCFLAGS:=-O6 -Wall -DMODULE -D__KERNEL__ -DLINUXhello.o:hello.c /usr/include/linux/version.h$(CC) $(MODCFLAGS) -c hello.cecho insmod hello.o to turn it on保存为文件Makefile执行make我们可以看到生成了一个hello.o的内核模块,我们想通过这个模块在插入内核的时候输出"hello.word-this is the kernel speaking"这样一条信息。然后我们开始:[root@localhost root]# insmod hello.o[root@localhost root]#并没有输出任何消息。why?这也是printf和printk的一个不同的地方用printk,内核会根据日志级别,可能把消息打印到当前控制台上,这个控制台通常是一个字符模式的终端、一个串口打印机或是一个并口打印机。这些消息正常输出的前提是──日志输出级别小于console_loglevel(在内核中数字越小优先级越高)。没有指定日志级别的printk语句默认采用的级别是 DEFAULT_ MESSAGE_LOGLEVEL(这个默认级别一般为<4>,即与KERN_WARNING在一个级别上),其定义在linux26/kernel/printk.c中可以找到日志级别一共有8个级别,printk的日志级别定义如下(在include/linux/kernel.h中):#define KERN_EMERG    0#define KERN_ALERT    1#define KERN_CRIT     2#define KERN_ERR      3#define KERN_WARNING  4#define KERN_NOTICE   5#define KERN_INFO     6#define KERN_DEBUG    7现在我们来修改hello.c程序,使printk的输出级别为最高:printk("<0>""hello.word-this is the kernel speaking\n");然后重新编译hello.o,并插入内核:[root@localhost root]# insmod hello.o[root@localhost root]#Message from syslogd@localhost at Sat Aug 15 05:32:22 2009 ...localhost kernel: hello.word-this is the kernel speakinghello,world信息出现了。其实printk始终是能输出信息的,只不过不一定是到了终端上。我们可以去/var/log/messages这个文件里面去查看。如果klogd没有运行,消息不会传递到用户空间,只能查看/proc/kmsg通过读写/proc/sys/kernel/printk文件可读取和修改控制台的日志级别。查看这个文件的方法如下:#cat /proc/sys/kernel/printk 6 4 1 7上面显示的4个数据分别对应控制台日志级别、默认的消息日志级别、最低的控制台日志级别和默认的控制台日志级别。可用下面的命令设置当前日志级别:# echo 8 > /proc/sys/kernel/printk这样所有级别<8,(0-7)的消息都可以显示在控制台上. 

转载于:https://www.cnblogs.com/zengkefu/p/5566721.html

LINUX 内核调试基础+编程基础相关推荐

  1. linux内核调试指南

    Hunnad的专栏 * 条新通知 * 登录 * 注册 * 欢迎 * 退出 * 我的博客 * 配置 * 写文章 * 文章管理 * 博客首页 * * * * 空间 * 博客 * 好友 * 相册 * 留言 ...

  2. 开源项目-基于Intel VT技术的Linux内核调试器

    本开源项目将硬件虚拟化技术应用在内核调试器上,使内核调试器成为VMM,将操作系统置于虚拟机中运行,即操作系统成为GuestOS,以这样的一种形式进行调试,最主要的好处就是调试器对操作系统完全透明.如下 ...

  3. Linux 内核调试器 调试指南

    Linux 内核调试器内幕 KDB 入门指南 Hariprasad Nellitheertha (nharipra@in.ibm.com), 软件工程师, IBM 简介: 调试内核问题时,能够跟踪内核 ...

  4. Linux内核调试技术指南

    前两天,完成了ucos在2440上的移植,以及boot的修改.今天突然想到,我在linux下,该如何来编写,调试比较复杂的驱动.我想这个问题应该从如何调试内核入手,先转载两个文字,待西西看来. 系统搭 ...

  5. Linux Kernel - Debug Guide (Linux内核调试指南 )

    linux内核调试指南 一些前言 作者前言 知识从哪里来 为什么撰写本文档 为什么需要汇编级调试 ***第一部分:基础知识*** 总纲:内核世界的陷阱 源码阅读的陷阱 代码调试的陷阱 原理理解的陷阱 ...

  6. Linux内核调试方法【转】

    转自:http://www.cnblogs.com/shineshqw/articles/2359114.html kdb:只能在汇编代码级进行调试: 优点是不需要两台机器进行调试. gdb:在调试模 ...

  7. Linux内核调试 - 一般人儿我都不告诉他(一)【转】

    转自:http://www.cnblogs.com/armlinux/archive/2011/04/14/2396821.html 悄悄地进入Linux内核调试(一) 本文基址:http://blo ...

  8. 基于IntelVt技术的Linux内核调试器 - 2

    4 基于IntelVt技术的Linux内核调试器- 调试器设计与实现(2):调试核心 4.1反汇编引擎 如果说调试框架是一个调试器的灵魂,那么接口与反汇编引擎就是一个调试器的身体.我们在调试过程中是要 ...

  9. Linux内核调试的方式以及工具集锦

    Linux内核调试的方式以及工具集锦 CSDN GitHub Linux内核调试的方式以及工具集锦 LDD-LinuxDeviceDrivers/study/debug  本作品采用知识共享署名-非商 ...

  10. Linux内核调试原理和工具介绍--理解静态插装/动态插装、tracepoint、ftrace、kprobe、SystemTap、Perf、eBPF

    可以将linux跟踪系统分成Tracer(跟踪数据来自哪里),数据收集分析(如"ftrace")和跟踪前端(更方便的用户态工具). 1. 数据源(Tracers) printk 是 ...

最新文章

  1. 计算机电缆线对成缆系数,计算机电缆绞合系数 - 无图版
  2. Setting the Reply-To Header in an Email using CDONTS.NewMail Object and CDO Message
  3. 判断JS对象是否拥有某属性两种方式
  4. python下载大文件-python requests 下载大文件不完整
  5. WPF 窗口居中 变更触发机制
  6. Duration(2020多校第二场D)
  7. java类的理解_Java类该怎么理解?
  8. spring:我是如何解决循环依赖的?
  9. 代码投毒、删库跑路,开源生态链安全该如何保证?
  10. .net 这些年发展 参考资料
  11. jQuery-动画效果(图片抽奖案例)
  12. Linux下Docker安装微信文件传输问题
  13. #Ubuntu# #机械键盘# 功能键/多媒体键切换无效
  14. 兼容exe的linux系统,国产操作系统下想运行EXE?你何不虚拟个电脑系统出来
  15. 编程中的Context(上下文)
  16. Oracle:ORA-00054 资源正忙
  17. ARM GICv3中断控制器
  18. 格式工厂转码错误原因0x000000001 怎么办
  19. apt-get install E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing
  20. ldap打通confluence

热门文章

  1. Vue实现左右菜单联动实现(更新)
  2. GIT的使用中的问题处理
  3. jQuery遮罩插件 jquery.blockUI.js
  4. 分布式消息系统jafka快速起步(转)
  5. wget下载网络图片
  6. iOS code collection
  7. RHEL Linux与CentOS Linux的关系
  8. Struct与Class
  9. oracle10g rac导出ocr,Oracle RAC OCR磁盘故障快速恢复方法
  10. [2018.11.03 T1] 游戏攻略