关闭

ARM Linux 的timezoneinfo 数据库的移植

标签: armtimezone
617人阅读 评论(0) 收藏 举报
分类:

Linux内核在启动时,将RTC的时间读到系统xtime数据结构中,作为系统时间。在系统关闭时,又将系统时间写入RTC时间。
通常地,Linux内核一般只使用UTC时间,因为Linux内核对时区识别没有相应的处理,它只会将上层传入的关于时区的数据结构转换为UTC时间,LCT时间在内核被设置时,都先转化为UTC时间,再写入xtime数据结构中。
既然内核不负责时区的信息的记录和处理,那么,时区信息的处理在那里呢? GLIBC,对,就是这个C库。
glibc用三个全局变量(用户可以访问)来记录时区信息:*tzname,daylight,timezone*。但是变量并不能永久保存时区信息,因此glic需要有一些时区的数据库保存在系统固定的路径,当要获取关于时区信息的时候,glibc直接从这些数据库文件获取相应的时区和时区转换规则。将UTC时间转换为本地时间。【总之,时区信息的处理是在glibc中,时区数据保存在文件系统中】为了更精确的描述这一点,我们列举date命令来说明这一点。

date 命令会先调用gettimeofday()来获取UTC时间; 然后调用localtime()这个函数将UTC时间转换为本地时间;
但是,在本地时间转换过程中,glibc需要获取本地的时区信息,然后通过时区信息将UTC转换为LCT。
glibc中,这些时区信息的默认保存路径为/user/local/etc/zoneinfo。时区文件默认为localtime。当然用户个以通过TZ和TZDIR的环境变量来修改时区数据库的保存位置。如果时区信息数据库不存在,那么localtime将不会转化UTC到LCT。

在很多嵌入式文件系统中,关于时区信息的数据库并没有移植上去,所以就没办法支持时区的转换。根据上面的描述,glibc总是按照这样的方式读取时区数据库,但如果不存在,就不转换时区时间。为了进行时区转换,我们需要移植timezoneinfo数据库:
我们按照下面的步骤移植:

1.下载tzdata和tzcode:

该软件的下载地址如下: https://www.iana.org/time-zones 下载: tzdata2015g.tar.gz和
tzcode2015g.tar.gz。 tzdata是时区信息的数据库,tzcode是时区的一些命令和用于生成时区数据库的工具。

tz数据库的生成需要一个命令,其为zic。zic是一个二进制文件,我们编译生成的能在target上运行的二进制文件,用该二进制文件生成tz数据库。

2. 解压,修改makefile:
分别将tzdata和tzcode解压,放到通通一个文件中,然后修改makefile:
主要修改:

cc=     arm-linux-gnueabihf-gcc  ##换成交叉编译器即可;
AR=     arm-linux-gnueabihf-ar

其他都不用修改,

3. make 阶段:
按照第二步方式修改,基本没有什么编译错误,很快通过。

3.make install 阶段:
我先编译了x86的tzdata,然后运行了make install命令,看它都作了什么,最后按照同样的步骤在板子上生成了相应的文件。
值得注意的是,这一阶段,主要用我们编译生成的zic命令在target板上进行安装:

./zic  -y ./yearistype -d /usr/local/etc/zoneinfo -L /dev/null africa antarctica asia australasia europe northamerica southamerica pacificnew etcetera backward systemv factory
rm -fr /usr/local/etc/zoneinfo-posix

ln -s zoneinfo /usr/local/etc/zoneinfo-posix || ./zic  -y ./yearistype -d /usr/local/etc/zoneinfo-posix -L /dev/null africa antarctica asia australasia europe northamerica southamerica pacificnew etcetera backward systemv factory


./zic  -y ./yearistype -d /usr/local/etc/zoneinfo-leaps -L leapseconds africa antarctica asia australasia europe northamerica southamerica pacificnew etcetera backward systemv factory
##./zic  -y ./yearistype -d /usr/local/123/etc/zoneinfo -l GMT -p Asia/Shanghai
cp -f iso3166.tab zone1970.tab zone.tab /usr/local/etc/zoneinfo/.
cp tzselect zic zdump /usr/bin/.

安装OK,timezoninfo的数据库便生成;

4.在shell终端中导出环境变量(也可以添加到profile中):

export TZDIR="/usr/local/etc/zoneinfo"
export TZ="Asia/Shanghai"

改变时区,输入date命令验证即可!

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:13703次
    • 积分:455
    • 等级:
    • 排名:千里之外
    • 原创:27篇
    • 转载:18篇
    • 译文:1篇
    • 评论:5条
    文章分类
    最新评论