1.简单了解Linux系统中clock命令的钟源使用方法
2.Linux驱动开发头文件剖析(二十四):<linux/ktime.h>、<linux/timekeeping.h>、钟源<linux/timekeeping32.h>
3.浅析 Linux RTC 实时时钟
4.在各种Linux系统的钟源服务器上设置时间同步的方法
5.Linux时间子系统之:时钟源
6.一文总结linux的clk子系统
简单了解Linux系统中clock命令的使用方法
clock 命令:设置或者显示硬件时间的近似值必要参数
--adjust 自动调整硬件时钟时间
--debug 运行时,输出详细的钟源处理过程
--directisa 不通过设备文件/etc/rtc,直接对硬件时钟进行存取
--getepoch 输出硬件时钟的钟源数值到标准输出
--hctosys 时钟同步,使系统时钟和硬件时钟同步
--se--date 设置硬件时间
--show 显示硬件时钟到标准输出
--systohc 系统时间写入硬件时钟
--test 进行测试
--utc 将硬件时钟的钟源大英雄选股源码时间设置为UTC
选择参数
-setepoch-epoch=年份 设置硬件时钟的年份
--version 显示版本信息
例:
复制代码
代码如下:
[root@localhost www]# clock #显示硬件时钟时间年月日 星期六 时分秒 -0. seconds
复制代码
代码如下:
[root@localhost www]# clock --utc #显示utc硬件时钟时间年月日 星期六 时分秒 -0. seconds
复制代码
代码如下:
[root@localhost www]# clock --set --date="// ::" #设置硬件时钟时间复制代码
代码如下:
[root@localhost www]# clock年月日 星期六 时分秒 -0. seconds
Linux驱动开发头文件剖析(二十四):<linux/ktime.h>、<linux/timekeeping.h>、钟源<linux/timekeeping.h>
ktime.h
定义了内核时间相关的钟源数据结构和函数,核心是钟源ktime_t,它表示纳秒级内核时间,钟源不随系统时钟变化。钟源ktime.h还包含用于内核时间操作的钟源宏和函数。
ktime.h是钟源timer.h的一部分,对驱动开发中使用定时器至关重要。钟源
ktime.h内含ktime_get、钟源ktime_set等函数,用于获取和设置时间值。
对比另一个用于一般时间操作的头文件,ktime.h更多关注内核时间。
ktime_t本质为s类型,ktime_set用于将秒数和纳秒数转换为ktime_t时间值。
ktime_add_ns和ktime_sub_ns用于对ktime_t时间变量进行加减操作。
timespec_to_ktime和ktime_to_timespec用于结构体转换。
ktime_compare用于比较ktime_t大小。
ktime_after和ktime_before用于比较时间点。
ktime_divns函数用于ktime_t时间除以纳秒值。
ktime_to_us和ktime_to_ms将时间值转换为微秒和毫秒。
ktime_us_delta和ktime_ms_delta用于时间差计算。
ktime_add_safe安全相加ktime_t值。
ktime_to_timespec_cond进行转换并返回成功标志。
ns_to_ktime和ms_to_ktime进行单位转换。
timekeeping.h
时间管理相关的头文件,涉及系统、真实、pyrup源码启动、TAI时间等操作,包括大量函数声明。
timekeeping_init初始化时间管理机制。
timekeeping_suspended标志表示时间管理状态。
update_process_times更新进程时间统计信息。
xtime_update更新全局系统时间。
do_settimeofday设置系统时间。
do_sys_settimeofday设置系统时间并处理时区。
ktime_get_resolution_ns获取系统时钟分辨率。
ktime_get_real获取真实时间。
ktime_get_coarse_real获取低精度真实时间。
do_settimeofday和do_sys_settimeofday用于时间设置。
系统时间相关函数如ktime_get_boottime和ktime_get_clocktai。
ktime_get_coarse用于低精度时间获取。
ktime_get_coarse_ns等函数用于纳秒级时间获取。
ktime_mono_to_real将单调时间转换为真实时间。
ktime_get_ns等函数用于系统时间、真实时间等纳秒级获取。
ktime_get_boottime_ts和ktime_get_coarse_boottime_ts用于获取启动时间。
ktime_get_boottime_seconds获取秒级启动时间。
ktime_get_clocktai_ts和ktime_get_coarse_clocktai_ts用于获取TAI时间。
ktime_get_clocktai_seconds获取秒级TAI时间。
ktime_timestamps定义时间戳字段。
system_time_snapshot和system_device_crosststamp定义系统时间快照和设备交叉时间戳。
system_counterval_t用于系统计数器值。
get_device_system_crosststamp获取设备系统交叉时间戳。
ktime_get_snapshot和ktime_get_fast_timestamps用于获取系统时间戳。
persistent_clock_is_local标识持久性时钟是否本地。
read_persistent_clock和read_persistent_wall_and_boot_offset用于读取持久性时钟。
update_persistent_clock用于更新持久性时钟。
timekeeping.h
过时文件,内容已迁移至timekeeping.h。createzip源码仅包含一个函数。
用于返回当前时间。
时间管理头文件ktime.h和timekeeping.h提供了内核时间操作的全面支持,从时间结构定义到时间转换、时间比较直至时间设置和获取,满足驱动开发中对时间处理的需求。timekeeping.h作为过时文件,其内容已整合至timekeeping.h中,未来将被删除。
浅析 Linux RTC 实时时钟
在Linux系统中,实时时钟(RTC)是一种常见且至关重要的外设,用于记录时间信息,即使在电源断开后也能通过电池维持运行。许多芯片,如I.MX6ULL,内置了RTC功能,如SNVS,它包含低功耗外设,配合外接的.KHz晶振来提供精确的时间基准。RTC设备在Linux内核中被抽象为rtc_device结构,通过标准的字符设备驱动接口,如open、read、write和ioctl等进行操作。
RTC驱动程序是内核的核心组件,它定义了rtc_device的底层操作,包括rtc_class_ops结构,这个结构包含了所有RTC设备共用的操作函数,如read_time和set_time等。驱动程序的内核实现主要在drivers/rtc/rtc-dev.c文件中,通过ioctl函数,用户空间应用可以设置或读取时间,以及闹钟等信息。skypixel源码
在Linux内核中,RTC驱动的编写通常由芯片制造商提供,例如,对于I.MX6ULL的SNVS RTC驱动,可以通过DTSI文件(如imx6ull.dtsi)找到对应的驱动文件drivers/rtc/rtc-snvs.c。驱动程序中的关键函数如snvs_rtc_read_time,用于读取RTC时间,其内部调用rtc_read_lp_counter函数读取RTC计数值。
设置和查看RTC时间在Linux中非常直观。系统启动时,可以使用date命令查看当前时间;通过date -s可以设置系统时间;而将系统时间写入RTC中,则可以使用hwclock -w命令。总的来说,Linux的RTC功能为用户提供了一种可靠的时间管理手段。
在各种Linux系统的服务器上设置时间同步的方法
独立主机
rm -rf /etc/localtime
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime #修改时区到东8区。
date -R #查看的时区设置。
接下来调整系统时间与时间服务器同步
Debian系统安装NTP校时包:
代码如下:
apt-get install ntpdate #安装ntp
CentOS系统安装NTP校时包:
代码如下:
yum -y install ntpdate ntp #安装ntp
Ubuntu系统安装NTP校时包:
代码如下:
sudo apt-get install -y ntpdate ntp
修改/etc/ntp.conf
vi /etc/ntp.conf 就会看到以下内容:
代码如下:
server 0.centos.ntp.org
server time.windows.com
server time.nist.gov
这是默认的ntp同步服务器,大家可以自己改,全球ntp服务器地址:.pool.ntp.org //这中国的ntp服务器
server time-a.nist.gov
server time.windows.com
server time.nist.gov
然 后保存退出(vi退出的方法见:.pool.ntp.org #调试查看时间差异
ntpdate cn.pool.ntp.org #同步时间
date -R # 检查时间是否同步
修改 ntp 的配置文件
代码如下:
vi /etc/sysconfig/ntpd
SYNC_HWCLOCK=yes #同步独立主机的硬件时钟
#配置开机启动ntp服务,定期同步时间
chkconfig --levels ntpd on #启动ntp同步
/etc/init.d/ntpd start
XEN VPS
最好是安装ntp服务,这样可以解决vps在重启后时间不准的问题。有时候,依靠母鸡的硬件时钟,总是差七八分钟。实在没辙了。而已很多的web服务,如Google Authenticator等,如果时间不同步,会导致无法验证的地步,自然就网站都登陆不上了。
代码如下:
rm -rf /etc/localtime
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime #修改时区到东8区。
date -R #查看的时区设置。
接下来调整系统时间与时间服务器同步
Debian系统安装NTP校时包:
代码如下:
apt-get install ntpdate #安装ntp
CentOS系统安装NTP校时包:
代码如下:
yum -y install ntpdate ntp #安装ntp
Ubuntu系统安装NTP校时包:
代码如下:
sudo apt-get install -y ntpdate ntp
修改/etc/ntp.conf
vi /etc/ntp.conf 就会看到以下内容:
代码如下:
server 0.centos.ntp.org
server time.windows.com
server time.nist.gov
这是botvs源码默认的ntp同步服务器,大家可以自己改,全球ntp服务器地址:.pool.ntp.org //这中国的ntp服务器
server time-a.nist.gov
server time.windows.com
server time.nist.gov
然 后保存退出(vi退出的方法见:.pool.ntp.org #调试查看时间差异
ntpdate cn.pool.ntp.org #同步时间
date -R # 检查时间是否同步
#配置开机启动ntp服务,定期同步时间
chkconfig --levels ntpd on #启动ntp同步
/etc/init.d/ntpd start
#先设置XEN 的VPS使用和系统无关的时间模式
echo 1 /proc/sys/xen/independent_wallclock
然后尝试上面独立主机的配置方法即可。通过配置时间正确后,编辑系统配置文件,让配置永久生效。
代码如下:
vi /etc/sysctl.conf
xen.independent_wallclock=1 #在文件中增加并且保存
OpenVZ VPS
(Burst VPS 采用)
OpenVZ的VPS直接从物理机读取时间不允许对主机进行时间修改,你只需修改时区。我还没用过openvz vps,所以,不清楚能否用ntp服务不,可以试试安装ntp service 看。如果可以的话,请告诉我。
代码如下:
rm -rf /etc/localtime
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime #修改时区到东8区。
date -R #查看时间和时区
此时如果时间和时区都正确,配置成功,时间如果不对,需要联系主机服务商的技术支持,让他们把母鸡(物理机)时间同步,你的VPS时间就会正常。
Linux时间子系统之:时钟源
探索Linux内核的时间奥秘:时钟源的精密构建在Linux内核的精密世界里,时钟源扮演着时间基准的角色,它像一台隐形的精确计时器,通过硬件计数器确保我们与时间的精准同步。struct clocksource是这个系统的核心结构,其中的关键组件,如rating(精度,范围1-,数值越高,时间精度越优)、read回调,以及mult和shift,共同构建了这个时间测量的基石。rating值在1-范围内用于特殊用途,而-区间则为常规选择,read函数则是时间计数的窗口,mult和shift则是处理计数与频率F之间转换的魔力公式,内核采用位精度进行计算。
为了确保时间更新的稳定性和准确性,clocksource_register_hz在初始化时,通过一系列复杂的计算,确定了mult、shift的值,并为最大闲置时间设定了限制。同时,clocksource_register_scale负责性能排序和监控,而watchdog就像一个警惕的眼睛,一旦发现性能偏差超出阈值,就会标记该时钟源为不稳定状态。 在Linux启动的早期阶段,系统首先注册基于jiffies的clocksource,尽管其评级较低,但这正是基础中的基础。想要深入了解这个时钟源体系的更多细节,你可以在Linux内核源码分析学习群中发现丰富的资源。 深入理解clocksource的运作机制- clocksource_jiffies结构体,其设计为每个时钟周期提供1/HZ秒的精度,评级为1,是默认选择,除非有特定需求,否则系统会采用这个基础时钟源。
- init_jiffies_clocksource函数是初始化和注册这个时钟源的关键步骤,它确保了clocksource_jiffies的顺利启动。
- clocksource_default_clock提供了一种可选的默认时钟源,通常设置为clocksource_jiffies,但在特定场景下,可以被自定义以适应特定需求。
- clocksource_done_booting则在系统启动的后期,根据系统的实际情况,选择最合适的clocksource,并通知timekeeping系统进行适时的时间更新,确保系统时间的精准与一致性。
在这个看似简洁的时间管理背后,Linux内核的时钟源系统蕴含着精细的逻辑与优化,每个组件都在默默地守护着系统的稳定和准确性。深入理解这些细节,对于任何想要驾驭Linux内核的开发者来说,无疑是一把打开时间秘密的钥匙。
一文总结linux的clk子系统
Linux内核的CLK子系统是用于提供模块和底层时钟操作接口的关键组件。其设计旨在简化与复杂时钟树的交互,确保系统高效运行。
CLK子系统允许设备驱动程序通过特定API访问时钟信号,同时,硬件供应商需提供与底层硬件交互的接口。Linux内核中包含与CLK框架相关的源文件,提供各种时钟操作接口。
驱动程序中常用的API集成了原子和非原子操作,以确保时钟启用或停用的正确执行。这些操作可能需要CPU睡眠,特别是在启动依赖于长时间稳定状态的时钟,如PLL时钟时。因此,为了简化调用,内核封装了`clk_prepare_enable`和`clk_disable_unprepare`接口。
CLK子系统的核心数据结构包括`struct clk_notifier`、`struct clk_core`、`struct clk_ops`等,这些结构共同描述了时钟节点、核心操作和回调函数。它们提供了时钟设备的描述和控制机制,如分频、倍频、多路复用和组合时钟。
为了调试CLK子系统,开发者可以利用debugfs文件系统,通过命令查看系统中的时钟树结构。此外,内核提供了一个初始化函数`clk_debug_init`,用于创建调试目录或文件,便于在用户空间获取时钟信息。
在设计CLK驱动时,硬件供应商需实现对应的`struct clk_ops`回调函数,并调用`clk_register`注册到内核。这允许驱动程序方便地获取和操作特定的时钟资源。在驱动层,开发者可以使用各种API来获取和控制时钟节点,以实现对外设的控制。
时钟框架在Linux设备驱动设计中扮演着核心角色,几乎所有与外设相关的驱动实现都需要使用到CLK子系统。通过使用CLK子系统,Linux内核能够提供灵活、高效和安全的时钟管理机制,确保系统性能和稳定性。
Linux kernel中的CPU时钟管理-(3)
Linux kernel中的CPU时钟管理在rockchip的实现中展现出了清晰的结构和统一的API。主要包含时钟系统结构、初始化方式以及RK的具体实现。首先,时钟系统代码集中在drivers/clk/rockchip目录下,包含了CCF框架所需的关键功能如使能、复用和分频等,主体文件 clk-rk.c负责核心管理。
初始化过程中,kernel在驱动初始化阶段处理时钟,不同于CPU初始化,它在bootrom和U-Boot配置基本时钟后进行。CLK_OF_DECLARE宏用于声明初始化函数,通过它声明的函数负责配置时钟。RK的时钟初始化涉及cru和pmu,以cru为例,其核心初始化基于rockchip_clk_provider数据结构,通过rk.dtsi文件中的syscon寄存器来定义时钟控制。
PLL初始化是核心部分,芯片内置8个PLL,如LPLL、BPLL等,通过struct rockchip_pll_clock描述并固化配置。通过rockchip_clk_register_pll函数进行初始化,涉及 PLL的控制函数如频率设置等。复用、分频和GATE等控制功能也通过rockchip_clk_branch数据结构进行配置和注册。
其他时钟控制项包括一些高级设置,如上电后固定开启某些时钟,以及通过rk_cru_critical_clocks进行定制。最后,所有时钟注册后,会更新到RK的时钟信息表,以便于查询和管理。
Linux下实现服务器时间修改的方法linux修改服务器时间
Linux是一款广受欢迎的类Unix操作系统,它结合了强大的X Window系统和完善的Shell编程接口,同时支持网络及多用户同时访问。而服务器时间设置是Linux服务器上常见的操作之一,比如需要修改时间以便系统正常运行;本文将介绍Linux下实现服务器时间修改的方法。
一、查看系统当前的时间
1、登录Linux系统,在控制台输入date命令,查看系统当前的时间;
[root@localhost ~]# date
Thu Feb 7 :: CST
示例中当前时间是 年2月7日 时分秒。
二、修改服务器时间
1、使用date命令修改系统时间。如果要将系统时间设置为年月日,使用date –s “--”命令,如下:
[root@localhost ~]# date –s “--”
Tue Dec :: CST
2、使用hwclock命令可以修改硬件时钟,如将硬件时钟设为年月日,使用hwclock –w –set –date “--” 命令,如下:
[root@localhost ~]# hwclock –w –set –date “--”
Tue Dec :: CST
三、同步服务器时间
1、使用ntpdate命令,你可以从国家钟记号站时间服务器同步服务器时间,例如:
[root@localhost ~]#ntpdate 0.asia.pool.ntp.org
2、使用rdate命令,你可以从远程服务器同步服务器时间,例如:
[root@localhost ~]#rdate rdate -s time.nist.gov
以上就是Linux下实现服务器时间修改的方法,通过使用这些命令可以实现服务器时间修改,从而提高系统运行的稳定性和可用性。