免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3383 | 回复: 15
打印 上一主题 下一主题

<Unable to handle kernel...>问题,有经验的高手请进来一下 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-16 15:29 |只看该作者 |倒序浏览
错误提示(/var/log/message)
Dec 16 14:59:29 localhost kernel: Unable to handle kernel paging request at virtual address 6d616e9d
Dec 16 14:59:29 localhost kernel:  printing eip:
Dec 16 14:59:29 localhost kernel: e09650f5
Dec 16 14:59:29 localhost kernel: *pde = 00000000
Dec 16 14:59:29 localhost kernel: Oops: 0000
Dec 16 14:59:29 localhost kernel: inode parport_pc lp parport autofs ide-cd cdrom vmblock vmmemctl vmxnet vmhgfs keybdev mousedev hid input usb-uhci ehci-hcd usbcore ext3 jbd BusLogic sd_mod s
Dec 16 14:59:29 localhost kernel: CPU:    0
Dec 16 14:59:29 localhost kernel: EIP:    0060:[<e09650f5>]    Tainted: PF
Dec 16 14:59:29 localhost kernel: EFLAGS: 00010296
Dec 16 14:59:29 localhost kernel:
Dec 16 14:59:29 localhost kernel: EIP is at proc_lock_write [inode] 0x79 (2.4.20-
Dec 16 14:59:29 localhost login(pam_unix)[2758]: session closed for user root
Dec 16 14:59:29 localhost kernel: eax: 6d616e65   ebx: 080e8408   ecx: 00000001   edx: dee70000
Dec 16 14:59:29 localhost kernel: esi: dd3a9f00   edi: ffffffea   ebp: 00000002   esp: dd653f6c
Dec 16 14:59:29 localhost kernel: ds: 0068   es: 0068   ss: 0068
Dec 16 14:59:29 localhost kernel: Process bash (pid: 2759, stackpage=dd653000)
Dec 16 14:59:29 localhost kernel: Stack: 0000000a 0000000a c2567b80 00000001 00000000 c016b390 dd3a9f00 080e8408
Dec 16 14:59:29 localhost kernel:        00000002 00000000 c0146e93 dd3a9f00 080e8408 00000002 dd3a9f20 00000003
Dec 16 14:59:29 localhost kernel:        00000000 dd652000 00000002 080e8408 bfffdbf8 c0109537 00000001 080e8408
Dec 16 14:59:29 localhost kernel: Call Trace:   [<c016b390>] proc_file_write [kernel] 0x40 (0xdd653f80))
Dec 16 14:59:29 localhost kernel: [<c0146e93>] sys_write [kernel] 0xa3 (0xdd653f94))
Dec 16 14:59:29 localhost kernel: [<c0109537>] system_call [kernel] 0x33 (0xdd653fc0))
Dec 16 14:59:29 localhost kernel:
Dec 16 14:59:29 localhost kernel:
Dec 16 14:59:29 localhost kernel: Code: ff 70 38 68 bc 59 96 e0 eb e9 83 ec 0c 68 d1 59 96 e0 eb df

我目前想改造一个RAMFS,通过往/proc/某个文件写数据来实现控制,例如往/proc/fs/myramfs/lock 写1,调用proc_lock_write函数。
这个函数中问题代码如下:

  1.       struct super_block *tmp;
  2.          tmp= list_entry(&myramfs_fs_type.fs_supers, struct super_block, s_instances);
  3.          struct dentry * m_d=tmp->s_root;
  4.          printk("Hello\n");
  5.          printk("The root name is %d\n",m_d->d_mounted);
复制代码

其中myramfs_fs_type为file_system_type数据结构,我想要达到的目的就是读取挂载目录的目录名。

而我把最后那句printk函数注释掉就没有这个问题。

请教各位大侠,谢谢!

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
2 [报告]
发表于 2008-12-16 15:31 |只看该作者
printk("The root name is %d\n",m_d->d_mounted);


LZ指的是这行代码吗?

论坛徽章:
0
3 [报告]
发表于 2008-12-16 15:32 |只看该作者
谢谢您的回复

是的,最后一行

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
4 [报告]
发表于 2008-12-16 15:35 |只看该作者
struct dentry {
        atomic_t d_count;
        unsigned int d_flags;                /* protected by d_lock */
        spinlock_t d_lock;                /* per dentry lock */

这个变量是atomic_t的,估计应该使用相应的原子类型的读取函数,不能直接读取吧
typedef struct { volatile int counter; } atomic_t;

#define ATOMIC_INIT(i)        { (i) }

/**
* atomic_read - read atomic variable
* @v: pointer of type atomic_t
*
* Atomically reads the value of @v.
*/
#define atomic_read(v)                ((v)->counter)

[ 本帖最后由 Godbach 于 2008-12-16 15:37 编辑 ]

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
5 [报告]
发表于 2008-12-16 15:36 |只看该作者
试一下atomic_read(d_count)

论坛徽章:
0
6 [报告]
发表于 2008-12-16 15:38 |只看该作者
原帖由 Godbach 于 2008-12-16 15:35 发表

这个变量是atomic_t的,估计应该使用相应的原子类型的读取函数,不能直接读取吧


呵呵您看错了,我用的是
        int d_mounted;
但是我之前也有试过打印d_iname,也有同样的问题

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
7 [报告]
发表于 2008-12-16 15:43 |只看该作者

回复 #6 youmin0 的帖子

惭愧,两个长的有点像
贴一下proc_file_write的代码吧

论坛徽章:
0
8 [报告]
发表于 2008-12-16 15:49 |只看该作者
好的


  1. ssize_t proc_lock_write( struct file *filp, const char *buff,
  2.                         unsigned long len, void *data )
  3. {
  4.         printk("And the (int)*buff is %d and the (int)*(buff+1) is %d\n",(int)*buff,(int)*(buff+1));
  5.         if(*buff!='1'&&*buff!='0')
  6.                 return len;
  7.         if((int)*(buff+1)!=10)
  8.                 return len;
  9.         i_lock=(int)*buff-(int)'0';
  10.         printk("Here is proc_lock_write and the lock is %d\n",i_lock);//其中i_lock是一个全局变量为1是lock,为0是unlock,这之前的代码是为了过滤掉错误的输入,即只能输入0,1才可以

  11.         struct super_block *tmp;
  12.         tmp= list_entry(&myramfs_fs_type.fs_supers, struct super_block, s_instances);

  13.        struct dentry * m_d=tmp->s_root;
  14.        printk("The root name is %d\n",m_d->d_mounted);
  15.        return len;
  16. }


复制代码

论坛徽章:
0
9 [报告]
发表于 2008-12-16 15:57 |只看该作者
是不是我list_entry的问题?

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
10 [报告]
发表于 2008-12-16 15:58 |只看该作者
如果这个是你的proc文件写函数的话,你应该明白buff是在用户空间的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP