免费注册 查看新帖 |

Chinaunix

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

[SCO UNIX] 请高手指教!在内核驱动程序里,如何读写文件? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-04-02 11:48 |只看该作者 |倒序浏览
在内核驱动程序里,如何读写文件?
用 printf 能把信息写在 /usr/adm/messages 和 /usr/adm/syslog里
系统是怎么实现的??

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2007-04-02 14:11 |只看该作者
原帖由 lhlzy 于 2007-4-2 11:48 发表
在内核驱动程序里,如何读写文件?
用 printf 能把信息写在 /usr/adm/messages 和 /usr/adm/syslog里
系统是怎么实现的??



没看明白提的问题。能不能说清楚一些。

论坛徽章:
0
3 [报告]
发表于 2007-04-02 14:56 |只看该作者
sorry!
写了个虚拟串口驱动: tty4 ---可仿真com3(在vm虚拟机里)
我想在对com3写入的同时输出到一个文件里

tty4write(dev)
dev_t dev;
{
int fd;
char c[2000]={'\0'};
printf("base:%d count:%d",u.u_base,u.u_count);
copyin(u.u_base,c,u.u_count);
//打开文件并写入
if((fd=open("tty44.txt","O_CREAT",0777))==-1) return ;
write(c,u.u_count,1,in);
close(fd);
//对com3的操作
...

}
以上写文件操作当然是不行的
请问高手有什么好方法?
为什么printf能把内容输出到messaages / syslog呢,他用了什么调用?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
4 [报告]
发表于 2007-04-02 17:35 |只看该作者
之所以printf以及cmn_err能写到message和syslog,那是因为sco的内核提供而且仅提供了这两个接口,
它们饶开了文件系统代码由内核直接对上述文件对应的inode节点做的操作,复杂透顶。
open/read/write之所以不行,那是因为内核里的open/read/write和你平常连接的libc.so是两回事,
内核的open/read/write入口参数和平常的open/read/write完全不同,入参好象是inode或物理块号,
总之你没办法在内核级代码使用它们。

之所以我知道这些东西,那是因为我以前也尝试过在内核里读写文件,
但是仔细看过sco的ddi以及oddi开发文挡之后,就彻底失望了,
目前sco的各个版本除了printf和cmn_err之外均没有提供任何像linux那样从内核空间进行文件系统调用的办法。

论坛徽章:
0
5 [报告]
发表于 2007-04-02 22:53 |只看该作者
谢谢CNL!
能否用其他方法,比如Message Queues 或Shared Memory之类?
先在驱动里用shmget建个Shared Memory 然后把信息暂时放在Shared Memory里

再做一个程序(用户态) 读出Shared Memory内存的信息呢??

论坛徽章:
0
6 [报告]
发表于 2007-04-02 23:30 |只看该作者
原帖由 CNL 于 2007-4-2 17:35 发表
之所以printf以及cmn_err能写到message和syslog,那是因为sco的内核提供而且仅提供了这两个接口,
它们饶开了文件系统代码由内核直接对上述文件对应的inode节点做的操作,复杂透顶。
open/read/write之所以不行 ...


“入参好象是inode或物理块号”,如果能写到设备中,结合marry就能实现写到文件了啊(想象啊,供参考)。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
7 [报告]
发表于 2007-04-03 08:06 |只看该作者
原帖由 lhlzy 于 2007-4-2 22:53 发表
谢谢CNL!
能否用其他方法,比如Message Queues 或Shared Memory之类?
先在驱动里用shmget建个Shared Memory 然后把信息暂时放在Shared Memory里

再做一个程序(用户态) 读出Shared Memory内存的信息呢??

共享内存是不行的,但是可以在你的驱动程序xxxioctl处理代码里增加一个command入口处理,
将保存在内核态的数据用copyout复制到ioctl传入的用户态缓冲区,这样用户态程序才能获得你要的数据,
sco knowlege center有篇驱动开发文档,里面讲的比较详细,可以参考一下:
http://wdb1.sco.com/kb/showta?ta ... 1509342&pgnum=1

论坛徽章:
0
8 [报告]
发表于 2007-04-03 16:07 |只看该作者
谢谢cnl
受教了
试了共享内存,真是不行!! 得到的是 0xFFFFFFF的地址 一写 就 panic........
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP