更改linux系统时钟(时钟同步)

  本篇文章都是在内核线程中做的,然后利用动态模块加载进行编译测试。

  在此之前写了个udp客户端和服务器端,两边进行通信,由服务器端向客户端发送带有本地时间戳的报文,客户端接收报文并回送,服务器端再利用do_gettimeofday()函数提取系统时间,如此往返测试很多次,计算出发送和接收报文的延迟时间,我们将精度控制在us级。

  延迟时间测出以后,由服务器端提取自己的系统时间加上延迟时间向客户端发送报文,客户端接收并提取出报文以后就调用do_settimeofday调整自己的系统时间,与服务器端保持一致。如此,服务器每个一个周期T向客户端发送时间报文,而客户端在收到报文之后,除了要设置时间之外,还需要判断自己的时钟是否比服务器的快或者慢,利用do_adjtimex()进行微调,在这里我们更改的是每个tick的时间值,大约是1000us加上或减去一个不超100的值。

  需要注意的是,由于是在内核线程操作,不能使用用户空间的系统调用,只能调用内核中的函数,但是do_adjtimex()在内核中是没有导出的,因此需要在包含do_adjtimex()函数的C文件中加上EXPORT_SYMBOL(do_adjtimex);并包含<linux/module.h>头文件。重新编译内核就可以调用do_adjtimex()函数了。

posted on 2012-07-12 10:52  yuki未央  阅读(442)  评论(0编辑  收藏  举报