主题 : 请教:linux-2.6.32.7 reboot命令执行出错 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 4077
精华: 0
发帖: 22
金钱: 125 两
威望: 34 点
贡献值: 0 点
综合积分: 44 分
注册时间: 2009-02-24
最后登录: 2019-09-07
楼主  发表于: 2010-12-26 03:23

 请教:linux-2.6.32.7 reboot命令执行出错

错误信息如下:

/ # reboot
save exit: isCheckpointed 0
config: 8bits/char
setting ulcon to 00000003, brddiv to 26, udivslot 00000000
uart: ulcon = 0x00000003, ucon = 0x00000385, ufcon = 0x00000011
/ # umount: tmpfs busy - remounted read-only
The system is going down NOW!
Sent SIGTERM to all processes
Sent SIGKILL to all processes
md: stopping all md devices.
Unable to handle kernel paging request at virtual address 25206385
pgd = c391c000
[25206385] *pgd=00000000
Internal error: Oops: 3 [#1]
last sysfs file: /sys/devices/platform/s3c2440-i2c/i2c-0/i2c-dev/i2c-0/dev
Modules linked in:
CPU: 0    Not tainted  (2.6.32.7 #21)
PC is at device_shutdown+0x28/0xa0
LR is at i2c_device_shutdown+0xc/0x38
pc : [<c018b288>]    lr : [<c01d84d0>]    psr: 20000013
sp : c3923e70  ip : 00000000  fp : befbff14
r10: 00000000  r9 : c3922000  r8 : c0025ae8
r7 : 00000000  r6 : fee1dead  r5 : 0100fff4  r4 : c040ea94
r3 : 25206365  r2 : c0021ddc  r1 : c0021dd0  r0 : c0021dd0
Flags: nzCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment user
Control: c000717f  Table: 3391c000  DAC: 00000015
Process linuxrc (pid: 241, stack limit = 0xc3922270)
Stack: (0xc3923e70 to 0xc3924000)
3e60:                                     00000000 28121969 fee1dead c004eef4
3e80: 00000000 c004ef34 01234567 c004f050 00000000 00000000 00000000 00000000
3ea0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
3ec0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
3ee0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
3f00: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
3f20: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
3f40: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
3f60: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
3f80: 00000000 00000000 00000000 00000000 c3922000 00000000 00000000 ffffffff
3fa0: 00000058 c0025940 00000000 00000000 fee1dead 28121969 01234567 00000000
3fc0: 00000000 00000000 ffffffff 00000058 00000000 00000001 00000000 befbff14
3fe0: 00000072 befbf998 000b2b98 00131250 60000010 fee1dead 00000000 00000000
[<c018b288>] (device_shutdown+0x28/0xa0) from [<c004eef4>] (kernel_restart_prepa
re+0x24/0x34)
[<c004eef4>] (kernel_restart_prepare+0x24/0x34) from [<c004ef34>] (kernel_restar
t+0xc/0x40)
[<c004ef34>] (kernel_restart+0xc/0x40) from [<c004f050>] (sys_reboot+0xe0/0x1c4)

[<c004f050>] (sys_reboot+0xe0/0x1c4) from [<c0025940>] (ret_fast_syscall+0x0/0x2
8)
Code: ea000010 e5913040 e3530000 0a000002 (e5933020)
---[ end trace 222a399f353d427a ]---

然后系统就挂了
请大家帮忙分析一下,这个是哪里错误,怎么解决?
谢谢
[ 此帖被sqshining在2010-12-26 17:37重新编辑 ]
级别: 新手上路
UID: 4077
精华: 0
发帖: 22
金钱: 125 两
威望: 34 点
贡献值: 0 点
综合积分: 44 分
注册时间: 2009-02-24
最后登录: 2019-09-07
1楼  发表于: 2010-12-26 17:35
自己已经解决
原因是
/linux-2.6.32.7/arch/arm/mach-s3c2440/mach-mini2440.c

有关驱动的数组使用"__initdata"修饰符导致。
说明: 所有 __init* 修饰的数据,函数都用于说明它们只在系统开机阶段使用,其占用的空间会在系统完成启动后释放。 此时, 它们不再有效。

在使用reboot命令时,系统调用
ret_fast_syscall函数,ret_fast_syscall调用sys_reboot函数,sys_reboot调用kernel_restart函数,kernel_restart调用kernel_restart_prepare函数,kernel_restart_prepare调用device_shutdown函数,
device_shutdown函数实现如下:
/**
* device_shutdown - call ->shutdown() on each device to shutdown.
*/
void device_shutdown(void)
{
    struct device *dev, *devn;

    list_for_each_entry_safe_reverse(dev, devn, &devices_kset->list,
                kobj.entry) {
        if (dev->bus && dev->bus->shutdown) {
            dev_dbg(dev, "shutdown\n");
            dev->bus->shutdown(dev);
        } else if (dev->driver && dev->driver->shutdown) {
            dev_dbg(dev, "shutdown\n");
            dev->driver->shutdown(dev);
        }
    }
    kobject_put(sysfs_dev_char_kobj);
    kobject_put(sysfs_dev_block_kobj);
    kobject_put(dev_kobj);
    async_synchronize_full();
}

list_for_each_entry_safe_reverse是个有关for循环的宏,目的是访问dev的链表,然后在循环体中调用dev->bus->shutdown(dev);
而__initdata 的修饰使得dev链表相关的内容在系统启动后被释放,而shutdown访问时便出错了。

将所有 __initdata 修饰符去掉后, 一切正常了!




修改例子:

/* DM9000AEP 10/100 ethernet controller */
/*
static struct resource mini2440_dm9k_resource[] __initdata = {
*/    
static struct resource mini2440_dm9k_resource[] = {
    [0] = {
        .start = MACH_MINI2440_DM9K_BASE,
        .end   = MACH_MINI2440_DM9K_BASE + 3,
        .flags = IORESOURCE_MEM
    },
    [1] = {
        .start = MACH_MINI2440_DM9K_BASE + 4,
        .end   = MACH_MINI2440_DM9K_BASE + 7,
        .flags = IORESOURCE_MEM
    },
    [2] = {
        .start = IRQ_EINT7,
        .end   = IRQ_EINT7,
        .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
    }
};
自由,自强,共享,共创。
级别: 论坛版主
UID: 12573
精华: 27
发帖: 8838
金钱: 46490 两
威望: 9298 点
贡献值: 27 点
综合积分: 18216 分
注册时间: 2010-01-09
最后登录: 2019-07-16
2楼  发表于: 2010-12-27 07:33
不错,有价值
新手如何向我们反馈有效的信息,以便解决问题,见此贴:
http://www.arm9home.net/read.php?tid-14431.html

[注]: 此处签名链接仅为指引方向,而非解答问题本身.