kset学习demo以及Oops反汇编objdump调试例子【原创】
写一个main.c
gcc -c -g main.c
objdump -S main.o > b.txt
arm-none-linux-gnueabi-gcc -c -g a.c
arm-none-linux-gnueabi-objdump -S a.o > c.txt
这样就可以查看到c和汇编同时产生
demo1:
obj-m := kmod-demo1.o
MAKEOPT := ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
#CFLAGS := -O2 -DMODULE -D__KERNEL__ ${WARN} ${INCLUDE}
ARM_LINUX_KERNEL := /home/zhangbh/Prolin_os/si/Prolin/firmware_cygnus/build_dir/linux-brcm5830_sxxx-prolin2/linux-3.6.5
ccflags-y :=-g
PWD = $(shell pwd)
all:
$(MAKE) $(MAKEOPT) -C $(ARM_LINUX_KERNEL) M=$(PWD) modules .PHONY: clean clean:
rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions Module.symvers .Makefile.swp modules.order
#include <linux/device.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/string.h>
#include <linux/sysfs.h>
#include <linux/stat.h>
#include <linux/kobject.h> #if 1
#define RESETCOLOR "\033[0m"
#define GREEN "\033[0;32m"
#define RED "\033[0;31m"
#define YELLOW "\033[1;33m"
#define BLUE "\033[0;34m"
#endif
//DEBUG_PRINT(RED"cpu_restart_func."RESETCOLOR"\n"); struct kset kset_p;
struct kset kset_c; int my_kset_filter(struct kset *kset, struct kobject *kobj)
{
printk(YELLOW"Filter: kobj %s"RESETCOLOR"\n", kobj->name);
//printk("Filter: kobj %s\n", kobj->name);
return ;
} const char *my_kset_name(struct kset *kset, struct kobject *kobj)
{
static char buf[]; printk(YELLOW"Name: kobj %s"RESETCOLOR"\n", kobj->name);
//printk("Name: kobj %s\n", kobj->name);
sprintf(buf, "%s", "kset_name"); return buf;
} int my_kset_uevent(struct kset *kset, struct kobject *kobj,struct kobj_uevent_env *env)
{
int i = ;
//printk("===my_kset_uevent===\n");
printk(YELLOW"uevent: kobj %s"RESETCOLOR"\n", kobj->name);
//printk("uevent: kobj %s\n", kobj->name);
while (i < env->envp_idx) {
//printk(YELLOW"%s"RESETCOLOR"\n", env->envp[i]);
printk("%s\n", env->envp[i]);
i++;
} return ;
} struct kset_uevent_ops my_uevent_ops =
{
.filter = my_kset_filter,
.name = my_kset_name,
.uevent = my_kset_uevent,
}; struct kobj_type my_kobj_type; static int __init my_kset_init(void)
{
//printk("\033[1;33;40m kset_test_init \033[0m\r\n");
printk(YELLOW"kset_test_init"RESETCOLOR"\n");
// printk("===my_kset_init===\n");
kobject_set_name(&kset_p.kobj, "kset_p_zhangbh");
kset_p.uevent_ops = &my_uevent_ops;
kset_p.kobj.ktype = &my_kobj_type;
kset_register(&kset_p); kobject_set_name(&kset_c.kobj, "kset_c_zhangbh");
kset_c.kobj.kset = &kset_p;
kset_c.kobj.ktype = &my_kobj_type;
kset_register(&kset_c); return ;
} static void __exit my_kset_exit(void)
{
printk("===my_kset_exit===\n");
kset_unregister(&kset_p);
kset_unregister(&kset_c);
} module_init(my_kset_init);
module_exit(my_kset_exit); MODULE_DESCRIPTION("kmod-demo1 driver");
MODULE_AUTHOR("zhangbh");
MODULE_LICENSE("Dual BSD/GPL");
demo2:
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kobject.h> MODULE_LICENSE("Dual BSD/GPL"); /*
* struct kset {
* struct subsystem * subsys; 所在的subsystem的指针
* struct kobj_type * ktype; 指向该kset对象类型描述符的指针
* struct list_head list; 用于连接该kset中所有kobject的链表头
* struct kobject kobj; 嵌入的kobject
* struct kset_uevent_ops *uevent_ops; 指向热插拔操作表的指针
* };
*/
struct kset my_kset_parent;
struct kset my_kset_child; int my_kset_filter(struct kset *kset,struct kobject *kobj)
{
printk("===my_kset_filter===\n");
return 1; //返回1事事件可以上报
}
const char *my_kset_name(struct kset *kset, struct kobject *kobj )
{
static char buf[200]; //可以动态申请
printk("===my_kset_name is %s===\n", kobj->name);
sprintf(buf,"%s","what's this mean"); return buf;
} int my_kset_uevent(struct kset *kset, struct kobject *kobj, struct kobj_uevent_env *env)
{
int i = 0;
printk("===my_kset_uevent===\n");
while(i<env->envp_idx)
{
printk("%s\n",env->envp[i++]);
}
return 0;
} /*
* struct kset_uevnt_ops{
* int (*filter)(struct kset *kset,struct kobject *kobj);
* const char *(*name)(struct kset *kset, struct kobject *kobj );
* int (*uevent)(struct kset *kset,struct kobject *kobj,struct kobj_uevent *env);
* }
*/
struct kset_uevent_ops my_uevent_ops =
{
.filter = my_kset_filter,
.name = my_kset_name,
.uevent = my_kset_uevent,
}; struct kobj_type my_kobj_type ; static int __init my_kset_init(void)
{
printk("===my_kset_init===\n");
kobject_set_name(&my_kset_parent.kobj,"my_keset_parent");
my_kset_parent.uevent_ops = &my_uevent_ops;
/* int kset_register(struct kset *kset); */ //下面这句多余,是为了规避kernel oops bug
my_kset_parent.kobj.ktype = &my_kobj_type;
kset_register(&my_kset_parent); kobject_set_name(&my_kset_child.kobj,"my_kset_child");
my_kset_child.kobj.kset = &my_kset_parent;
my_kset_child.kobj.ktype = &my_kobj_type;
kset_register(&my_kset_child); return 0;
} static void __exit my_kset_exit(void)
{
printk("===my_kset_exit===\n");
kset_unregister(&my_kset_parent);
kset_unregister(&my_kset_child);
} module_init(my_kset_init);
module_exit(my_kset_exit);
demo1/2需要注意:
//下面这句多余,是为了规避kernel oops bug
my_kset_parent.kobj.ktype = &my_kobj_type; 如果不加入这句的话,会报如下错误
/data/app # insmod kmod-demo1.ko
[ 819.660000] [pax_verify_memory_region] verification skipped (level )
[ 819.670000] kset_test_init
[ 819.670000] Unable to handle kernel NULL pointer dereference at virtual address 0000000c
[ 819.680000] pgd = de9a0000
[ 819.680000] [0000000c] *pgd=7ea5d831, *pte=, *ppte=
[ 819.690000] Internal error: Oops: [#] ARM
[ 819.690000] Modules linked in: kmod_demo1(O+) lcd_panel_H35C65_00E(O) lcd_hw_ctrl(O) lcd_fb(O) spi(O) verify(O) asoc_bcm5830x(O) asoc_bcm5830x_i2s(O) asoc_bcm5830x_pcm(O) asoc_bcm5830x_codec_cs4344(O) tty_host(O) tty_devices(O) 5830x_usb2h(O) bcm_udc_dwc(O) misc(O) bm_mp2625gl(O) keypad_matrix(O) input_base(O) pmu_dummy(O) S820_M00_P00(O) ioconfig(O) devices_base(O) rtc(O)
[ 819.690000] CPU: Tainted: G O (3.6.+ #)
[ 819.690000] PC is at kobj_child_ns_ops+0x1c/0x38
[ 819.690000] LR is at sysfs_create_dir+0x48/0xfc
[ 819.690000] pc : [<c021a814>] lr : [<c010770c>] psr: a0000013
[ 819.690000] sp : dfae1df0 ip : dfae1e00 fp : dfae1dfc
[ 819.690000] r10: bf0a2000 r9 : r8 :
[ 819.690000] r7 : r6 : c0629038 r5 : r4 : bf0a032c
[ 819.690000] r3 : r2 : r1 : bf0a0330 r0 : bf0a032c
[ 819.690000] Flags: NzCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment user
[ 819.690000] Control: 10c53c7d Table: 7e9a0059 DAC:
[ 819.690000] Process insmod (pid: , stack limit = 0xdfae0268)
[ 819.690000] Stack: (0xdfae1df0 to 0xdfae2000)
[ 819.690000] 1de0: dfae1e2c dfae1e00 c010770c c021a804
[ 819.690000] 1e00: dfae1e34 dfae1e10 c0226694 c0223d24 bf0a032c
[ 819.690000] 1e20: dfae1e64 dfae1e30 c0219e70 c01076d0 c021a30c c00b3b3c bf0a0310 bf0a0324
[ 819.690000] 1e40: bf0a032c dfae1e7c dfae1e68
[ 819.690000] 1e60: c021a284 c0219dfc bf0a0310 bf0a0324 dfae1e94 dfae1e80 bf0a2048 c021a240
[ 819.690000] 1e80: c064f4c0 dfae0000 dfae1eec dfae1e98 c0008638 bf0a200c c00b3c08 c048d784
[ 819.690000] 1ea0: dea68400 dfae1edc dfae1ec0 bf0a01dc bf0a01dc
[ 819.690000] 1ec0: bf0a01dc bf0a01dc dfaa1380 bf0a0224
[ 819.690000] 1ee0: dfae1fa4 dfae1ef0 c007e254 c0008608 bf0a01e8 00007fff c007c07c 0000005e
[ 819.690000] 1f00: e0b7589c e0b75398 e0b75394 e0b7557c bf0a0452 01acb470 bf0a01dc
[ 819.690000] 1f20: e0b75000 00000f20 e0b7557c e0b754b7 e0b75d9c
[ 819.690000] 1f40: 0000000b
[ 819.690000] 1f60: dfae1fb0 dfae1fac 01acb458
[ 819.690000] 1f80: 01acb480 01acb470 c0009be4 dfae0000 dfae1fa8
[ 819.690000] 1fa0: c0009a80 c007e198 01acb458 01acb480 01acb480 00000f20 01acb470
[ 819.690000] 1fc0: 01acb458 01acb480 01acb470 0000003e 0006874f
[ 819.690000] 1fe0: 01acb458 be8e9c34 0000cf7c 00047db0 01acb480 2000ffff 0000ffff
[ 819.690000] Backtrace:
[ 819.690000] [<c021a7f8>] (kobj_child_ns_ops+0x0/0x38) from [<c010770c>] (sysfs_create_dir+0x48/0xfc)
[ 819.690000] [<c01076c4>] (sysfs_create_dir+0x0/0xfc) from [<c0219e70>] (kobject_add_internal+0x80/0x1f4)
[ 819.690000] r6: r5:bf0a032c r4:
[ 819.690000] [<c0219df0>] (kobject_add_internal+0x0/0x1f4) from [<c021a284>] (kset_register+0x50/0x6c)
[ 819.690000] r8: r7: r6: r5:bf0a032c r4:
[ 819.690000] [<c021a234>] (kset_register+0x0/0x6c) from [<bf0a2048>] (my_kset_init+0x48/0x6c [kmod_demo1])
[ 819.690000] r5:bf0a0324 r4:bf0a0310
[ 819.690000] [<bf0a2000>] (my_kset_init+0x0/0x6c [kmod_demo1]) from [<c0008638>] (do_one_initcall+0x3c/0x178)
[ 819.690000] r5:dfae0000 r4:c064f4c0
[ 819.690000] [<c00085fc>] (do_one_initcall+0x0/0x178) from [<c007e254>] (sys_init_module+0xc8/0x1cf8)
[ 819.690000] [<c007e18c>] (sys_init_module+0x0/0x1cf8) from [<c0009a80>] (ret_fast_syscall+0x0/0x30)
[ 819.690000] Code: e2503000 01a00003 089da800 e5933014 (e593300c)
[ 820.020000] ---[ end trace 3d8a55d9aa0462ea ]---
Segmentation fault
跟踪内核源码分析如下:
kset_register(&kset_p);
==============================>
int kset_register(struct kset *k)
{
int err; if (!k)
return -EINVAL; kset_init(k);
err = kobject_add_internal(&k->kobj);
if (err)
return err;
kobject_uevent(&k->kobj, KOBJ_ADD);
return ;
}
继续跟踪
kobject_add_internal(&k->kobj)
===============================>
static int kobject_add_internal(struct kobject *kobj)
{
int error = ;
struct kobject *parent; if (!kobj)
return -ENOENT; if (!kobj->name || !kobj->name[]) {
WARN(, "kobject: (%p): attempted to be registered with empty "
"name!\n", kobj);
return -EINVAL;
} parent = kobject_get(kobj->parent); /* join kset if set, use it as parent if we do not already have one */
if (kobj->kset) {
if (!parent)
parent = kobject_get(&kobj->kset->kobj);
kobj_kset_join(kobj);
kobj->parent = parent;
} pr_debug("kobject: '%s' (%p): %s: parent: '%s', set: '%s'\n",
kobject_name(kobj), kobj, __func__,
parent ? kobject_name(parent) : "<NULL>",
kobj->kset ? kobject_name(&kobj->kset->kobj) : "<NULL>"); error = create_dir(kobj);
if (error) {
kobj_kset_leave(kobj);
kobject_put(parent);
kobj->parent = NULL; /* be noisy on error issues */
if (error == -EEXIST)
WARN(, "%s failed for %s with "
"-EEXIST, don't try to register things with "
"the same name in the same directory.\n",
__func__, kobject_name(kobj));
else
WARN(, "%s failed for %s (error: %d parent: %s)\n",
__func__, kobject_name(kobj), error,
parent ? kobject_name(parent) : "'none'");
} else
kobj->state_in_sysfs = ; return error;
}
继续跟踪create_dir(kobj)
==================>
static int create_dir(struct kobject *kobj)
{
int error = ;
error = sysfs_create_dir(kobj);
if (!error) {
error = populate_dir(kobj);
if (error)
sysfs_remove_dir(kobj);
}
return error;
}
跟踪
sysfs_create_dir(kobj); ============================>
/**
* sysfs_create_dir - create a directory for an object.
* @kobj: object we're creating directory for.
*/
int sysfs_create_dir(struct kobject * kobj)
{
enum kobj_ns_type type;
struct sysfs_dirent *parent_sd, *sd;
const void *ns = NULL;
int error = ; BUG_ON(!kobj); if (kobj->parent)
parent_sd = kobj->parent->sd;
else
parent_sd = &sysfs_root; if (!parent_sd)
return -ENOENT; if (sysfs_ns_type(parent_sd))
ns = kobj->ktype->namespace(kobj);
type = sysfs_read_ns_type(kobj); error = create_dir(kobj, parent_sd, type, ns, kobject_name(kobj), &sd);
if (!error)
kobj->sd = sd;
return error;
}
这下大家看懂了吧,直接操作了指针ktype,相当于操作了空指针
然后我反汇编调试,可打印Oops的信息
arm-none-linux-gnueabi-objdump -DfhS kmod-demo1.o > b.txt
b.txt文档信息如下:
kmod-demo1.o: file format elf32-littlearm
architecture: arm, flags 0x00000011:
HAS_RELOC, HAS_SYMS
start address 0x00000000 Sections:
Idx Name Size VMA LMA File off Algn
.text 000000c4 **
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
.data 0000000c 000000f8 **
CONTENTS, ALLOC, LOAD, RELOC, DATA
.bss **
ALLOC
.init.text **
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
.exit.text 0000017c **
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
.modinfo 000001b0 **
CONTENTS, ALLOC, LOAD, READONLY, DATA
.rodata.str1. 000000b4 000001f4 **
CONTENTS, ALLOC, LOAD, READONLY, DATA
.comment 000002a8 **
CONTENTS, READONLY
.note.GNU-stack 000002d9 **
CONTENTS, READONLY
.ARM.attributes 000002d9 **
CONTENTS, READONLY Disassembly of section .text: <my_kset_uevent>:
: e1a0c00d mov ip, sp
: e92dd878 push {r3, r4, r5, r6, fp, ip, lr, pc}
: e24cb004 sub fp, ip, #
c: e3000000 movw r0, #
: e1a06002 mov r6, r2
: e5911000 ldr r1, [r1]
: e3400000 movt r0, #
1c: ebfffffe bl <printk>
: e5963080 ldr r3, [r6, #] ; 0x80
: e3530000 cmp r3, #
: da000009 ble <my_kset_uevent+0x54>
2c: e2465004 sub r5, r6, #
: e3a04000 mov r4, #
: e3000000 movw r0, #
: e5b51004 ldr r1, [r5, #]!
3c: e3400000 movt r0, #
: e2844001 add r4, r4, #
: ebfffffe bl <printk>
: e5960080 ldr r0, [r6, #] ; 0x80
4c: e1500004 cmp r0, r4
: cafffff7 bgt <my_kset_uevent+0x34>
: e3a00000 mov r0, #
: e89da878 ldm sp, {r3, r4, r5, r6, fp, sp, pc} 0000005c <my_kset_filter>:
5c: e1a0c00d mov ip, sp
: e92dd800 push {fp, ip, lr, pc}
: e24cb004 sub fp, ip, #
: e3000000 movw r0, #
6c: e5911000 ldr r1, [r1]
: e3400000 movt r0, #
: ebfffffe bl <printk>
: e3a00001 mov r0, #
7c: e89da800 ldm sp, {fp, sp, pc} <my_kset_name>:
: e1a0c00d mov ip, sp
: e92dd800 push {fp, ip, lr, pc}
: e24cb004 sub fp, ip, #
8c: e3000000 movw r0, #
: e5911000 ldr r1, [r1]
: e3400000 movt r0, #
: ebfffffe bl <printk>
9c: e3000000 movw r0, #
a0: e3400000 movt r0, #
a4: e300c000 movw ip, #
a8: e340c000 movt ip, #
ac: e8900007 ldm r0, {r0, r1, r2}
b0: e1a0300c mov r3, ip
b4: e8a30003 stmia r3!, {r0, r1}
b8: e1a0000c mov r0, ip
bc: e1c320b0 strh r2, [r3]
c0: e89da800 ldm sp, {fp, sp, pc} Disassembly of section .data: <my_uevent_ops>:
... Disassembly of section .bss: <buf.>:
... <kset_p>:
... <my_kobj_type>:
... <kset_c>:
... Disassembly of section .init.text: <init_module>:
: e1a0c00d mov ip, sp
: e92dd878 push {r3, r4, r5, r6, fp, ip, lr, pc}
: e24cb004 sub fp, ip, #
c: e3004000 movw r4, #
: e3404000 movt r4, #
: e2846014 add r6, r4, #
: e3000000 movw r0, #
1c: e3400000 movt r0, #
: e2845044 add r5, r4, # ; 0x44
: ebfffffe bl <printk>
: e284001c add r0, r4, #
2c: e3001000 movw r1, #
: e3401000 movt r1, #
: ebfffffe bl <kobject_set_name>
: e1a00006 mov r0, r6
3c: e5845030 str r5, [r4, #] ; 0x30
: e3003000 movw r3, #
: e3403000 movt r3, #
: e5843040 str r3, [r4, #] ; 0x40
4c: ebfffffe bl <kset_register>
: e2840060 add r0, r4, # ; 0x60
: e3001000 movw r1, #
: e3401000 movt r1, #
5c: ebfffffe bl <kobject_set_name>
: e2840058 add r0, r4, # ; 0x58
: e5846070 str r6, [r4, #] ; 0x70
: e5845074 str r5, [r4, #] ; 0x74
6c: ebfffffe bl <kset_register>
: e3a00000 mov r0, #
: e89da878 ldm sp, {r3, r4, r5, r6, fp, sp, pc} Disassembly of section .exit.text: <cleanup_module>:
: e1a0c00d mov ip, sp
: e92dd818 push {r3, r4, fp, ip, lr, pc}
: e24cb004 sub fp, ip, #
c: e3000000 movw r0, #
: e3004000 movw r4, #
: e3400000 movt r0, #
: e3404000 movt r4, #
1c: ebfffffe bl <printk>
: e2840014 add r0, r4, #
: ebfffffe bl <kset_unregister>
: e2840058 add r0, r4, # ; 0x58
2c: ebfffffe bl <kset_unregister>
: e89da818 ldm sp, {r3, r4, fp, sp, pc} Disassembly of section .modinfo: <__mod_license95>:
: 6563696c strbvs r6, [r3, #-]! ; 0xfffff694
: 3d65736e stclcc , cr7, [r5, #-]! ; 0xfffffe48
: 6c617544 cfstr64vs mvdx7, [r1], #- ; 0xfffffef0
c: ldrbmi r4, [r3], #- ; 0xfffffde0
: 4c50472f mrrcmi , , r4, r0, cr15
... <__mod_author94>:
: ldmdavs r4!, {r0, r5, r6, r8, sl, ip, sp, lr}^
: 7a3d726f bvc f5c9dd <.LC8+0xf5c93d>
1d: 676e6168 strbvs r6, [lr, -r8, ror #]!
: strvs r6, [r0], #- ; 0xfffff79e <__mod_description93>:
: cmnvs r3, #, ; 0x19000000
: ldrbtvc r6, [r0], #- ; 0xfffff68e
2c: 3d6e6f69 stclcc , cr6, [lr, #-]! ; 0xfffffe5c
: 646f6d6b strbtvs r6, [pc], #- ; 38 <__mod_description93+0x14>
: 6d65642d cfstrdvs mvd6, [r5, #-]! ; 0xffffff4c
: 6420316f strtvs r3, [r0], #- ; 0xfffffe91
3c: ldrbvs r6, [r6, #-]! ; 0xfffff68e
: Address 0x00000040 is out of bounds. Disassembly of section .rodata.str1.: <.LC0>:
: 3b315b1b blcc c56c74 <.LC8+0xc56bd4>
: 756d3333 strbvc r3, [sp, #-]! ; 0xfffffccd
: 6e657665 cdpvs , , cr7, cr5, cr5, {}
c: 6b203a74 blvs 80e9e4 <.LC8+0x80e944>
: 206a626f rsbcs r6, sl, pc, ror #
: 5b1b7325 blpl 6dccb0 <.LC8+0x6dcc10>
: 000a6d30 andeq r6, sl, r0, lsr sp 0000001c <.LC1>:
1c: 000a7325 andeq r7, sl, r5, lsr # <.LC2>:
: 3b315b1b blcc c56c94 <.LC8+0xc56bf4>
: 466d3333 ; <UNDEFINED> instruction: 0x466d3333
: 65746c69 ldrbvs r6, [r4, #-]! ; 0xfffff397
2c: 6b203a72 blvs 80e9fc <.LC8+0x80e95c>
: 206a626f rsbcs r6, sl, pc, ror #
: 5b1b7325 blpl 6dccd0 <.LC8+0x6dcc30>
: 000a6d30 andeq r6, sl, r0, lsr sp 0000003c <.LC3>:
3c: 3b315b1b blcc c56cb0 <.LC8+0xc56c10>
: 4e6d3333 mcrmi , , r3, cr13, cr3, {}
: 3a656d61 bcc 195b5d0 <.LC8+0x195b530>
: 626f6b20 rsbvs r6, pc, #, ; 0x8000
4c: 7325206a teqvc r5, # ; 0x6a
: 6d305b1b fldmdbxvs r0!, {d5-d17} ;@ Deprecated
: 0000000a andeq r0, r0, sl <.LC4>:
: 7465736b strbtvc r7, [r5], #- ; 0xfffffc95
5c: 6d616e5f stclvs , cr6, [r1, #-]! ; 0xfffffe84
: andeq r0, r0, r5, rrx <.LC5>:
: 3b315b1b blcc c56cd8 <.LC8+0xc56c38>
: 6b6d3333 blvs 1b4cd3c <.LC8+0x1b4cc9c>
6c: 5f746573 svcpl 0x00746573
: ldrbtvc r6, [r3], #- ; 0xfffffa8c
: 696e695f stmdbvs lr!, {r0, r1, r2, r3, r4, r6, r8, fp, sp, lr}^
: 305b1b74 subscc r1, fp, r4, ror fp
7c: 00000a6d andeq r0, r0, sp, ror # <.LC6>:
: 7465736b strbtvc r7, [r5], #- ; 0xfffffc95
: 7a5f705f bvc 17dc208 <.LC8+0x17dc168>
: 676e6168 strbvs r6, [lr, -r8, ror #]!
8c: andeq r6, r0, r2, ror # <.LC7>:
: 7465736b strbtvc r7, [r5], #- ; 0xfffffc95
: 7a5f635f bvc 17d8e18 <.LC8+0x17d8d78>
: 676e6168 strbvs r6, [lr, -r8, ror #]!
9c: andeq r6, r0, r2, ror # 000000a0 <.LC8>:
a0: 6d3d3d3d ldcvs , cr3, [sp, #-]! ; 0xffffff0c
a4: 736b5f79 cmnvc fp, # ; 0x1e4
a8: 655f7465 ldrbvs r7, [pc, #-] ; fffffc4b <.LC8+0xfffffbab>
ac: 3d746978 ldclcc , cr6, [r4, #-]! ; 0xfffffe20
b0: 000a3d3d andeq r3, sl, sp, lsr sp Disassembly of section .comment: <.comment>:
: movtmi r4, # ; 0x3700
: 5328203a teqpl r8, # ; 0x3a
: 6372756f cmnvs r2, # ; 0x1bc00000
c: rsbscs r7, r9, r5, ror #
: 65646f43 strbvs r6, [r4, #-]! ; 0xfffff0bd
: 636e6542 cmnvs lr, # ; 0x10800000
: 694c2068 stmdbvs ip, {r3, r5, r6, sp}^
1c: eorcc r6, r0, #, ; 0x1d000000
: 2e323130 mrccs , , r3, cr2, cr0, {}
: 352d3330 strcc r3, [sp, #-]! ; 0xfffffcd0
: strtcc r2, [r0], #- ; 0xfffff6c9
2c: 332e362e teqcc lr, # ; 0x2e00000
... Disassembly of section .ARM.attributes: <.ARM.attributes>:
: andeq r3, r0, r1, asr #
: cmnvs r5, r0, lsl #
: tsteq r0, r2, ror #
c: andeq r0, r0, r6, lsr #
: 412d3705 teqmi sp, r5, lsl #
: 070a0600 streq r0, [sl, -r0, lsl #]
: stmdbeq r1, {r0, r6, fp}
1c: strne r1, [r4], #- ; 0xfffffdfe
: strne r1, [r1, -r1, lsl #]
: stmdbne r1, {r0, r1, fp, ip}
: 1e021a01 vmlane.f32 s2, s4, s2
2c: 2c012202 sfmcs f2, , [r1], {}
: Address 0x00000030 is out of bounds.
makefile中加入了调试选项ccflags-y :=-g的话,
反汇编的时候就可以c语言和汇编语言一起显示
arm-none-linux-gnueabi-objdump -S kmod-demo1.o > c.txt
kmod-demo1.o: file format elf32-littlearm Disassembly of section .text: <my_kset_uevent>: return buf;
} int my_kset_uevent(struct kset *kset, struct kobject *kobj,struct kobj_uevent_env *env)
{
: e1a0c00d mov ip, sp
: e92dd878 push {r3, r4, r5, r6, fp, ip, lr, pc}
: e24cb004 sub fp, ip, #
int i = ;
//printk("===my_kset_uevent===\n");
printk(YELLOW"uevent: kobj %s"RESETCOLOR"\n", kobj->name);
c: e3000000 movw r0, # return buf;
} int my_kset_uevent(struct kset *kset, struct kobject *kobj,struct kobj_uevent_env *env)
{
: e1a06002 mov r6, r2
int i = ;
//printk("===my_kset_uevent===\n");
printk(YELLOW"uevent: kobj %s"RESETCOLOR"\n", kobj->name);
: e5911000 ldr r1, [r1]
: e3400000 movt r0, #
1c: ebfffffe bl <printk>
//printk("uevent: kobj %s\n", kobj->name);
while (i < env->envp_idx) {
: e5963080 ldr r3, [r6, #] ; 0x80
: e3530000 cmp r3, #
: da000009 ble <my_kset_uevent+0x54>
sprintf(buf, "%s", "kset_name"); return buf;
} int my_kset_uevent(struct kset *kset, struct kobject *kobj,struct kobj_uevent_env *env)
2c: e2465004 sub r5, r6, #
{
int i = ;
: e3a04000 mov r4, #
//printk("===my_kset_uevent===\n");
printk(YELLOW"uevent: kobj %s"RESETCOLOR"\n", kobj->name);
//printk("uevent: kobj %s\n", kobj->name);
while (i < env->envp_idx) {
//printk(YELLOW"%s"RESETCOLOR"\n", env->envp[i]);
printk("%s\n", env->envp[i]);
: e3000000 movw r0, #
: e5b51004 ldr r1, [r5, #]!
3c: e3400000 movt r0, #
i++;
: e2844001 add r4, r4, #
//printk("===my_kset_uevent===\n");
printk(YELLOW"uevent: kobj %s"RESETCOLOR"\n", kobj->name);
//printk("uevent: kobj %s\n", kobj->name);
while (i < env->envp_idx) {
//printk(YELLOW"%s"RESETCOLOR"\n", env->envp[i]);
printk("%s\n", env->envp[i]);
: ebfffffe bl <printk>
{
int i = ;
//printk("===my_kset_uevent===\n");
printk(YELLOW"uevent: kobj %s"RESETCOLOR"\n", kobj->name);
//printk("uevent: kobj %s\n", kobj->name);
while (i < env->envp_idx) {
: e5960080 ldr r0, [r6, #] ; 0x80
4c: e1500004 cmp r0, r4
: cafffff7 bgt <my_kset_uevent+0x34>
printk("%s\n", env->envp[i]);
i++;
} return ;
}
: e3a00000 mov r0, #
: e89da878 ldm sp, {r3, r4, r5, r6, fp, sp, pc} 0000005c <my_kset_filter>: struct kset kset_p;
struct kset kset_c; int my_kset_filter(struct kset *kset, struct kobject *kobj)
{
5c: e1a0c00d mov ip, sp
: e92dd800 push {fp, ip, lr, pc}
: e24cb004 sub fp, ip, #
printk(YELLOW"Filter: kobj %s"RESETCOLOR"\n", kobj->name);
: e3000000 movw r0, #
6c: e5911000 ldr r1, [r1]
: e3400000 movt r0, #
: ebfffffe bl <printk>
//printk("Filter: kobj %s\n", kobj->name);
return ;
}
: e3a00001 mov r0, #
7c: e89da800 ldm sp, {fp, sp, pc} <my_kset_name>: const char *my_kset_name(struct kset *kset, struct kobject *kobj)
{
: e1a0c00d mov ip, sp
: e92dd800 push {fp, ip, lr, pc}
: e24cb004 sub fp, ip, #
static char buf[]; printk(YELLOW"Name: kobj %s"RESETCOLOR"\n", kobj->name);
8c: e3000000 movw r0, #
: e5911000 ldr r1, [r1]
: e3400000 movt r0, #
: ebfffffe bl <printk>
//printk("Name: kobj %s\n", kobj->name);
sprintf(buf, "%s", "kset_name");
9c: e3000000 movw r0, #
a0: e3400000 movt r0, #
a4: e300c000 movw ip, #
a8: e340c000 movt ip, #
ac: e8900007 ldm r0, {r0, r1, r2}
b0: e1a0300c mov r3, ip
b4: e8a30003 stmia r3!, {r0, r1} return buf;
}
b8: e1a0000c mov r0, ip
{
static char buf[]; printk(YELLOW"Name: kobj %s"RESETCOLOR"\n", kobj->name);
//printk("Name: kobj %s\n", kobj->name);
sprintf(buf, "%s", "kset_name");
bc: e1c320b0 strh r2, [r3] return buf;
}
c0: e89da800 ldm sp, {fp, sp, pc} Disassembly of section .init.text: <init_module>: struct kobj_type my_kobj_type; static int __init my_kset_init(void)
{
: e1a0c00d mov ip, sp
: e92dd878 push {r3, r4, r5, r6, fp, ip, lr, pc}
: e24cb004 sub fp, ip, #
//printk("\033[1;33;40m kset_test_init \033[0m\r\n");
printk(YELLOW"kset_test_init"RESETCOLOR"\n");
// printk("===my_kset_init===\n");
kobject_set_name(&kset_p.kobj, "kset_p_zhangbh");
c: e3004000 movw r4, #
: e3404000 movt r4, #
: e2846014 add r6, r4, #
struct kobj_type my_kobj_type; static int __init my_kset_init(void)
{
//printk("\033[1;33;40m kset_test_init \033[0m\r\n");
printk(YELLOW"kset_test_init"RESETCOLOR"\n");
: e3000000 movw r0, #
1c: e3400000 movt r0, #
// printk("===my_kset_init===\n");
kobject_set_name(&kset_p.kobj, "kset_p_zhangbh");
kset_p.uevent_ops = &my_uevent_ops;
kset_p.kobj.ktype = &my_kobj_type;
: e2845044 add r5, r4, # ; 0x44
struct kobj_type my_kobj_type; static int __init my_kset_init(void)
{
//printk("\033[1;33;40m kset_test_init \033[0m\r\n");
printk(YELLOW"kset_test_init"RESETCOLOR"\n");
: ebfffffe bl <printk>
// printk("===my_kset_init===\n");
kobject_set_name(&kset_p.kobj, "kset_p_zhangbh");
: e284001c add r0, r4, #
2c: e3001000 movw r1, #
: e3401000 movt r1, #
: ebfffffe bl <kobject_set_name>
kset_p.uevent_ops = &my_uevent_ops;
kset_p.kobj.ktype = &my_kobj_type;
kset_register(&kset_p);
: e1a00006 mov r0, r6
//printk("\033[1;33;40m kset_test_init \033[0m\r\n");
printk(YELLOW"kset_test_init"RESETCOLOR"\n");
// printk("===my_kset_init===\n");
kobject_set_name(&kset_p.kobj, "kset_p_zhangbh");
kset_p.uevent_ops = &my_uevent_ops;
kset_p.kobj.ktype = &my_kobj_type;
3c: e5845030 str r5, [r4, #] ; 0x30
{
//printk("\033[1;33;40m kset_test_init \033[0m\r\n");
printk(YELLOW"kset_test_init"RESETCOLOR"\n");
// printk("===my_kset_init===\n");
kobject_set_name(&kset_p.kobj, "kset_p_zhangbh");
kset_p.uevent_ops = &my_uevent_ops;
: e3003000 movw r3, #
: e3403000 movt r3, #
: e5843040 str r3, [r4, #] ; 0x40
kset_p.kobj.ktype = &my_kobj_type;
kset_register(&kset_p);
4c: ebfffffe bl <kset_register> kobject_set_name(&kset_c.kobj, "kset_c_zhangbh");
: e2840060 add r0, r4, # ; 0x60
: e3001000 movw r1, #
: e3401000 movt r1, #
5c: ebfffffe bl <kobject_set_name>
kset_c.kobj.kset = &kset_p;
kset_c.kobj.ktype = &my_kobj_type;
kset_register(&kset_c);
: e2840058 add r0, r4, # ; 0x58
kset_p.uevent_ops = &my_uevent_ops;
kset_p.kobj.ktype = &my_kobj_type;
kset_register(&kset_p); kobject_set_name(&kset_c.kobj, "kset_c_zhangbh");
kset_c.kobj.kset = &kset_p;
: e5846070 str r6, [r4, #] ; 0x70
kset_c.kobj.ktype = &my_kobj_type;
: e5845074 str r5, [r4, #] ; 0x74
kset_register(&kset_c);
6c: ebfffffe bl <kset_register> return ;
}
: e3a00000 mov r0, #
: e89da878 ldm sp, {r3, r4, r5, r6, fp, sp, pc} Disassembly of section .exit.text: <cleanup_module>: static void __exit my_kset_exit(void)
{
: e1a0c00d mov ip, sp
: e92dd818 push {r3, r4, fp, ip, lr, pc}
: e24cb004 sub fp, ip, #
printk("===my_kset_exit===\n");
c: e3000000 movw r0, #
kset_unregister(&kset_p);
: e3004000 movw r4, #
return ;
} static void __exit my_kset_exit(void)
{
printk("===my_kset_exit===\n");
: e3400000 movt r0, #
kset_unregister(&kset_p);
: e3404000 movt r4, #
return ;
} static void __exit my_kset_exit(void)
{
printk("===my_kset_exit===\n");
1c: ebfffffe bl <printk>
kset_unregister(&kset_p);
: e2840014 add r0, r4, #
: ebfffffe bl <kset_unregister>
kset_unregister(&kset_c);
: e2840058 add r0, r4, # ; 0x58
2c: ebfffffe bl <kset_unregister>
}
: e89da818 ldm sp, {r3, r4, fp, sp, pc}
如有转载请注明出处
新浪博客:http://blog.sina.com.cn/u/2049150530
博客园:http://www.cnblogs.com/sky-heaven/
知乎:http://www.zhihu.com/people/zhang-bing-hua
部分资料来源:http://www.cnblogs.com/sky-zhang/archive/2012/05/28/2521497.html
kset学习demo以及Oops反汇编objdump调试例子【原创】的更多相关文章
- Spark菜鸟学习营Day6 分布式代码运行调试
Spark菜鸟学习营Day6 分布式代码运行调试 作为代码调试,一般会分成两个部分 语法调试,也就是确定能够运行 结果调试,也就是确定程序逻辑的正确 其实这个都离不开运行,所以我们说一下如何让开发的S ...
- thinkphp学习笔记3—项目编译和调试模式
原文:thinkphp学习笔记3-项目编译和调试模式 1.项目编译 在章节2.4项目编译中作者讲到使用thinkphp的项目在第一次运行的时候会吧核心需要加载的文件去掉空白和注释合并到一个文件中编译并 ...
- 深度学习demo
1. Stanford Convolutional Neural Network on the MNIST digits dataset http://cs.stanford.edu/people/k ...
- Linux内核分析第一周学习博客 --- 通过反汇编方式学习计算机工作过程
Linux内核分析第一周学习博客 通过反汇编方式学习计算机工作过程 总结: 通过这次对一个简单C程序的反汇编学习,我了解到计算机在实际工作工程中要涉及大量的跳转指针操作.计算机通常是顺序执行一条一条的 ...
- Spark学习之Spark调优与调试(7)
Spark学习之Spark调优与调试(7) 1. 对Spark进行调优与调试通常需要修改Spark应用运行时配置的选项. 当创建一个SparkContext时就会创建一个SparkConf实例. 2. ...
- linux中oops信息的调试及栈回溯【转】
本文转载自:http://blog.csdn.net/kangear/article/details/8217329 ========================================= ...
- linux中Oops信息的调试及栈回溯
Oops 信息来源及格式 Oops 这个单词含义为“惊讶” ,当内核出错时(比如访问非法地址)打印出来的信息被 称为 Oops 信息. Oops 信息包含以下几部分内容. 1 一段文本描述信息. 比如 ...
- ReactNative新手学习之路03真机调试
React Native新手入门03真机调试(iOS) 从设备访问开发服务器 在启用开发服务器的情况下,你可以快速的迭代修改应用,然后在设备上查看结果.这样做的前提是你的电脑和设备必须在同一个wifi ...
- 小程序入门学习Demo
技术:小程序 概述 适合学习小程序的初级开发人员,入门教程 详细 代码下载:http://www.demodashi.com/demo/14956.html 小程序周边美甲美发预约Demo 代码主 ...
随机推荐
- 自学Zabbix9.2 zabbix网络发现规则配置详解+实战
点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 自学Zabbix9.2 zabbix网络发现规则配置详解+实战 1. 创建网络发现规则 Conf ...
- 【BZOJ3456】城市规划(生成函数,多项式运算)
[BZOJ3456]城市规划(生成函数,多项式运算) 题面 求\(n\)个点的无向连通图个数. \(n<=130000\) 题解 \(n\)个点的无向图的个数\(g(n)=2^{C_n^2}\) ...
- #define用法之一
[问题由来] 多文件工程中,A文件要使用B文件的func1函数,只要在A文件中include “B.h”即可: 但A文件中使用的是func2函数,它与func1函数功能一样,只是名字不同而已,即fun ...
- 洛谷 P2420 让我们异或吧 解题报告
P2420 让我们异或吧 题目描述 异或是一种神奇的运算,大部分人把它总结成不进位加法. 在生活中-xor运算也很常见.比如,对于一个问题的回答,是为1,否为0.那么: (A是否是男生 )xor( B ...
- android关闭日志
我们在开发时,经常会输出各种日志来debug代码.但是等到应用发布的apk运行时不希望它输出日志. 关闭输出日志Log.v(),Log.i(),Log.w(),Log.v(),Log.e()等 原理: ...
- centos6.5修改主机名
centos 修改主机名 0.说明 系统安装后,系统默认的主机名称是localhost,现在想要修改为master.操作需要root权限. 1.方案一:仅当前登录有效,重启后失效 直接在命令行执行命令 ...
- 【洛谷P1486】郁闷的出纳员
题目大意:维护一个平衡树,支持插入一个数,删除小于一个值的所有数,K 大值查询,每个节点权值加减一个数. 题解:所有节点权值加减操作可以考虑直接维护一个全局标记,删除小于一个值的所有数字为一个二分的过 ...
- Python基础学习(五)
一.使用模块 已经了解了什么是模块,模块就是一个个文件的体,我们可以做不同的文件中引入各个模块文件,当然如果模块有冲突,还可以给模块文件的上层建立一个目录简称包,包名只能唯一,不能重名. 另外,一旦建 ...
- cookies 不同端口 是可以共享的
cookies 不同端口,是跨域吗? 我部署了两套系统在同一个ip上!8080,和8090! 这样.cookies,算跨域吗? 两套系统都记录了都有一个 historyItem的key的cookies ...
- 1.C和C++的区别
C和C++的区别 C语言语法简单,但使用不易 C++语法非常庞大复杂,但使用方便,更注重的是它的编程思想(面向对象). 一.第一个C++程序 1.文件扩展名 C++源文件扩展名 .cpp,C ...