免费注册 查看新帖 |

Chinaunix

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

linux内核错误:BUG: unable to handle kernel paging request at virtual address [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-09-16 15:22 |只看该作者 |倒序浏览
本帖最后由 lanyang123 于 2011-09-16 15:29 编辑

内核版本2.6.18

使用内核中的AES加密算法对数据进行加解密,编写函数如下,

int mycipher_test(char *alg,int encflag,char *code,char *key),其中第一个参数alg是AES加密算法的标志,第二个参数encflag是判断加密还

是解密,第三个参数code是要加解密的数据,第四个参数key是密钥。

该函数以模块的方式编译进内核。

具体代码如下
  1. int mycipher_test(char *alg,int encflag,char *code,char *key)
  2. {   

  3.     int ret,keylen,codelen;

  4.         struct scatterlist sg;

  5.         char *result;

  6.     struct crypto_tfm *tfm;


  7.         keylen = 16;

  8.         codelen = strlen(code);
  9.    
  10.          /*限制传入的数据是16字节,因为AES加密算法要求加密数据的长度为16字节整数倍*/
  11.     if(codelen!=16){
  12.         return -1;

  13.     }
  14.    

  15.        /* Allocate transform for AES ECB mode */     

  16.        tfm = crypto_alloc_tfm(alg,0);



  17.     if(IS_ERR(tfm)) {

  18.    
  19.         printk("<1>failed to load transform for aes ECB mode !\n");

  20.               return -1;


  21.     }

  22.         /*设置加密密钥*/
  23.     ret = crypto_cipher_setkey(tfm,key,keylen);

  24.     if(ret) {
  25.         printk("<1>failed to setkey \n");
  26.               goto failed1;
  27.     }



  28.     sg_init_one(&sg,code,16);//?

  29.     switch(encflag){

  30.    
  31.         case 0:/*加密*/
  32.                 ret = crypto_cipher_encrypt(tfm,&sg,&sg,16);//可能出错处
  33.                if(ret) {

  34.                     printk("<1>encrypt failed \n");

  35.                     goto failed1;

  36.                 }

  37.             crypto_free_tfm(tfm);

  38.             return 0;   

  39.             break;


  40.         case 1:/*解密*/

  41.                 ret = crypto_cipher_decrypt(tfm,&sg,&sg,16);//可能出错处
  42.               if(ret) {

  43.                         printk("<1>dencrypt failed \n");

  44.                         goto failed1;

  45.                          }
  46.             crypto_free_tfm(tfm);
  47.             return 0;
  48.             break;


  49.         default:
  50.             printk("error\n");
  51.             return -1;


  52.     }


  53. failed1:

  54.     crypto_free_tfm(tfm);

  55.        return -1;


  56. }

复制代码
在内核中,当调用该函数,对数据进行加解密时,出现如下错误:


BUG: unable to handle kernel paging request at virtual address 0000120c
printing eip:
c101b0d2
*pde = 16cc1067
Oops: 0000 [#1]
SMP  
Modules linked in: autofs4 hidp rfcomm l2cap bluetooth sunrpc ip_conntrack_netbios_ns ipt_REJECT xt_state ip_conntrack nfnetlink iptable_filter ip_tables ip6t_REJECT xt_tcpudp ip6table_filter ip6_tables x_tables acpiphp video sbs i2c_ec button battery asus_acpi ac aes ipv6 lp snd_ens1371 sg gameport snd_rawmidi snd_ac97_codec snd_ac97_bus snd_seq_dummy floppy i2c_piix4 snd_seq_oss pcspkr snd_seq_midi_event i2c_core snd_seq snd_seq_device snd_pcm_oss snd_mixer_oss snd_pcm pcnet32 snd_timer snd soundcore mii snd_page_alloc parport_pc parport serio_raw ide_cd cdrom dm_snapshot dm_zero dm_mirror dm_mod mptspi mptscsih mptbase scsi_transport_spi sd_mod scsi_mod ext3 jbd ehci_hcd ohci_hcd uhci_hcd
CPU: 0
EIP: 0060:[<c101b0d2>] Not tainted VLI
EFLAGS: 00010212 (2.6.18.1 #82)  
EIP is at kmap_atomic+0x1b/0x7f
eax: 00000001 ebx: 00000007 ecx: c1cc2840 edx: 00000000
esi: 00000010 edi: d718fdac ebp: 00000010 esp: d718fd10
ds: 007b es: 007b ss: 0068
Process firefox-bin (pid: 4309, ti=d718f000 task=c0a03870 task.ti=d718f000)
Stack: d718fd4c c10c1f9e d404d000 c10c2553 d718fd7c d672a800 00000010 00000003  
  d404d000 d718fd9c c1cc2840 c1350761 00000010 00000010 0000084e d718fd9c  
  c1cc2840 00000000 00000010 00000010 0000084e c10c21e7 0000084e d718fdac  
Call Trace:
[<c10c1f9e>] scatterwalk_map+0x2c/0x34
[<c10c2553>] crypt+0xbd/0x1f1
[<c10c21e7>] ecb_process+0x0/0x4b
[<c10c273c>] ecb_decrypt+0x33/0x38
[<e0a5b42e>] aes_decrypt+0x0/0xf62 [aes]
[<c10c21e7>] ecb_process+0x0/0x4b
[<c10c213e>] setkey+0x24/0x27
[<c10c32ae>] mycipher_test+0x10e/0x150
[<c118e7ce>] sock_recvmsg+0x162/0x19b
[<c103334d>] autoremove_wake_function+0x0/0x2d
[<c11eae0b>] schedule+0x907/0x9b4
[<c1057bef>] find_extend_vma+0x12/0x49
[<c1036067>] get_futex_key+0x40/0xd0
[<c118fdfe>] sys_recvfrom+0xcf/0x137
[<c1037092>] do_futex+0x20d/0xabc
[<c10d31d1>] vsnprintf+0x419/0x457
[<c1026b6d>] current_fs_time+0x4a/0x55
[<c107b5fe>] touch_atime+0x60/0x92
[<c107028f>] pipe_readv+0x315/0x321
[<c118fe7f>] sys_recv+0x19/0x1d
[<c11902aa>] sys_socketcall+0x117/0x19e
[<c1003d0b>] syscall_call+0x7/0xb
Code: 01 00 00 c1 e8 0c c1 e0 05 03 05 10 06 38 c1 c3 53 89 c1 89 e0 89 d3 25 00 f0 ff ff ff 40 14 8b 01 c1 e8 1e 8b 14 85 ac e6 2b c1 <8b> 82 0c 12 00 00 05 80 37 00 00 39 c2 74 08 5b 89 c8 e9 b0 8c  
EIP: [<c101b0d2>] kmap_atomic+0x1b/0x7f SS:ESP 0068:d718fd10




这个错误困扰很久了,请各位大侠赐教。

论坛徽章:
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 [报告]
发表于 2011-09-16 15:34 |只看该作者
回复 1# lanyang123
这个函数 scatterwalk_map 也是你的代码中的吗

论坛徽章:
0
3 [报告]
发表于 2011-09-16 15:36 |只看该作者
回复 2# Godbach


    不是的,我的代码全部粘贴在上面了

论坛徽章:
0
4 [报告]
发表于 2011-09-16 15:38 |只看该作者
回复 2# Godbach


    我写的代码可能调用了scatterwalk_map

论坛徽章:
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 [报告]
发表于 2011-09-16 16:33 |只看该作者
回复 4# lanyang123
这个问题很容易复现,或者肯定会出现吗

论坛徽章:
0
6 [报告]
发表于 2011-09-16 17:20 |只看该作者
回复 5# Godbach


    有时候有,有时候没有,感觉像内存越界那一类的错误

论坛徽章:
14
水瓶座
日期:2014-06-10 09:51:0215-16赛季CBA联赛之江苏
日期:2017-11-27 11:42:3515-16赛季CBA联赛之八一
日期:2017-04-12 14:26:2815-16赛季CBA联赛之吉林
日期:2016-08-20 10:43:1215-16赛季CBA联赛之广夏
日期:2016-06-23 09:53:58程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-09 06:20:0015-16赛季CBA联赛之上海
日期:2015-12-25 16:40:3515-16赛季CBA联赛之广夏
日期:2015-12-22 09:39:36程序设计版块每日发帖之星
日期:2015-08-24 06:20:002015亚冠之德黑兰石油
日期:2015-08-07 09:57:302015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2011-09-18 12:19 |只看该作者
这个问题可以试试把call trace当中的函数部分全部采用gcc -g的方式编译,然后objdump -Sl的方式打印出来,找到对应的行号,应该就可以往下面分析

struct scatterlist sg这个结构体大小是多少?

论坛徽章:
0
8 [报告]
发表于 2011-09-18 13:12 |只看该作者
回复 7# lxyscls


    哥们,请问一下是-S 还是-SI ?


还有你说的找到对应的行,如果是-S的话还得自己加偏移很麻烦啊,gdb不是更好

如果是-SI的话,我这的objdump没有这个选项,是需要最新版的吗?

论坛徽章:
14
水瓶座
日期:2014-06-10 09:51:0215-16赛季CBA联赛之江苏
日期:2017-11-27 11:42:3515-16赛季CBA联赛之八一
日期:2017-04-12 14:26:2815-16赛季CBA联赛之吉林
日期:2016-08-20 10:43:1215-16赛季CBA联赛之广夏
日期:2016-06-23 09:53:58程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-09 06:20:0015-16赛季CBA联赛之上海
日期:2015-12-25 16:40:3515-16赛季CBA联赛之广夏
日期:2015-12-22 09:39:36程序设计版块每日发帖之星
日期:2015-08-24 06:20:002015亚冠之德黑兰石油
日期:2015-08-07 09:57:302015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2011-09-18 18:30 |只看该作者
回复  lxyscls


    哥们,请问一下是-S 还是-SI ?


还有你说的找到对应的行,如果是-S的话还得自 ...
unbutun 发表于 2011-09-18 13:12



    大S小L

    这样的话可以对应到汇编行,注意修改相应内核模块(或者是编译完成后的*.o)文件的makefile,加入CFLAGS += -g

    内核木办法用GDB,所以加这么个东西把行号给打出来,起码能跟到事故现场,如果是必现的问题,多多少少还是能跟一下的

论坛徽章:
0
10 [报告]
发表于 2011-09-19 16:39 |只看该作者
回复 7# lxyscls
该结构位于
include/asm-i386/scatterlist.h


  1.    #ifndef _I386_SCATTERLIST_H
  2.    #define _I386_SCATTERLIST_H
  3.   
  4.    struct scatterlist {
  5.        struct page         *page;
  6.        unsigned int        offset;
  7.        dma_addr_t          dma_address;
  8.        unsigned int        length;
  9.    };
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP