Unhandled fault: alignment exception (93) at 0x00000001
用的是嵌入式linux,添加了一个字符设备驱动,测试驱动时候就出现如下的错误提示:
Unhandled fault: alignment exception (93) at 0x00000001
fault-common.c(97): start_code=0xf40040, start_stack=0xf4ff94)
Internal error: Oops: 0
CPU: 0
pc : [<00030c8c>] lr : [<0002fc44>] Not tainted
sp : 00fbbf74 ip : 00000001 fp : 00fbbf80
r10: 00f45f44 r9 : 00000003 r8 : 00f4ff44
r7 : 00fba000 r6 : fffffff7 r5 : 00f4ff44 r4 : 00000005
r3 : 003e163c r2 : 20000013 r1 : 20000093 r0 : 00000003
Flags: nzCv IRQs off FIQs on Mode SVC_32 Segment kernel
Control: 0
Process testsd (pid: 45, stackpage=00fbb000)
Stack:
00fbbf60: 0002fc44 00030c8c 20000093 ffffffff 00fbbfac 00fbbf84 0002fc
44
00fbbf80: 00030c5c 000152f0 00015138 00000000 00f4ff44 00000003 00fba000 00014b
40
00fbbfa0: 00000000 00fbbfb0 000149a0 0002fc34 00000000 000151d4 00000003 00f4ff
44
00fbbfc0: 00000005 00000000 00000000 00f4ff44 00000003 00000001 00f4ffa0 000000
00
00fbbfe0: 00f45f44 00f4ff40 00f4ff44 00f4ff30 00f40148 00f41e88 60000010 000000
03
Backtrace:
Function entered at [<00030c4c>] from [<0002fc44>]
Function entered at [<0002fc24>] from [<000149a0>]
r8 = 00014B40 r7 = 00FBA000 r6 = 00000003 r5 = 00F4FF44
r4 = 00000000
Code: e3821080 e121f001 (e59c3014) e2833001 e58c3014
Unhandled fault: alignment exception (13) at 0x00000001
fault-common.c(97): start_code=0xe5810000, start_stack=0xe3a06060)
Internal error: Oops: 0
CPU: 0
pc : [<0002f774>] lr : [<0001e1d8>] Not tainted
sp : 00fbbe88 ip : 00fbbea4 fp : 00fbbea0
r10: 003e163c r9 : 001e04ec r8 : 00000000
r7 : 00000001 r6 : 00000003 r5 : 003e1520 r4 : 00000001
r3 : 003e1648 r2 : 00000000 r1 : 003e1520 r0 : 00000001
Flags: nzCv IRQs on FIQs on Mode SVC_32 Segment kernel
Control: 0
Process testsd (pid: 45, stackpage=00fbb000)
Stack:
00fbbe60: 0001e1d8 0002f7
74
00fbbe80: 20000013 ffffffff 00000001 003e1520 00000003 00fbbecc 00fbbea4 0001e1
d8
00fbbea0: 0002f774 003f52a0 00fbbf2c 00fba000 00fba000 0000000b 20000093 000d36
bc
00fbbec0: 00fbbedc 00fbbed0 0001e9c8 0001e14c 00fbbef4 00fbbee0 00018aac 0001e8
ec
00fbbee0: 00fba000 00000001 00fbbf04 00fbbef8 00018ae0 000189f0 00fbbf28 00fbbf
08
00fbbf00: 00019af8 00018ad4 e59c3014 00fbbf60 fffffff7 00fba000 00f4ff44 00fbbf
80
00fbbf20: 00fbbf2c 000146a0 00019a68 00000003 20000093 20000013 003e163c 000000
05
00fbbf40: 00f4ff44 fffffff7 00fba000 00f4ff44 00000003 00f45f44 00fbbf80 000000
01
00fbbf60: 00fbbf74 0002fc44 00030c8c 20000093 ffffffff 00fbbfac 00fbbf84 0002fc
44
00fbbf80: 00030c5c 000152f0 00015138 00000000 00f4ff44 00000003 00fba000 00014b
40
00fbbfa0: 00000000 00fbbfb0 000149a0 0002fc34 00000000 000151d4 00000003 00f4ff
44
00fbbfc0: 00000005 00000000 00000000 00f4ff44 00000003 00000001 00f4ffa0 000000
00
00fbbfe0: 00f45f44 00f4ff40 00f4ff44 00f4ff30 00f40148 00f41e88 60000010 000000
03
Backtrace:
Function entered at [<0002f764>] from [<0001e1d8>]
r6 = 00000003 r5 = 003E1520 r4 = 00000001
Function entered at [<0001e13c>] from [<0001e9c8>]
Function entered at [<0001e8dc>] from [<00018aac>]
Function entered at [<000189e0>] from [<00018ae0>]
r5 = 00000001 r4 = 00FBA000
Function entered at [<00018ac4>] from [<00019af8>]
Function entered at [<00019a58>] from [<000146a0>]
r8 = 00F4FF44 r7 = 00FBA000 r6 = FFFFFFF7 r5 = 00FBBF60
r4 = E59C3014
Function entered at [<00030c4c>] from [<0002fc44>]
Function entered at [<0002fc24>] from [<000149a0>]
r8 = 00014B40 r7 = 00FBA000 r6 = 00000003 r5 = 00F4FF44
r4 = 00000000
Code: e24cb004 e1a04000 (e5945014) e1a06001 e3550000
pid 45: failed 11
/usr>
问题点数:100、回复次数:5Top
1 楼dxy331(柠檬)回复于 2005-04-01 17:40:18 得分 0
这是驱动程序,各位大侠帮忙分析一下吧!先谢谢了!
static int sd2300_open (struct inode *inode, struct file *fp)
{
return 1;
}
static int sd2300_release ( struct inode *inode, struct file *fp)
{
return 0;
}
static ssize_t sd2300_read ( struct file *fp, char *buf, size_t count, loff_t *ptr)
{
int total;
if( verify_area(VERIFY_WRITE, buf, count) == -EFAULT)
return -EFAULT;
for(total = 0; total < count; total ++)
__put_user(68,buf++);
return count;
}
static ssize_t sd2300_write ( struct file *fp, const char *buf, size_t count, loff_t *ptr)
{
return count;
}
static struct file_operations sd2300_fops = {
owner: THIS_MODULE,
read : sd2300_read, /* read */
write : sd2300_write, /* write */
open : sd2300_open, /* open */
release : sd2300_release /* release */
};
void sd2300_init(void)
{
int result;
result=register_chrdev (sd2300_major, "sd2300", &sd2300_fops);
if (result < 0){
printk ("chr dev register failed.\n");
}
}Top
2 楼dxy331(柠檬)回复于 2005-04-04 10:13:56 得分 0
测试驱动是自己写了一个程序,OPEN没问题,一read()就出现了上面的提示,在网上搜索了一下,看见说字节不对齐的说法,没看明白是什么问题?Top
3 楼slone(slone)回复于 2005-04-04 12:24:53 得分 50
open 什么事情也没做当然应该没问题,buffer 是否分配空间,static ssize_t sd2300_read ( struct file *fp, char *buf, size_t count, loff_t *ptr)
{
int total;
if( verify_area(VERIFY_WRITE, buf, count) == -EFAULT)
return -EFAULT;
for(total = 0; total < count; total ++)
__put_user(68,buf++);
return count;
}
先注释掉除 return count; 外的所有语句,再逐步恢复试试,看问题究竟出在哪里。Top
4 楼aria(*nix learner)回复于 2005-04-04 16:29:03 得分 50
你的open里返回的是1,而其实成功的话应该返回0。因此建议你先检查自己用户态open()的返回值。Top
5 楼dxy331(柠檬)回复于 2005-04-05 09:48:17 得分 0
把
if( verify_area(VERIFY_WRITE, buf, count) == -EFAULT)
return -EFAULT;
for(total = 0; total < count; total ++)
__put_user(68,buf++);
改写为
for(total = 0; total < count; total ++)
copy_to_user(90,buf++);
读到的竟然是160
copy_to_user(1,buf++);
读到为0
copy_to_user(200,buf++);
读到也为0
Top




