form:
Linux系统的宏HZ的值一般在体系相关的目录下,例如arch/arm/include/asm/param.h下,代码如下:
/* -------------------------------------------------------------------- */
/*
* arch/arm/include/asm/param.h
*
* Copyright (C) 1995-1999 Russell King
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#ifndef __ASM_PARAM_H
#define __ASM_PARAM_H
#ifdef __KERNEL__
# define HZ CONFIG_HZ /* Internal kernel timer frequency */
# define USER_HZ 100 /* User interfaces are in "ticks" */
# define CLOCKS_PER_SEC (USER_HZ) /* like times() */
#else
# define HZ 100
#endif
#define EXEC_PAGESIZE 4096
#ifndef NOGROUP
#define NOGROUP (-1)
#endif
/* max length of hostname */
#define MAXHOSTNAMELEN 64
#endif
/* -------------------------------------------------------------------- */
一般在make menuconfig下面会有100、250、300、1000的默认配置值,但是其实这些值包含在kernel/timeconst.pl中,这是一个perl脚本:
/* -------------------------------------------------------------------- */
#!/usr/bin/perl
# -----------------------------------------------------------------------
#
# Copyright 2007-2008 rPath, Inc. - All Rights Reserved
#
# This file is part of the Linux kernel, and is made available under
# the terms of the GNU General Public License version 2 or (at your
# option) any later version; incorporated herein by reference.
#
# -----------------------------------------------------------------------
#
#
# Usage: timeconst.pl HZ > timeconst.h
#
# Precomputed values for systems without Math::BigInt
# Generated by:
# timeconst.pl --can 24 32 48 64 100 122 128 200 250 256 300 512 1000 1024 1200
%canned_values = (
24 => [
'0xa6aaaaab','0x2aaaaaa',26,
125,3,
'0xc49ba5e4','0x1fbe76c8b4',37,
3,125,
'0xa2c2aaab','0xaaaa',16,
125000,3,
'0xc9539b89','0x7fffbce4217d',47,
3,125000,
], 32 => [
'0xfa000000','0x6000000',27,
125,4,
'0x83126e98','0xfdf3b645a',36,
4,125,
'0xf4240000','0x0',17,
31250,1,
'0x8637bd06','0x3fff79c842fa',46,
1,31250,
], 48 => [
'0xa6aaaaab','0x6aaaaaa',27,
125,6,
'0xc49ba5e4','0xfdf3b645a',36,
6,125,
'0xa2c2aaab','0x15555',17,
62500,3,
'0xc9539b89','0x3fffbce4217d',46,
3,62500,
], 64 => [
'0xfa000000','0xe000000',28,
125,8,
'0x83126e98','0x7ef9db22d',35,
8,125,
'0xf4240000','0x0',18,
15625,1,
'0x8637bd06','0x1fff79c842fa',45,
1,15625,
], 100 => [
'0xa0000000','0x0',28,
10,1,
'0xcccccccd','0x733333333',35,
1,10,
'0x9c400000','0x0',18,
10000,1,
'0xd1b71759','0x1fff2e48e8a7',45,
1,10000,
], 122 => [
'0x8325c53f','0xfbcda3a',28,
500,61,
'0xf9db22d1','0x7fbe76c8b',35,
61,500,
'0x8012e2a0','0x3ef36',18,
500000,61,
'0xffda4053','0x1ffffbce4217',45,
61,500000,
], 128 => [
'0xfa000000','0x1e000000',29,
125,16,
'0x83126e98','0x3f7ced916',34,
16,125,
'0xf4240000','0x40000',19,
15625,2,
'0x8637bd06','0xfffbce4217d',44,
2,15625,
], 200 => [
'0xa0000000','0x0',29,
5,1,
'0xcccccccd','0x333333333',34,
1,5,
'0x9c400000','0x0',19,
5000,1,
'0xd1b71759','0xfff2e48e8a7',44,
1,5000,
], 250 => [
'0x80000000','0x0',29,
4,1,
'0x80000000','0x180000000',33,
1,4,
'0xfa000000','0x0',20,
4000,1,
'0x83126e98','0x7ff7ced9168',43,
1,4000,
], 256 => [
'0xfa000000','0x3e000000',30,
125,32,
'0x83126e98','0x1fbe76c8b',33,
32,125,
'0xf4240000','0xc0000',20,
15625,4,
'0x8637bd06','0x7ffde7210be',43,
4,15625,
], 300 => [
'0xd5555556','0x2aaaaaaa',30,
10,3,
'0x9999999a','0x1cccccccc',33,
3,10,
'0xd0555556','0xaaaaa',20,
10000,3,
'0x9d495183','0x7ffcb923a29',43,
3,10000,
], 512 => [
'0xfa000000','0x7e000000',31,
125,64,
'0x83126e98','0xfdf3b645',32,
64,125,
'0xf4240000','0x1c0000',21,
15625,8,
'0x8637bd06','0x3ffef39085f',42,
8,15625,
], 1000 => [
'0x80000000','0x0',31,
1,1,
'0x80000000','0x0',31,
1,1,
'0xfa000000','0x0',22,
1000,1,
'0x83126e98','0x1ff7ced9168',41,
1,1000,
], 1024 => [
'0xfa000000','0xfe000000',32,
125,128,
'0x83126e98','0x7ef9db22',31,
128,125,
'0xf4240000','0x3c0000',22,
15625,16,
'0x8637bd06','0x1fff79c842f',41,
16,15625,
], 1200 => [
'0xd5555556','0xd5555555',32,
5,6,
'0x9999999a','0x66666666',31,
6,5,
'0xd0555556','0x2aaaaa',22,
2500,3,
'0x9d495183','0x1ffcb923a29',41,
3,2500,
]
);
/* -------------------------------------------------------------------- */
上面红色部分简绍了使用方法,有的时候,修改了HZ的值,可能要手动运行一下,例如,修改HZ=512,则可以在kernel目录下: timeconst.pl 512 > timeconst.h
也就是说kernel目录下的timeconst.h是动态生成的
/* -------------------------------------------------------------------- */
/* Automatically generated by kernel/timeconst.pl */
/* Conversion constants for HZ == 512 */
#ifndef KERNEL_TIMECONST_H
#define KERNEL_TIMECONST_H
#include <linux/param.h>
#include <linux/types.h>
#if HZ != 512
#error "kernel/timeconst.h has the wrong HZ value!"
#endif
#define HZ_TO_MSEC_MUL32 U64_C(0xfa000000)
#define HZ_TO_MSEC_ADJ32 U64_C(0x7e000000)
#define HZ_TO_MSEC_SHR32 31
#define HZ_TO_MSEC_NUM U64_C(125)
#define HZ_TO_MSEC_DEN U64_C(64)
#define MSEC_TO_HZ_MUL32 U64_C(0x83126e98)
#define MSEC_TO_HZ_ADJ32 U64_C(0xfdf3b645)
#define MSEC_TO_HZ_SHR32 32
#define MSEC_TO_HZ_NUM U64_C(64)
#define MSEC_TO_HZ_DEN U64_C(125)
#define HZ_TO_USEC_MUL32 U64_C(0xf4240000)
#define HZ_TO_USEC_ADJ32 U64_C(0x1c0000)
#define HZ_TO_USEC_SHR32 21
#define HZ_TO_USEC_NUM U64_C(15625)
#define HZ_TO_USEC_DEN U64_C(8)
#define USEC_TO_HZ_MUL32 U64_C(0x8637bd06)
#define USEC_TO_HZ_ADJ32 U64_C(0x3ffef39085f)
#define USEC_TO_HZ_SHR32 42
#define USEC_TO_HZ_NUM U64_C(8)
#define USEC_TO_HZ_DEN U64_C(15625)
#endif /* KERNEL_TIMECONST_H */
/* -------------------------------------------------------------------- */
因此,下次如果修改了HZ的值,而这个值是perl脚本支持的,但却报类似的错:
In file included from kernel/time.c:45:
kernel/timeconst.h:11:2: error: #error "kernel/timeconst.h has the wrong HZ value!"
make[1]: *** [kernel/time.o] Error 1
make: *** [kernel] Error 2
make: *** Waiting for unfinished jobs…
那就要手动执行以下这个perl脚本了。而对于这个HZ值与您的系统的性能关系,还需要仔细斟酌,我目前的项目也遇到了类似的问题,可能有关,继续研究。
出现问题时:在kernel目录下: ./timeconst.pl XX > timeconst.h来改变HZ的值,而这个值可能是:24 32 48 64 100 122 128 200 250 256 300 512 1000 1024 1200。一个个试,尝试到能成功编译为止。在kernel下 timeconst.h。是生成的,每次不同!