1、物联网技术应用专业教学资源建设建设院校:无锡职业技术学院物联网技术应用专业教学资源建设www.U内容提纲内容提纲 系统启动时间优化 电源管理优化物联网技术应用专业教学资源建设www.U内核调试的常用方法内核调试的常用方法 采用LED点灯法进行调试 采用串口打印信息的方法进行调试 查看 Oops and Panic 信息 KGDB 通过proc和sysfs系统进行用户空间和内核空间传递信息 硬件调试器:BDI2000 或其他 JTAG 工具物联网技术应用专业教学资源建设www.U内核调试内核调试-点灯点灯点灯是用 GPIO 作为输出,观察程序运行阶段和状态的方法嵌入式系统开发中可以根据实际情况采
2、取相应的方法(如:LCD和测量工具等等)Macro in arch/arm/boot/compressed/head.Sled1on:args=0,pretend=0,frame=0 frame_needed=0,uses_anonymous_args=0 link register save eliminated.ldr r0,.L2 mov r1,#224 lr needed for prologue str r1,r0,#0 mov pc,lr.L3:.align 2.L2:.word 1442840660 data register for port F(GPFDAT).0 x5600
3、0054blled1on物联网技术应用专业教学资源建设www.U内核调试内核调试-串口输出信息串口输出信息 puts 内核解压前内核解压前 printascii console初始化前初始化前 printk 内核解压后 信息输出显示是在 console 初始化之后物联网技术应用专业教学资源建设www.U内核调试内核调试-串口输出信息串口输出信息 puts(阶段一)(阶段一)内核启动之前通过内核启动之前通过puts()来打印信息。来打印信息。puts()Uncompressing Linux.done 在start_kernel()之前打印错误 _error:Error:a start_kern
4、el()printk()console_init()printk()物联网技术应用专业教学资源建设www.U内核调试内核调试-串口输出信息串口输出信息 puts 配配置置 配置解压内核时打印信息使用的串口(s3c2410)System Type/S3C2410 UART to use for low-level messages物联网技术应用专业教学资源建设www.U内核调试内核调试-串口输出信息串口输出信息 printascii(第二阶段)(第二阶段)内核调试内核调试 arch/arm/kernel/debug-armv.S(enabled by CONFIG_DEBUG_LL),print
5、ascii(),printk()(kernel/printk.c)vsprintf(),监测相关串口.check linux/arch/arm/kernel/debug.S include:linux/include/asm-arm/arch-ep93xx/debug-macro.S and former file implement the uart print ascii support.物联网技术应用专业教学资源建设www.U内核调试内核调试-串口输出信息串口输出信息 printk(第三阶段)(第三阶段)kernel/printk.c printk(fmt,)使用类似用户空间的 prin
6、tf 函数,不同的是printk(“”fmt);浮点运算很难实现。打印级别打印级别 打印缓冲区,在终端启动之后才能在终端上显示打印缓冲区,在终端启动之后才能在终端上显示 打印信息会存储在一个循环缓冲区中,大小可以通过配置CONFIG_LOG_BUF_SHIFT来指定。单处理器默认的是 16KB 可以使用可以使用 printk 的场合的场合 在内核空间随时调用,如:在中断中调用、在进程上下文中调用、在持有锁时调用、在多处理器上同时使用物联网技术应用专业教学资源建设www.Uprintk 打印级别打印级别打印级别描述KERN_EMERG 0紧急事件消息,系统崩溃之前提示,表示系统不可用 KERN_
7、ALERT 1报告消息,表示必须立即采取措施 KERN_CRIT 2临界条件,通常涉及严重的硬件或软件操作失败 KERN_ERR 3错误条件,驱动程序常用KERN_ERR来报告硬件的错误 KERN_WARNING 4警告条件,对可能出现问题的情况进行警告 KERN_NOTICE 5正常但又重要的条件,用于提醒。常用于与安全相关的消息 KERN_INFO 6提示信息,如驱动程序启动时,打印硬件信息 KERN_DEBUG 7调试级别的消息 物联网技术应用专业教学资源建设www.Uprintk 打印级别打印级别(续)(续)Include/linux/kernel.h Printk输出级别定义#def
8、ine KERN_EMERG /*system is unusable */#define KERN_ALERT ”/*action must be taken immediately*/#define KERN_CRIT /*critical conditions */#define KERN_ERR /*error conditions */#define KERN_WARNING /*warning conditions */#define KERN_NOTICE /*normal but significant condition*/#define KERN_INFO /*inform
9、ational */#define KERN_DEBUG /*debug-level messages 物联网技术应用专业教学资源建设www.Uprintk 日志级别日志级别kernel/printk.c级别定义int console_printk4=DEFAULT_CONSOLE_LOGLEVEL,/*console_loglevel*/DEFAULT_MESSAGE_LOGLEVEL,/*default_message_loglevel*/MINIMUM_CONSOLE_LOGLEVEL,/*minimum_console_loglevel*/DEFAULT_CONSOLE_LOGLEVE
10、L,/*default_console_loglevel*/;Include/linux/kernel.h#define console_loglevel(console_printk0)#define default_message_loglevel(console_printk1)#define minimum_console_loglevel(console_printk2)#define default_console_loglevel(console_printk3)通过proc在运行时查看和修改日志级别cat/proc/sys/kernel/printk4 4 1 7echo“7
11、4 1 7”/proc/sys/kernel/printkcat/proc/sys/kernel/printk7 4 1 7物联网技术应用专业教学资源建设www.U使用使用 printk 样例样例 printk(KERN_INFO“n INFO Level n”);printk(KERN_WARNING“WARNINGn”);printk(KERN_DEBUG“n DEBUG Level n”);printk(“n default_message_loglevel n”);物联网技术应用专业教学资源建设www.U内核调试相关配置选项内核调试相关配置选项内核调试开关自旋锁调试开关KGDB调试开关
12、printascii等开关物联网技术应用专业教学资源建设www.U内核调试内核调试-分析启动流程分析启动流程 分析内核启动时的打印信息来查看错误的发生地 查看设备的信息 需要很好的理解内核的启动流程物联网技术应用专业教学资源建设www.U用户空间的守护进程用户空间的守护进程-klogd 用来从记录缓冲区获取内核消息;只有日记级别小于 console_loglevel,消息才能显示出来,console_loglevel的值可以通过 sys_syslogd系统调用进行修改 载入klogd时,可以使用-c标志改变终端的记录等级 运行klogd后,消息将追加到/var/log/messages 没有运
13、行klogd,消息不会传递到用户空间,此时可以查看/proc/kmsg文件。物联网技术应用专业教学资源建设www.Usyslogd进程进程 保存klogd进程获取的内核消息到系统日志文件中默认的文件是/var/log/messages 可通过/etc/syslog.conf文件重新配置;如果没有运行klogd进程,数据将保留在循环缓冲区中,直到某个进程读取和缓冲区溢出为止。物联网技术应用专业教学资源建设www.U调试信息数据流传递流程图调试信息数据流传递流程图物联网技术应用专业教学资源建设www.U通过分析通过分析oops了解错误产生的了解错误产生的原因和地址原因和地址 Oops 感到吃惊的感
14、叹词,相当于“哎呀”Linux系统发生严重错误崩溃时会显示系统崩溃报告“oops”产生oops的原因:内存访问越界 非法指令 使用了NULL指针 使用了不正确的指针值 oops的内容:CPU寄存器内容 页描述符表的位置 其他信息物联网技术应用专业教学资源建设www.Uoops 样例样例-驱动中非法指针使用驱动中非法指针使用static int _init s3c2410fb_probe(struct platform_device*pdev)struct s3c2410fb_info*info;struct fb_info *fbinfo;struct s3c2410fb_hw*mregs;i
15、nt ret;int irq;int i;u32 lcdcon1;int*ptest=NULL;*ptest=0 x1234;物联网技术应用专业教学资源建设www.Uoops 样例样例-加载驱动后终端打印加载驱动后终端打印的的oops信息信息Unable to handle kernel NULL pointer dereference at virtual address 00000000pgd=c000400000000000*pgd=00000000Internal error:Oops:805#1Modules linked in:CPU:0 Not tainted (2.6.22.6
16、#18)PC is at s3c2410fb_probe+0 x18/0 x560LR is at platform_drv_probe+0 x20/0 x24pc:lr:psr:a0000013sp:c042fe64 ip:c042fea0 fp:c042fe9cr10:00000000 r9:c0025864 r8:c03892ecr7:00000000 r6:c0353358 r5:00000000 r4:c032c560r3:00001234 r2:00000001 r1:c047bd84 r0:c032c558物联网技术应用专业教学资源建设www.Uoops信息分析信息分析关注关注
17、第一行的提示 PC 栈回溯信息CONFIG_FRAME_POINTER 如果内核编译期间设置了CONFIG_FRAME_POINTER 选项,那么就用帧指针寄存器来维护堆栈,从而就可以正确地执行堆栈回溯linux-2.6.22 for arm 中 CONFIG_FRAME_POINTER 默认为 y手动分析 根据显示的标号名称和地址结合反汇编代码确定出错位置 objdump、addr2line ksymoops 软件的使用采用采用oops信息调试时,被调试的模块最好和内核一起静态编译信息调试时,被调试的模块最好和内核一起静态编译物联网技术应用专业教学资源建设www.Uoops 消息处理流程消息
18、处理流程物联网技术应用专业教学资源建设www.U通过通过panic得到出错信息得到出错信息 kernel/panic.c 当系统发生严重错误时,将调用panic函数打印出错信息 开发调试过程中可以在 panic函数中打印较多的信息,以达到帮助分析出错原因物联网技术应用专业教学资源建设www.U使用使用KGDB调试内核调试内核 KGDB是Linux调试内核的一种机制 KGDB是内核功能的扩展,它在内核中使用插桩(stub)机制 使用GDB+KGDB可以实现调试远程主机上的内核 串口、网络物联网技术应用专业教学资源建设www.U使用使用KGDB步骤(以步骤(以2410为例)为例)给内核打kgdb的
19、补丁。下载网站:http:/ 解压并拷贝到内核linux-2.6.22.6内核根目录,重明名为patches.执行:quilt push-a 修改include/asm-arm/system.h的380行,把pref=*p改为prev=*p.添加KGDB的串口驱动。将已经写好的驱动kgdb-serial.c放置在arch/arm/mach-s3c2410/下面,然后修改Makefile添加对这个驱动的编译,添加:obj-$(CONFIG_KGDB_S3C24XX_SERIAL)+=kgdb-serial.o修改lib/Kconfig.kgdb:增加KGDB的2410串口选项配置内核 Kerne
20、l hacking -*KGDB:kernel debugging with remote gdb *KGDB:Console messages through gdb 添加的2410串口配置等编译内核(为方便调试指定-g 选项)安装arm-linux-gdb(要配置target=arm-linux)建立gdb配置文件.gdbinit文件,内容如下:set remotebaud 115200target remote/dev/ttyS0设置linux命令行启动参数 console=kgdb kgdbwait 下载并引导目标机内核在主机上启动 gdbarm-linux-gdb./vmlinux使
21、用DDD,进入内核目录,执行 sudo ddd debugger arm-linux-gdb./vmlinux物联网技术应用专业教学资源建设www.Uproc文件系统文件系统 proc文件系统是一个虚拟的文件系统,用户空间程序和内核空间程序可以通过它进行交互 mount t proc proc/proc 查看/proc查看设备的信息 cat/proc/cpuinfo echo 1 /proc/sys/kernel/printk物联网技术应用专业教学资源建设www.U模块中支持 proc 文件系统的例子(1)/*module.c*/#include#if defined(CONFIG_MODVE
22、RSIONS)#define MODVERSIONS#include#endif#ifdef MODULE#include#endif#include#include#include#define MYNAME procplaystruct proc_dir_entry*my_proc=NULL;物联网技术应用专业教学资源建设www.U模块中支持 proc 文件系统的例子(2)static int get_my_info(char*,char*,off_t,int,int*,void*);static int _init my_init_module(void)int rc=-1;printk
23、(Starting procplayn);my_proc=create_proc_entry(MYNAME,S_IFREG|S_IRUGO,NULL);if(my_proc)my_proc-nlink=1;my_proc-read_proc=get_my_info;rc=0;else rc=-1;return rc;static void _exit my_cleanup_module(void)printk(Ending procplayn);remove_proc_entry(MYNAME,NULL);物联网技术应用专业教学资源建设www.U模块中支持 proc 文件系统的例子(3)sta
24、tic int get_my_info(char*sysbuf,char*p_mybuf,off_t offset,int l_sysbuf,int*eof,void*data)staticint count=0;staticchar mybuf80;int len;/*All information is supplied on a single call.Attempting to read more information should always return 0 which means no more.“*/if(offset 0)return 0;/*Build the outp
25、ut string and remember its length*/len=sprintf(mybuf,Greetings,hacker%dn,count+);*p_mybuf=mybuf;return len;module_init(my_init_module);module_exit(my_cleanup_module);物联网技术应用专业教学资源建设www.U模块中支持 proc 文件系统的例子(4)make installed with#insmod module-test2.ko物联网技术应用专业教学资源建设www.Usysfs支持支持 sysfs文件系统是一个虚拟的文件系统,内
26、核用来管理设备,同时也可以实现用户空间程序和内核空间进行通讯的功能 mount t sysfs sysfs/sys ls /sys/block/bus/class/devices/firmware/net/模块需要调用的接口 mtd_class=class_create(THIS_MODULE,mtd);class_destroy(mtd_class);class_device_create(mtd_class,NULL,MKDEV(MAJOR,mtd-index*2),30,NULL,mtd%d,mtd-index);class_device_destroy(mtd_class,MKDEV(
27、MAJOR,mtd-index*2);物联网技术应用专业教学资源建设www.U硬件工具硬件工具 BDI2000 和开发板以JTAG连接,与pc采用网络连接 是一种性价比极高的仿真器 能调试内核 支持硬件断点 查看硬件寄存器 能对闪存进行编程和擦写 不能调试应用程序物联网技术应用专业教学资源建设www.U主机和目标机通过主机和目标机通过 BDI2000 连连接接物联网技术应用专业教学资源建设www.UBDI2000使用步骤使用步骤 Makefile 中 CFLAGS 加入“-g-ggdb”选项 启动BDI2000(参看手册)gdb连接BDI2000 arm-linux-gdb vmlinux ddd-devugger arm-linux-gdb-gdb vmlinux(gdb)target remote bdi:2001