BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / embedded-system / #5625同步于 2009/8/24
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Embedded_System机器人发帖

求教大牛,一个诡异的关于“No such device or address"的错误

hanger
2009/8/24镜像同步26 回复
最近测试了书上的一个例子(程序代码见附件),编译通过,insmod的后用如下方式测试出错。 root@ubuntu# echo '12345' > /dev/globalmem root@ubuntu# cat /dev/globalmem 12345 cat: /dev/globalmem: No such device or address 测试平台是ubuntu8.04,内核2.6.24 问题:能够输出写入的内容,但是为什么会报错呢?望大牛指点。先谢谢了~~~ 附件(6.5KB) globalmem.c
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
hobby机器人#1 · 2009/8/25
有个想法,可以在报错的命令前再加上strace,将命令执行过程中发生的系统调用都打出来,然后参照linux源码分析一下,这样就知道为什么会报这个错了 此外,建议调整下代码缩进,一般缩1个Tab(对应8个空格的宽度),你缩的好像是4个Tab
ArmStrong机器人#2 · 2009/8/25
确实挺诡异的,程序看不出什么问题来,要不你写个小应用程序,open,write,read,close试一下?
yihang机器人#3 · 2009/8/25
init函数里没有注册设备
ArmStrong机器人#4 · 2009/8/25
【 在 yihang 的大作中提到: 】 : init函数里没有注册设备 这个是注册函数吧class_device_create(globalmem_class, NULL, devno, NULL, "globalmem"); 注册不了设备的话echo之后就变成普通文件了,cat也不会报错了
yihang机器人#5 · 2009/8/25
【 在 ArmStrong 的大作中提到: 】 : 这个是注册函数吧class_device_create(globalmem_class, NULL, devno, NULL, "globalmem"); : 注册不了设备的话echo之后就变成普通文件了,cat也不会报错了 哦,学习了,我只会registerxxxx。
ArmStrong机器人#6 · 2009/8/25
君不见设备号和设备名都传进去了,不注册设备干啥呢 【 在 yihang (Goodluckfly) 的大作中提到: 】 : 哦,学习了,我只会registerxxxx。
hobby机器人#7 · 2009/8/25
刚才分析了一下,read函数执行应该没有问题,仿佛是cat自己read什么东西的时候出错的 [root@localhost help]# cat /var/log/messages Aug 25 10:10:12 localhost kernel: globalmem: close ok. Aug 25 10:10:26 localhost kernel: p=0, count=4096 Aug 25 10:10:26 localhost kernel: read 4096 bytes(s) from 0 Aug 25 10:10:26 localhost kernel: globalmem: close ok. Aug 25 10:15:20 localhost kernel: p=0, count=4096 Aug 25 10:15:20 localhost kernel: read 4096 bytes(s) from 0 Aug 25 10:15:20 localhost kernel: globalmem: close ok. [root@localhost help]# strace cat /dev/globalmem execve("/bin/cat", ["cat", "/dev/globalmem"], [/* 29 vars */]) = 0 brk(0) = 0x91e6000 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) open("/etc/ld.so.cache", O_RDONLY) = 3 fstat64(3, {st_mode=S_IFREG|0644, st_size=75013, ...}) = 0 mmap2(NULL, 75013, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb80ea000 close(3) = 0 open("/lib/libc.so.6", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0@\'\271\0004\0\0\0"..., 512) = 512 fstat64(3, {st_mode=S_IFREG|0755, st_size=1758468, ...}) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb80e9000 mmap2(0xb7c000, 1476176, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7c000 mmap2(0xcdf000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x163) = 0xcdf000 mmap2(0xce2000, 9808, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xce2000 close(3) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb80e8000 set_thread_area({entry_number:-1 -> 6, base_addr:0xb80e86c0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0 mprotect(0xcdf000, 8192, PROT_READ) = 0 mprotect(0xb78000, 4096, PROT_READ) = 0 munmap(0xb80ea000, 75013) = 0 open("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE) = 3 fstat64(3, {st_mode=S_IFREG|0644, st_size=79366688, ...}) = 0 mmap2(NULL, 2097152, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7ee8000 close(3) = 0 brk(0) = 0x91e6000 brk(0x9207000) = 0x9207000 open("/usr/share/locale/locale.alias", O_RDONLY) = 3 fstat64(3, {st_mode=S_IFREG|0644, st_size=2512, ...}) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb80fc000 read(3, "# Locale name alias data base.\n#"..., 4096) = 2512 read(3, "", 4096) = 0 close(3) = 0 munmap(0xb80fc000, 4096) = 0 open("/usr/lib/locale/c/LC_IDENTIFICATION", O_RDONLY) = -1 ENOENT (No such file or directory) fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0 open("/dev/globalmem", O_RDONLY|O_LARGEFILE) = 3 fstat64(3, {st_mode=S_IFCHR|0660, st_rdev=makedev(247, 0), ...}) = 0 read(3, "12345\n\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096) = 4096 write(1, "12345\n\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 409612345 ) = 4096 read(3, 0x91e7000, 4096) = -1 ENXIO (No such device or address) write(2, "cat: ", 5cat: ) = 5 write(2, "/dev/globalmem", 14/dev/globalmem) = 14 write(2, ": No such device or address", 27: No such device or address) = 27 write(2, "\n", 1 ) = 1 close(3) = 0 close(1) = 0 close(2) = 0 exit_group(1) = ? [root@localhost help]#
hobby机器人#8 · 2009/8/25
可以看到,在执行下面这句的时候,返回错误了,而且就是No such device or address的错误 read(3, 0x91e7000, 4096) = -1 ENXIO (No such device or address)
yihang机器人#9 · 2009/8/25
查看一下那些打印信息KERNINFO。