Linux操作系统可分为两个运行级别,内核态和用户态。内核态掌控计算机资源的分配,用户态提供友好的界面同用户进行交互。用户态的程序不能直接使用系统资源,但它们可以通过内核提供的系统调用进入内核态完成请求的操作。Linux系统的两级设计方式增强了系统的安全性,但是却给测试内核带来了不便。测试人员无法像测试应用程序一样编写程序直接测试。尽管如此,系统还是有一些手段帮助我们实现对内核的测试。
通常测试内核功能的方式有如下4种:
◆ 通过内核提供的各种系统调用,测试内核功能的完整性;
◆ 把测试程序作为内核的一部分来测试,例如把测试程序写成内核模块,插入到内核中动态运行;也可以直接把测试程序编译到内核中,然后直接运行带有测试程序的内核;
◆ 通过内核和用户态的接口来进行交互测试,例如proc文件系统,sys文件系统;
◆ 通过内核调试程序进行内核测试。
在这四种方法中,系统调用测试是相对简单易行的方法。它的缺点是无法准确测试内核内部功能。第二种测试方法由于涉及具体的内核模块编程,下面主要介绍会在内核调试中用到的第三和第四种测试方法。
Linux Test Project(简称LTP)是目前较为流行的Linux基本功能测试工具集。LTP包含了总多子功能测试模块,例如系统调用,系统命令,内存分配,磁盘读写,文件系统,网络,数学运算测试等等。系统调用的测试集包含约700个测试用例,基本上覆盖了大部分的系统调用。它们通过传递不同的参数来模拟正常或错误的调用,以达到测试的目的。
为了达到快速检查内核变动的能力,繁重的内核测试任务需要有自动化的实现。内核测试自动化的设计与普通应用程序测试自动化的设计并无太多区别,它主要包含以下几个方面:内核源代码自动化的下载,自动化的编译,自动化的安装,自动化的测试并报告测试结果。AutoTest是目前比较有名的自动化内核测试项目,由Martin J. Bligh发起并维护。它实现了一套较为先进的自动测试框架,并提供了一套接口供现有的测试工具(例如LTP)进行集成。当发现有新的Linux内核需要测试时,AutoTest便会生成一系列的测试任务,然后把测试任务分配到不同的Client Harness上进行环境准备和执行测试,最后把收集到的测试结果进行分析和发布。
内核功能测试中需要注意的问题有:
◆ 内核程序除了可以动态加载的模块(module)外,重新编译和安装内核,需要重新启动测试机;
◆ 内核缺陷不仅难于重现,并且在对不健康的内核进行测试时,容易导致系统崩溃,需要及时保存测试数据;
◆ 当内核中发生系统故障的时候(系统打出oops消息),就算不会导致系统崩溃(panic),也可能导致正在使用的系统资源丢失,例如设备不可用,内存无法回收。
内核性能测试与功能测试类似,也需要有自动化的帮忙,为此Kenneth Chen发起了Linux Kernel Performance(简称LKP)项目。该项目集成了性能测试的几个典型的测试工具(kernelbuild,netperf,aim,cpu2000等等)。每当有新的内核版本发布时,它都会在几个典型平台上自动运行测试,及时获取性能数据。
在进行内核性能测试时,需要注意的以下几个问题:
◆ 为了使采集的数据具有可比性,每次性能测试的环境和参数必须保持一致;
◆ 由于某些性能测试(例如测试磁盘IO)具有较大数学的方差,因此需要通过重复多次求平均值的方法来得到理想的数值;
◆ 细微的参数区别也可能会导致测试结果的巨大波动,因此需要通过调整参数值达到比较理想的测试结果;
◆ 相比功能测试工具,不同的性能测试工具在输入参数和输出结果上差别很大,给自动化测试系统的集成带来了难度。