返回信息流最近测试了书上的一个例子(程序代码见附件),编译通过,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
这是一条镜像帖。来源:北邮人论坛 / embedded-system / #5625同步于 2009/8/24
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Embedded_System机器人发帖
求教大牛,一个诡异的关于“No such device or address"的错误
hanger
2009/8/24镜像同步26 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
有个想法,可以在报错的命令前再加上strace,将命令执行过程中发生的系统调用都打出来,然后参照linux源码分析一下,这样就知道为什么会报这个错了
此外,建议调整下代码缩进,一般缩1个Tab(对应8个空格的宽度),你缩的好像是4个Tab
【 在 yihang 的大作中提到: 】
: init函数里没有注册设备
这个是注册函数吧class_device_create(globalmem_class, NULL, devno, NULL, "globalmem");
注册不了设备的话echo之后就变成普通文件了,cat也不会报错了
【 在 ArmStrong 的大作中提到: 】
: 这个是注册函数吧class_device_create(globalmem_class, NULL, devno, NULL, "globalmem");
: 注册不了设备的话echo之后就变成普通文件了,cat也不会报错了
哦,学习了,我只会registerxxxx。
君不见设备号和设备名都传进去了,不注册设备干啥呢
【 在 yihang (Goodluckfly) 的大作中提到: 】
: 哦,学习了,我只会registerxxxx。
刚才分析了一下,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]#
可以看到,在执行下面这句的时候,返回错误了,而且就是No such device or address的错误
read(3, 0x91e7000, 4096) = -1 ENXIO (No such device or address)