免费注册 查看新帖 |

Chinaunix

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

求教FreeBSD内核定时器 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-04-29 17:16 |只看该作者 |倒序浏览
现在在FreeBSD下做内核模块编程,要用到一个间隔定时器。
FreeBSD好像没有像Linux下那样的内核定时器。

然后我使用setitimer
编译的时候出现了下面的警告
warning: implicit declaration of function `setitimer'
warning: nested extern declaration of `setitimer'

我包含了#include <sys/time.h>
怎么还会出现这样的警告呢?

请大家帮忙给个解决方案,或者提供一下有没有类似于Linux下内核定时器那样的机制

论坛徽章:
0
2 [报告]
发表于 2008-04-30 09:26 |只看该作者

回复 #1 xiangyu1986 的帖子

man 9 timeout

网卡的watchdog就好象用timeout实现的

论坛徽章:
0
3 [报告]
发表于 2008-04-30 10:10 |只看该作者
不懂呃.顶一下...

论坛徽章:
0
4 [报告]
发表于 2008-04-30 13:04 |只看该作者
LKM可以用setitimer?

论坛徽章:
0
5 [报告]
发表于 2008-04-30 14:20 |只看该作者

回复 #4 mingyanguo 的帖子

man 2 setitimer

很明显 setitimer 是系统调用,当然能在LKM中使用啦!

更何况
在 /usr/include/sys/sysproto.h 中就有下面原型

int     setitimer(struct thread *, struct setitimer_args *);

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
6 [报告]
发表于 2008-04-30 14:30 |只看该作者
原帖由 zsniper 于 2008-4-30 14:20 发表
man 2 setitimer

很明显 setitimer 是系统调用,当然能在LKM中使用啦!

更何况
在 /usr/include/sys/sysproto.h 中就有下面原型

int     setitimer(struct thread *, struct setitimer_args *);



不行的。LKM link之后是kernel space

论坛徽章:
0
7 [报告]
发表于 2008-04-30 14:38 |只看该作者

回复 #6 gvim 的帖子

系统调用不就是在kernelspace和userland的接口吗?

在LKM中调用,不就是在kernelspace下设置了定时器吗?

请教斑竹,我的理解是不是错了。。

[ 本帖最后由 zsniper 于 2008-4-30 14:40 编辑 ]

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
8 [报告]
发表于 2008-04-30 15:19 |只看该作者
原帖由 zsniper 于 2008-4-30 14:38 发表
系统调用不就是在kernelspace和userland的接口吗?

在LKM中调用,不就是在kernelspace下设置了定时器吗?

请教斑竹,我的理解是不是错了。。


kernelspace和userland的接口....确实是接口。
不过,userland的东西,总归只能在userland使用。kernel只需要提供facilities就可以了。

man 2 是内核抽象出来给userland的东西,并不意味着kernel可以直接使用给userland的这些抽象。

论坛徽章:
0
9 [报告]
发表于 2008-04-30 15:28 |只看该作者

回复 #8 gvim 的帖子

那我可以在LKM中申请用户空间的参数struct setitimer_args,
之后调用setitimer()不就可以在kernelspace中设置定时器了吗?

/* 在用户空间分配内存 */
uland_alloc();
suword();
copyout();

setitimer();

[ 本帖最后由 zsniper 于 2008-4-30 15:36 编辑 ]

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
10 [报告]
发表于 2008-04-30 15:39 |只看该作者

回复 #9 zsniper 的帖子

也不行,userland陷入kernel是需要软件中断的int 0x80。这个机制在i386手册里面有描述,包括堆栈和用户参数,异常。。。。。一堆东西。这样直接用,会出问题。

定时器我记得是对每一个进程/线程来说的,内核提供的设施有man 9 里面的东西(包括,但不限于)。楼主的问题可以用callout之类的。

[ 本帖最后由 gvim 于 2008-4-30 15:44 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP