kk Blog —— 通用基础


date [-d @int|str] [+%s|"+%F %T"]
netstat -ltunp
sar -n DEV 1

abrt 应用程序core dump

一、安装

1
yum install abrt

二、设置

1
2
ulimit -c
ulimit -c unlimited

三、常见错误

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
1、ERROR
$ tail -f /var/log/message
abrtd: Package 'XXX' isn't signed with proper key

$ vim /etc/abrt/abrt.conf
OR
$ vim /etc/abrt/abrt-action-save-package-data.conf
OpenGPGCheck = no

2、ERROR
tail -f /var/log/message
abrtd: Duplicate: UUID

Whenever a problem is detected, ABRT compares it with all 
existing problem data and determines whether that same problem 
has been recorded. If it has been, the existing problem data 
is updated and the most recent (duplicate) problem is not recorded again.

3、
ProcessUnpackaged = <yes/no>
This directive tells ABRT whether to process crashes 
in executables that do not belong to any package. 

abrt

http://docs.fedoraproject.org/en-US/Fedora/14/html/Deployment_Guide/configuring.html
https://fedorahosted.org/releases/a/b/abrt/Deployment_Guide.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
21.6. Configuring ABRT

ABRT's main configuration file is /etc/abrt/abrt.conf. 
ABRT plugins can be configured through their config files, 
located in the /etc/abrt/plugins/ directory.

After changing and saving the abrt.conf configuration file, 
you must restart the abrtd daemon—as root—for the new settings to take effect:

~]# service abrtd restart

The following configuration directives are currently supported in /etc/abrt/abrt.conf.

[ Common ] Section DirectivesOpenGPGCheck = <yes/no>

Setting the OpenGPGCheck directive to yes (the default setting) tells 
ABRT to only analyze and handle crashes in applications provided by 
packages which are signed by the GPG keys whose locations are listed 
in the /etc/abrt/gpg_keys file. Setting OpenGPGCheck to no tells 
ABRT to catch crashes in all programs.

BlackList = nspluginwrapper, valgrind, strace, avant-window-navigator, [<additional_packages> ]

Crashes in packages and binaries listed after the BlackList directive 
will not be handled by ABRT. If you want ABRT to ignore other packages 
and binaries, list them here separated by commas.

ProcessUnpackaged = <yes/no>

This directive tells ABRT whether to process crashes in executables 
that do not belong to any package.    

BlackListedPaths = /usr/share/doc/*, */example*

Crashes in executables in these paths will be ignored by ABRT.

Database = SQLite3

This directive instructs ABRT to store its crash data in the SQLite3 database. 
Other databases are not currently supported. However, 
ABRT's plugin architecture allows for future support for alternative databases.

#WatchCrashdumpArchiveDir = /var/spool/abrt-upload/

This directive is commented out by default. 
Enable (uncomment) it if you want abrtd to auto-unpack crashdump tarballs 
which appear in the specified directory — in this case /var/spool/abrt-upload/ — 
(for example, uploaded via ftp, scp, etc.). You must ensure that whatever 
directory you specify in this directive exists and is writable for abrtd. 
abrtd will not create it automatically.

MaxCrashReportsSize = <size_in_megabytes>

This option sets the amount of storage space, in megabytes, 
used by ABRT to store all crash information from all users. 
The default setting is 1000 MB. Once the quota specified here has been met, 
ABRT will continue catching crashes, and in order to make room for the new crash dumps, 
it will delete the oldest and largest ones.

ActionsAndReporters = SOSreport, [<additional_plugins> ]

This option tells ABRT to run the specified plugin(s) immediately 
after a crash is detected and saved. For example, the SOSreport plugin runs 
the sosreport tool which adds the data collected by it to the created crash dump. 
You can turn this behavior off by commenting out this line. For further fine-tuning,
 you can add SOSreport (or any other specified plugin) to either the CCpp or 
Python options to make ABRT run sosreport (or any other specified plugin) after 
any C and C++ or Python applications crash, respectively. For more information 
on various Action and Reporter plugins, refer to Section 21.3, “ ABRT Plugins”

[ AnalyzerActionsAndReporters ] Section Directives

This section allows you to associate certain analyzer actions and reporter 
actions to run when ABRT catches kernel oopses or crashes in C, C++ or Python programs. 
The actions and reporters specified in any of the directives below will run only 
if you run abrt-gui or abrt-cli and report the crash that occurred. 
If you do not specify any actions and reporters in these directives, 
you will not be able to report a crash via abrt-gui or abrt-cli. 
The order of actions and reporters is important. Commenting out a directive, 
will cause ABRT not to catch the crashes associated with that directive. 
For example, commenting out the Kerneloops line will cause ABRT not to catch kernel oopses.

Kerneloops = RHTSupport, Logger

This directive specifies that, for kernel oopses, 
both the RHTSupport and Logger reporters will be run.

CCpp = RHTSupport, Logger

This directive specifies that, when C or C++ program crashes occur, 
both the RHTSupport and Logger reporters will be run.

Python = RHTSupport, Logger

This directive specifies that, when Python program crashes occur, 
both the RHTSupport and Logger reporters will be run.

Each of these destinations' details can be specified in the corresponding 
plugins/*.conf file. For example, plugins/RHTSupport.conf specifies 
which RHTSupport URL to use (set to https://api.access.redhat.com/rs by default), 
the user's login name, password for logging in to the RHTSupport site, 
etc. All these options can also be configured through the abrt-gui application
 (for more information on plugin configuration refer to Section 21.3, “ ABRT Plugins”).

[ Cron ] Section Directives <time> = <action_to_run>

The [ Cron ] section of abrt.conf allows you to specify the exact time, 
or elapsed amount of time between, when ABRT should run a certain action, 
such as scanning for kernel oopses or performing file transfers. 
You can list further actions to run by appending them to the end of this section.

Example 21.1. [ Cron ] section of /etc/abrt/abrt.conf

# Which Action plugins to run repeatedly
[ Cron ]
# h:m - at h:m
# s - every s seconds
120 = KerneloopsScanner
#02:00 = FileTransfer


The format for an entry is either 
<time_in_seconds> = <action_to_run> or <hh:mm> = <action_to_run> , 
where hh (hour) is in the range 00-23 
(all hours less than 10 should be zero-filled, i.e. preceded by a 0), 
and mm (minute) is 00-59, zero-filled likewise. 

centos系统各种包下载

2024-05-08 更新

https://koji.mbox.centos.org/koji/packageinfo?packageID=866

https://git.centos.org/rpms/kernel/releases


https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git

https://buildlogs.centos.org/c7.2009.u.x86_64/kernel/


0 centos 系統原包

爬取el7所有版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import re
import urllib

def getHtml(url):
	page = urllib.urlopen(url)
	html = page.read()
	return html

def getHref(html, reg):
	reg = re.compile(reg)
	reslist = re.findall(reg, html)
	return reslist

URL = "https://buildlogs.centos.org/"
html = getHtml(URL)
c7Href = getHref(html, r'href="(c7.+)/"')
for ver in c7Href:
	if '.a32' in ver or '.a64' in ver or '.p32' in ver or '.i386' in ver:
		continue
	url1 = URL + ver + "/kernel/"
	print url1
	html = getHtml(url1)
	dateHref = getHref(html, r'href="(20............)/"')
	for date in dateHref:
		url2 = url1 + date + "/"
		html = getHtml(url2)
		kernelHref = getHref(html, r'href="(.+el7.x86_64)/"')
		for kver in kernelHref:
			print url2 + kver

https://buildlogs.centos.org/c7-dotnet/kernel/
https://buildlogs.centos.org/c7-epel/kernel/
https://buildlogs.centos.org/c7-extras.x86_64/kernel/
https://buildlogs.centos.org/c7-plus.x86_64/kernel/
https://buildlogs.centos.org/c7-plus/kernel/
https://buildlogs.centos.org/c7-rt/kernel/
https://buildlogs.centos.org/c7-updates/kernel/
https://buildlogs.centos.org/c7.00.02/kernel/
https://buildlogs.centos.org/c7.00.02/kernel/20140529190808/3.10.0-121.el7.x86_64
https://buildlogs.centos.org/c7.00.03/kernel/
https://buildlogs.centos.org/c7.00.03/kernel/20140609184350/3.10.0-121.el7.x86_64
https://buildlogs.centos.org/c7.00.04/kernel/
https://buildlogs.centos.org/c7.00.04/kernel/20140612172658/3.10.0-123.el7.x86_64
https://buildlogs.centos.org/c7.00.04/kernel/20140619231033/3.10.0-123.el7.x86_64
https://buildlogs.centos.org/c7.01.00/kernel/
https://buildlogs.centos.org/c7.01.00/kernel/20150306113403/3.10.0-229.el7.x86_64
https://buildlogs.centos.org/c7.01.u/kernel/
https://buildlogs.centos.org/c7.01.u/kernel/20150327030147/3.10.0-229.1.2.el7.x86_64
https://buildlogs.centos.org/c7.01.u/kernel/20150513100324/3.10.0-229.4.2.el7.x86_64
https://buildlogs.centos.org/c7.01.u/kernel/20150623220331/3.10.0-229.7.2.el7.x86_64
https://buildlogs.centos.org/c7.01.u/kernel/20150806010338/3.10.0-229.11.1.el7.x86_64
https://buildlogs.centos.org/c7.01.u/kernel/20150915124206/3.10.0-229.14.1.el7.x86_64
https://buildlogs.centos.org/c7.01.u/kernel/20150915150313/3.10.0-229.14.1.el7.x86_64
https://buildlogs.centos.org/c7.01.u/kernel/20151103190728/3.10.0-229.20.1.el7.x86_64
https://buildlogs.centos.org/c7.1511.00/kernel/
https://buildlogs.centos.org/c7.1511.00/kernel/20151119220809/3.10.0-327.el7.x86_64
https://buildlogs.centos.org/c7.1511.exp/kernel/
https://buildlogs.centos.org/c7.1511.exp/kernel/20151016161452/4.2.0-1.centos.el7.x86_64
https://buildlogs.centos.org/c7.1511.exp/kernel/20151016163253/4.2.0-1.centos.el7.x86_64
https://buildlogs.centos.org/c7.1511.exp/kernel/20151016164628/4.2.0-1.centos.el7.x86_64
https://buildlogs.centos.org/c7.1511.exp/kernel/20160321183722/4.3.3-200.el7.x86_64
https://buildlogs.centos.org/c7.1511.exp/kernel/20160324145107/4.4.6-301.el7.x86_64
https://buildlogs.centos.org/c7.1511.exp/kernel/20160324192831/4.4.6-301.el7.x86_64
https://buildlogs.centos.org/c7.1511.exp/kernel/20160325232209/4.4.6-301.el7.x86_64
https://buildlogs.centos.org/c7.1511.exp/kernel/20160415133359/4.4.7-301.el7.x86_64
https://buildlogs.centos.org/c7.1511.exp/kernel/20160506113850/4.4.9-301.el7.x86_64
https://buildlogs.centos.org/c7.1511.exp/kernel/20160601130532/4.4.11-301.el7.x86_64
https://buildlogs.centos.org/c7.1511.exp/kernel/20160602142804/4.4.12-301.el7.x86_64
https://buildlogs.centos.org/c7.1511.exp/kernel/20160608070903/4.4.13-301.el7.x86_64
https://buildlogs.centos.org/c7.1511.exp/kernel/20160620154312/4.4.13-303.el7.x86_64
https://buildlogs.centos.org/c7.1511.exp/kernel/20160625132228/4.4.14-201.el7.x86_64
https://buildlogs.centos.org/c7.1511.exp/kernel/20160625133615/4.4.14-201.el7.x86_64
https://buildlogs.centos.org/c7.1511.exp/kernel/20160815150500/4.4.17-201.el7.x86_64
https://buildlogs.centos.org/c7.1511.exp/kernel/20160815161333/4.4.17-201.el7.x86_64
https://buildlogs.centos.org/c7.1511.exp/kernel/20160817141019/4.4.18-201.el7.x86_64
https://buildlogs.centos.org/c7.1511.u/kernel/
https://buildlogs.centos.org/c7.1511.u/kernel/20151209124337/3.10.0-327.3.1.el7.x86_64
https://buildlogs.centos.org/c7.1511.u/kernel/20151209140627/3.10.0-327.3.1.el7.x86_64
https://buildlogs.centos.org/c7.1511.u/kernel/20160105150501/3.10.0-327.4.4.el7.x86_64
https://buildlogs.centos.org/c7.1511.u/kernel/20160125220424/3.10.0-327.4.5.el7.x86_64
https://buildlogs.centos.org/c7.1511.u/kernel/20160217024115/3.10.0-327.10.1.el7.x86_64
https://buildlogs.centos.org/c7.1511.u/kernel/20160331160950/3.10.0-327.13.1.el7.x86_64
https://buildlogs.centos.org/c7.1511.u/kernel/20160512110105/3.10.0-327.18.2.el7.x86_64
https://buildlogs.centos.org/c7.1511.u/kernel/20160623161521/3.10.0-327.22.2.el7.x86_64
https://buildlogs.centos.org/c7.1511.u/kernel/20160802204906/3.10.0-327.28.2.el7.x86_64
https://buildlogs.centos.org/c7.1511.u/kernel/20160818163946/3.10.0-327.28.3.el7.x86_64
https://buildlogs.centos.org/c7.1511.u/kernel/20160918123639/3.10.0-327.36.1.el7.x86_64
https://buildlogs.centos.org/c7.1511.u/kernel/20161010214658/3.10.0-327.36.2.el7.x86_64
https://buildlogs.centos.org/c7.1511.u/kernel/20161010215511/3.10.0-327.36.2.el7.x86_64
https://buildlogs.centos.org/c7.1511.u/kernel/20161024152721/3.10.0-327.36.3.el7.x86_64
https://buildlogs.centos.org/c7.1611.00/kernel/
https://buildlogs.centos.org/c7.1611.01/kernel/
https://buildlogs.centos.org/c7.1611.01/kernel/20161117160457/3.10.0-514.el7.x86_64
https://buildlogs.centos.org/c7.1611.exp/kernel/
https://buildlogs.centos.org/c7.1611.exp/kernel/20171018140113/4.9.57-204.el7.x86_64
https://buildlogs.centos.org/c7.1611.exp/kernel/20171120151900/4.9.63-204.el7.x86_64
https://buildlogs.centos.org/c7.1611.u/kernel/
https://buildlogs.centos.org/c7.1611.u/kernel/20161207134106/3.10.0-514.2.2.el7.x86_64
https://buildlogs.centos.org/c7.1611.u/kernel/20170118010633/3.10.0-514.6.1.el7.x86_64
https://buildlogs.centos.org/c7.1611.u/kernel/20170223034721/3.10.0-514.2.2.el7.x86_64
https://buildlogs.centos.org/c7.1611.u/kernel/20170303004149/3.10.0-514.10.2.el7.x86_64
https://buildlogs.centos.org/c7.1611.u/kernel/20170412150118/3.10.0-514.16.1.el7.x86_64
https://buildlogs.centos.org/c7.1611.u/kernel/20170525170145/3.10.0-514.21.1.el7.x86_64
https://buildlogs.centos.org/c7.1611.u/kernel/20170620122143/3.10.0-514.21.2.el7.x86_64
https://buildlogs.centos.org/c7.1611.u/kernel/20170620132051/3.10.0-514.21.2.el7.x86_64
https://buildlogs.centos.org/c7.1611.u/kernel/20170628200657/3.10.0-514.26.1.el7.x86_64
https://buildlogs.centos.org/c7.1611.u/kernel/20170704132018/3.10.0-514.26.2.el7.x86_64
https://buildlogs.centos.org/c7.1708.00/kernel/
https://buildlogs.centos.org/c7.1708.00/kernel/20170822030048/3.10.0-693.el7.x86_64
https://buildlogs.centos.org/c7.1708.exp.x86_64/kernel/
https://buildlogs.centos.org/c7.1708.u.x86_64/kernel/
https://buildlogs.centos.org/c7.1708.u.x86_64/kernel/20170823130501/3.10.0-693.1.1.el7.x86_64
https://buildlogs.centos.org/c7.1708.u.x86_64/kernel/20170906160426/3.10.0-693.2.1.el7.x86_64
https://buildlogs.centos.org/c7.1708.u.x86_64/kernel/20170913001530/3.10.0-693.2.2.el7.x86_64
https://buildlogs.centos.org/c7.1708.u.x86_64/kernel/20171023132245/3.10.0-693.5.2.el7.x86_64
https://buildlogs.centos.org/c7.1708.u.x86_64/kernel/20171204203818/3.10.0-693.11.1.el7.x86_64
https://buildlogs.centos.org/c7.1708.u/kernel/
https://buildlogs.centos.org/c7.1708.u/kernel/20170823130501/3.10.0-693.1.1.el7.x86_64
https://buildlogs.centos.org/c7.1708.u/kernel/20170906160426/3.10.0-693.2.1.el7.x86_64
https://buildlogs.centos.org/c7.1708.u/kernel/20170913001530/3.10.0-693.2.2.el7.x86_64
https://buildlogs.centos.org/c7.1708.u/kernel/20171023132245/3.10.0-693.5.2.el7.x86_64
https://buildlogs.centos.org/c7.1708.u/kernel/20171204203818/3.10.0-693.11.1.el7.x86_64
https://buildlogs.centos.org/c7.common/kernel/

1、系统包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
http://mirror.centos.org/centos/6.5/os/x86_64/Packages/
国内地址
http://isoredirect.centos.org/centos/6.5/isos/x86_64/  
ex:
	http://mirror.symnds.com/distributions/CentOS-vault/5.5/isos/x86_64/  
	http://mirrors.stuhome.net/centos/6.5/isos/x86_64/  
	http://mirrors.neusoft.edu.cn/centos/6.5/isos/x86_64/
	http://mirrors.163.com/centos/6.5/isos/x86_64/
	http://mirrors.hust.edu.cn/centos/6.5/isos/x86_64/
	http://centos.ustc.edu.cn/centos/6.5/isos/x86_64/
	http://mirror.bit.edu.cn/centos/6.5/isos/x86_64/
	http://mirrors.tuna.tsinghua.edu.cn/centos/6.5/isos/x86_64/
	http://mirrors.grandcloud.cn/centos/6.5/isos/x86_64/
	http://mirror.neu.edu.cn/centos/6.5/isos/x86_64/
	http://mirrors.btte.net/centos/6.5/isos/x86_64/
	http://mirrors.hustunique.com/centos/6.5/isos/x86_64/
	http://mirrors.aliyun.com/centos/6.5/isos/x86_64/

2、debuginfo包:

1
http://debuginfo.centos.org/6/x86_64/

3、src.prm包

1
2
3
4
ftp://ftp.redhat.com/pub/redhat/linux/enterprise
ftp://ftp.redhat.com/pub/redhat/linux/enterprise/5Client/en/os/SRPMS/kexec-tools-1.102pre-154.el5.src.rpm
ftp://ftp.redhat.com/pub/redhat/linux/enterprise/5Client/en/os/SRPMS/kexec-tools-1.102pre-164.el5.src.rpm
http://vault.centos.org/5.11/os/SRPMS/kexec-tools-1.102pre-165.el5.src.rpm

4、各种包

1
pkgs/org

tsc时钟初始化

tsc时钟源初始化
1
2
3
4
5
6
7
8
9
//    调用路径:time_init->tsc_init
//    函数任务:
//        1.矫正tsc,获取tsc频率,设置cpu频率等于tsc频率
//        2.初始化基于tsc的延迟函数
//        3.检查tsc的特性
//            3.1 tsc之间是否同步
//                3.1.1 如果tsc之间不同步,标记tsc不稳定,设置rating=0
//            3.2 tsc是否稳定
//        4.注册tsc时钟源设备
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void __init tsc_init(void)
{
	u64 lpj;
	int cpu;

	//矫正tsc,获取tsc频率
	tsc_khz = x86_platform.calibrate_tsc();
	//cpu频率等于tsc频率
	cpu_khz = tsc_khz;
	//计算辅助cycle到ns转换的辅助参数scale
	for_each_possible_cpu(cpu)
	    set_cyc2ns_scale(cpu_khz, cpu);
	//初始化基于tsc的延迟函数,ndely,udelay,mdelay
	use_tsc_delay();
	//检查cpu之间tsc是否同步
	if (unsynchronized_tsc())
	    mark_tsc_unstable("TSCs unsynchronized");
	//检查tsc是否可靠
	check_system_tsc_reliable();
	//注册tsc时钟源设备
	init_tsc_clocksource();
}
延迟函数ndelay,udelay,mdelay

通过tsc实现短延迟

1
2
3
4
5
void use_tsc_delay(void)
{
	//通过tsc进行短延迟
	delay_fn = delay_tsc;
}
tsc延迟函数

通过rep_nop实现轮询时的短延迟,查询tsc时禁止内核抢占,确保不受不同cpu间影响。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
static void delay_tsc(unsigned long loops)
{
	unsigned long bclock, now;
	int cpu;
	//短延迟,禁止内核抢占
	preempt_disable();
	//delay_tsc当前运行的cpu
	cpu = smp_processor_id();
	rdtsc_barrier();
	rdtscl(bclock);
	for (;;) {
	    rdtsc_barrier();
	    rdtscl(now);
	    if ((now - bclock) >= loops)
	        break;
	    //允许rt策略进程运行
	    preempt_enable();
	    //空操作
	    rep_nop();
	    preempt_disable();

	    //delay_tsc在运行过程中,可能会迁移到不同的cpu
	    //tsc
	    if (unlikely(cpu != smp_processor_id())) {
	        loops -= (now - bclock);
	        cpu = smp_processor_id();
	        rdtsc_barrier();
	        rdtscl(bclock);
	    }
	}
	preempt_enable();
}
检查tsc是否同步
1
2
3
4
5
6
//    调用路径:tsc_init->unsynchronized_tsc
//    检查办法:
//        1.如果apic在多块板卡,则tsc不同步
//        2.如果cpuid显示具有稳定的tsc,则tsc同步
//        3.intel cpu的tsc都是同步的
//        4.默认其他品牌的多核的tsc不同步
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
__cpuinit int unsynchronized_tsc(void)
{
	//如果apic分布在多块板卡上,tsc可能不同步
	if (apic_is_clustered_box())
	    return 1;
	//cpu具有稳定的tsc
	if (boot_cpu_has(X86_FEATURE_CONSTANT_TSC))
	    return 0;
	//intel cpu的tsc都是同步的
	if (boot_cpu_data.x86_vendor != X86_VENDOR_INTEL) {
	    //非intel cpu,如果cpu个数>1,则认为不同步
	    if (num_possible_cpus() > 1)
	        tsc_unstable = 1;
	}
	return tsc_unstable;
}
标记tsc不稳定
1
2
3
4
//    调用路径:tsc_init->mark_tsc_unstable
//    函数任务:
//        1.如果tsc时钟已经注册,异步设置tsc的rating=0,标识其不稳定
//        2.如果tsc时钟还未注册,同步设置tsc的rating=0,标识其不稳定
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void mark_tsc_unstable(char *reason)
{
	if (!tsc_unstable) {
	    tsc_unstable = 1;
	    sched_clock_stable = 0;
	    //tsc已经注册,
	    if (clocksource_tsc.mult)
	    {
	        clocksource_mark_unstable(&clocksource_tsc);
	    }
	    //如果tsc时钟源未注册,修改rating为最低,从而不会被当做最佳的时钟源
	    else {
	        clocksource_tsc.flags |= CLOCK_SOURCE_UNSTABLE;
	        clocksource_tsc.rating = 0;
	    }
	}
}
注册tsc时钟源
1
2
3
4
5
6
//    函数任务:
//        1.计算tsc的mult
//        2.检查tsc是否稳定
//            2.1 如果tsc不稳定,降低其rating,清除时钟源连续标志
//        3.向系统注册tsc clocksource
//    调用路径:tsc_init->init_tsc_clocksource
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
static void __init init_tsc_clocksource(void)
{
	// 计算tsc的mult
	clocksource_tsc.mult = clocksource_khz2mult(tsc_khz,
	        clocksource_tsc.shift);
	// 如果tsc的可靠性已经验证,则清除 必须验证 标记
	if (tsc_clocksource_reliable)
	    clocksource_tsc.flags &= ~CLOCK_SOURCE_MUST_VERIFY;
	
	// 检查tsc是否稳定
	// 在tsc_init前通过全局变量标记tsc是否稳定,可靠
	if (check_tsc_unstable()) {
	    // 如果tsc不稳定,则降低rating最低,清除连续标记
	    clocksource_tsc.rating = 0;
	    clocksource_tsc.flags &= ~CLOCK_SOURCE_IS_CONTINUOUS;
	}
	// 向系统注册tsc clocksource
	clocksource_register(&clocksource_tsc);
}