互联网服务powerLinuxLinux

理解powerlinux的kernel oops信息 之一 触发oops

这里看到一篇讲解kernel oops的文章,用的是x86系统。正好手上有powerlinux系统,于是就试了一下。发现两种系统还是有一些区别的。这里来理解一下powerlinux上的oops。

首先,我们可用原文提供的“oops”模块来触发oops:
oops.c:
#include 
#include 
#include 
  
static void create_oops() {
        *(int *)0 = 0;
}
  
static int __init my_oops_init(void) {
        printk("oops from the modulen");
        create_oops();
       return (0);
}
static void __exit my_oops_exit(void) {
        printk("Goodbye worldn");
}
  
module_init(my_oops_init);
module_exit(my_oops_exit);
makefile:
obj-m   := oops.o
KDIR    := /lib/modules/$(shell uname -r)/build
PWD     := $(shell pwd)
SYM=$(PWD)
  
all:
        $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
将这两个文件拷贝到一个目录。要注意makefile的最后一行
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
开头一定要是一个tab而不是一串空格,否则编译时会报这个错:
make: Nothing to be done for `all'

我用的是sles11 sp3,要想编译内核模块要装上相应的kernel devel包,如
kernel-ppc64-devel
当然,make,gcc等工具也是必不可少的。编译过程没有遇到什么问题,得到模块oops.ko:
hpt@kitlp1:~/oops> ls
Makefile  modules.order  Module.symvers  oops.c  oops.ko  oops.ko.with-debuginfo  oops.mod.c  oops.mod.o  oops.o
hpt@kitlp1:~/oops>

从源码中可知,create_oops()会触发一个空指针解引用的错误,这会触发kernel oops,使得系统崩溃:
hpt@kitlp1:~/oops> sudo insmod oops.ko
Oops: Kernel access of bad area, sig: 11 [#1]
SMP NR_CPUS=1024 NUMA pSeries
Modules linked in: oops(PN+) nfsd nfs fscache lockd auth_rpcgss nfs_acl sunrpc af_packet fuse loop dm_service_time dm_multipath dm_mod ipv6 ipv6_lib nx_crypto(X) ses enclosure sg be2net ext3 jbd mbcache btrfs lzo_compress zlib_deflate crc32c libcrc32c sd_mod crc_t10dif scsi_dh_rdac scsi_dh_emc scsi_dh_alua scsi_dh_hp_sw scsi_dh lpfc scsi_transport_fc scsi_tgt ipr(X) libata scsi_mod
Supported: No, Proprietary and Unsupported modules are loaded
NIP: d000000006fb0060 LR: d000000006fb0050 CTR: 0000000000000001
REGS: c0000002d27afa50 TRAP: 0300   Tainted: P           NX  (3.0.76-ppc64)
MSR: 8000000002009032   CR: 24000224  XER: 00000010
DAR: 0000000000000000, DSISR: 42000000
TASK = c0000002ce475b50[27495] 'insmod' THREAD: c0000002d27ac000 CPU: 4
GPR00: d000000006fb0050 c0000002d27afcd0 d000000006fb8158 0000000000000000
GPR04: 0000000000000000 ffffffffffffffff 000000000007ffff c00000000116cd40
GPR08: 000000000007ffff 0000000000000000 0000000000000000 0000000000000001
GPR12: 0000000028000222 c000000003f40c00 00000000535813a0 0000000053581438
GPR16: 0000000053558ae8 00000000535814d0 00000fffc7e016a8 00000000535812c4
GPR20: 0000000000000000 00000000535812e0 00000fffc7e00f28 0000000053595770
GPR24: 0000000000000000 d000000006fb0190 c000000001040080 c0000002d27ac000
GPR28: c000000000e7dfc0 0000000000001214 d000000006fb8168 d000000006fb01a8
NIP [d000000006fb0060] .my_oops_init+0x2c/0xd4 [oops]
LR [d000000006fb0050] .my_oops_init+0x1c/0xd4 [oops]
Call Trace:
[c0000002d27afcd0] [c00000000000ab68] .do_one_initcall+0x68/0x1e0 (unreliable)
[c0000002d27afd90] [c000000000106554] .SyS_init_module+0xcc/0x218
[c0000002d27afe30] [c0000000000098ec] syscall_exit+0x0/0x40
Instruction dump:
4e800020 fbc1fff0 ebc28000 7c0802a6 f8010010 f821ff81 e87e8008 4800002d
e8410028 38210080 39200000 38600000
<91290000> e8010010 ebc1fff0 7c0803a6
Sending IPI to other cpus...
I'm in purgatory
......
上面引文部分从“Oops”开头行到“<91290000>”开头行之间部分就是oops的信息。对比原文,power和x86上信息有比较大的不同。我在系统上配制了kdump,“I'm in purgatory”往下就是kdump的启动信息,这里省略了。准备在第3部分分析oop原因时用到由kdump产生的vmcore。在第2部分我们将会详细分析理解一下oops信息都提供了什么。
参与0

0同行回答

“答”则兼济天下,请您为题主分忧!

提问者

cstl_hpt
其它IBM

相关问题

相关资料

相关文章

问题状态

  • 发布时间:2013-07-12
  • 关注会员:0 人
  • 问题浏览:2654
  • X社区推广