Linux内核编译以及perfctr模块安装

Linux内核编译以及perfctr模块安装

 

零、需求介绍

   需要使用PAPI得到硬件级的数据,即与微指令相关的数据,例如L1/L2 cache miss、TLB miss、Cycle等,而PAPI需要perfctr(Performance-monitoring counters support)模块的支持,而Linux内核当中默认没有perfctr模块,并且perfctr只在某些内核上被支持,它实际上是内核的一个补丁,需要重新编译内核,打上补丁才能在内核上运行perfctr模块。更多信息参考papi和perfctr的INSTALL文件。

一、环境介绍
   Intel(R) Xeon(R) CPU ,X86_64平台;
   物理机<建议不要在虚拟机上试,否则可能出现问题,后面介绍>

   CentOS release 5.4 (Final)

   内核版本是2.6.18-164.el5-x86_64

 

查看内核、平台等信息 #uname -a Linux gc04vm13 2.6.18-164.el5<原来内核> #1 SMP Thu Sep 3 03:28:30 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux 查看操作系统版本 #cat /etc/issue CentOS release 5.4 (Final) 查看CPU信息 cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c 1 Intel(R) Xeon(R) CPU E5520 @ 2.27GHz <只给虚拟机分配了一个CPU>

二、准备工作
    (i)下载papi,可以在
http://icl.cs.utk.edu/papi/custom/index.html?lid=51&slid=69上下载各个版本的papi,这里下载papi-3.6.0。

    papi中包含了perfctr,用户不需要单独下载perfctr,(当然也可以单独下载,网址是http://user.it.uu.se/~mikpe/linux/perfctr),这里选择2.6版本的perfctr。
    解压papi,阅读papi-3.6.0/src/perfctr-2.6.x目录下的INSTALL文件,里面讲到“该版本的perfctr适用于如下版本的Linux内核:在papi-3.6.0/src/perfctr-2.6.x/patches目录下,若存在patch-kernel-*补丁,说明适用于*版本的Linux内核,我们选择2.6.19版本的linux内核。

    注意: PERFCTR 的版本并不是和linux内核版本相对应的,比如ompi自带的perfctr-2.6.x可适用于很多版本的linux内核,例如2.4.26版本的内核。

    (ii)下载linux-2.6.19.tar.bz2,在网站 http://www.kernel.org/pub/linux/kernel/ 上可以下载任何版本的linux内核。

     一般情况下,当前内核版本是x.y.***版本的话,编译的新内核版本最好也是x.y.***版本,例如不要从2.4.x升级到2.6.x,因为两者差异比较大,一般[主].[次]版本号相同的内核可以顺利升级。

    (iii) 认真看完perfctr的INSTALL文件,里面详细说明了安装步骤和测试。

三、安装步骤

    (1)解压内核
    bzip2 -d linux-2.6.19.tar.bz2
     tar xvf linux-2.6.19.tar
    生成linux-2.6.19目录

    (2)复制内核到/usr/src目录下
    cp -r linux-2.6.19 /usr/src/

    (3) 解压papi到目录/opt下,

    tar zxvf papi-3.6.0.tar.gz

     cp papi-3.6.0 /opt/

    

    (4)
    cd /usr/src/linux-2.6.19
    make mrproper

   

    (5)在内核目录下执行update-kernel 
    cd /usr/src/linux-2.6.19

     /opt/papi-3.6.0/src/perfctr-2.6.x/update-kernel
    <必须在内核目录下执行,否则在后续选择内核模块时找不到perctr>

    若内核版本有问题则出现如下信息
    Error: no suitable patch found for kernel 2.6.19zkl-perfctr
    See perfctr-2.6.x/patches/ for supported kernel versions,

    可以查看perfctr-2.6.x/patches/下支持的内核版本。

    (6)该步骤可以跳过,也可以这样做

    拷贝原有内核的.config到当前内核目录下
    cd /usr/src/linux-2.6.19
    cp /usr/src/kernels/2.6.18-164.el5-x86_64/.config .
    (7)配置选择内核模块

     cd /usr/src/linux-2.6.19
      make menuconfig

     选择模块:

     查看perfctr-2.6.x目录下的INSTALL文件,它有如下这些内容,其意思是说必须选择这样几个模块:
     (i)Loadable  module  support 选项下,一般默认即可,这个模块的功能是帮助系统可以动态加载模块。

Linux内核编译以及perfctr模块安装_第1张图片
     (ii)Processor type and features选项下的Performance-monitoring counters support(即PERFCTR),

     这个必须选择,笔者做实验觉得应该将PERFCTR选择为(M),其子项均选择为*,将它编译成可动态加载的模块,请按如下方式选择。

Linux内核编译以及perfctr模块安装_第2张图片
     注意:
     我在做实验时,最开始将PERFCTR选择为*,将其编译进内核,最后安装完毕,始终不能执行perfectr的实例,查看系统目录/lib/modules/'uname -r'/drivers下也没有perfectr模块,使用lsmod不能查看到perfctr模块,既然编译进了内核,应该能看到的,不知啥原因?更不能使用命令modprobe perfctr加载模块(因为不是以动态加载模块的形式加载的),可能与没有将PERFCTR模块设置为M有关。

    内核模块选择操作方式:
    选择模块是按Y会出现*,按M会出现M,按N可以取消选择。也可以按空格键从*切换到无,为大写M(键下大写M)表示编译成可动态加载的模块,*表示编译进入内核。

    (iii)内核支持APIC
    此外必须保证内核支持APIC(Advanced Programmable Interrupt Controller高级可编程中断控制器),这是因为后面papi要使用,所以请保证选中了APIC相关项,可以按"/",然后键入APIC,搜索以下与之相关的模块是否选择了,这个模块实际上在在Processor type and features选项下,模块选择完毕,可以使用命令grep PIC /usr/src/linux-2.6.19/.config查看apic是否选择,选择了的话应该显示CONFIG_X86_GOOD_APIC=y等字样,papi的INSTALL文件中说到“SMP(多核,对称多处理器)上默认选择了该项,但是UP(单处理器)上默认没选择”。

----------------------------------------------------------------------------------------
以下摘自perfctr的INSTALL文件
  You should either configure with modules (CONFIG_MODULES=y) AND module
   versions (CONFIG_MODVERSIONS=y), or completely without modules
   (CONFIG_MODULES=n). Modules without module versions is an inherently
   unsafe configuration which is not recommended.

   Loadable  module  support选项

   You should also enable at least CONFIG_PERFCTR, CONFIG_PERFCTR_VIRTUAL,
   and CONFIG_PERFCTR_GLOBAL.

   Processor type and features选项下的Performance-monitoring counters support(即PERFCTR)选项下的所有选项都选中

   You may also select CONFIG_PERFCTR=m to build the bulk of the driver (或者设为M,编译成动态加载的模块)
   as a loadable kernel module; the module will be named `perfctr'.

   Note: The perfctr kernel patch adds one word to the `thread_struct'
   type, which makes the patched kernel binary incompatible with an
   unpatched one. This is why it is important to distinguish the patched
   kernel via EXTRAVERSION and CONFIG_MODVERSIONS.
----------------------------------------------------------------------------------------

   (7)修改/usr/src/linux-2.6.19/Makefile,加上扩展版本号,对该内核给一个标记,
    EXTRAVERSION =-zkl-perfctr 
    这样做之后,您编译内核完成后,你的内核版本就是linux-2.6.19-zkl-perfctr

   (8)编译内核

    第一种做法=================================================================================

# make clean
# make vmlinux modules  <使用此命令编译内核和模块>  动作完成后在/usr/src/linux-2.6.19/下生成了模块相关文件,例如在drivers中有很多相关文件
# make modules_install  安装模块,此命令会利用上面在/usr/src/linux-2.6.19/下生成的模块相关文件,对它们进行编译,在系统目录/lib/modules/2.6.19-zkl-perfctr下生成模块,例如可以在drivers中看到perfctr模块
# make bzImage  编译生成内核文件,/usr/src/linux-2.6.19/arch/x86_64/boot/目录下生成了内核文件bzImage
# make install  执行此命令必须保证之前生成了内核文件bzImage
sh /usr/src/linux-2.6.19/arch/x86_64/boot/install.sh 2.6.19-zkl-perfctr arch/x86_64/boot/bzImage System.map "/boot"
此命令等同于第二种方法中的(e),只不过使用make install命令会自动完成e中的几种动作,实现内核多重启动
=====================================================================================

 

或者

 

第二种做法

<建议使用第一种>
===============================================================================

(a) make clean  将之前生成的.o文件删除掉,这样不会产生新旧版本的误差

(b) make bzImage
  命令执行成功将提示如下信息,在/usr/src/linux-2.6.19/arch/x86_64/boot/目录下生成了内核文件bzImage
Root device is (8, 3)
Boot sector 512 bytes.
Setup is 7252 bytes.
System is 1794 kB
Kernel: arch/x86_64/boot/bzImage is ready  (#1)

(c) make modules  制作出模块相关的文件

(d) make modules_install 安装模块


(e)实现内核多重启动

cp /usr/src/linux-2.6.19/arch/x86_64/boot/bzImage /  (/表示一条命令太长了,换行)
> /boot/vmlinux-2.6.19-zkl-perfctr

cp  /usr/src/linux-2.6.19/System.map /
> /boot/System.map-2.6.19-zkl-perfctr

手动生成initrd-2.6.19-zkl-perfctr.img文件到/boot目录下:
cd /usr/src/linux-2.6.19
[root@gc04vm13 linux-2.6.19]# mkinitrd /boot/initrd-2.6.19zkl-perfctr.img 2.6.19-zkl-perfctr (注意内核是2.6.19-zkl-perfctr,这是因为前面修改了Makefile中的版本扩展号,该命令将在/boot目录下生成initrd-2.6.19zkl-perfctr.img文件)

编辑系统内核启动文件
vim /boot/grub/menu.lst

# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00
#          initrd /initrd-version.img
#boot=/dev/sda
default=0  #对应到第一个title
timeout=10 #系统内核选择时的延迟
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18-164.el5)
        root (hd0,0)
        kernel /vmlinuz-2.6.18-164.el5 ro root=/dev/VolGroup00/LogVol00
        initrd /initrd-2.6.18-164.el5.img
##加上以下启动新内核的语句
title CentOS (2.6.19-zkl-perfctr)
        root (hd0,0)
        kernel /vmlinuz-2.6.19-zkl-perfctr ro root=/dev/VolGroup00/LogVol00  # 这是表示内核文件是/boot/vmlinux-2.6.19-zkl-perfctr
        initrd /initrd-2.6.19-zkl-perfctr.img # 这是前面生成的文件/boot/initrd-2.6.19zkl-perfctr.img

=================================================================================

    (10)重新启动系统,
    在启动菜单中将会出现两个内核选项,使用上下按钮选择新内核启动
    或者
    将新内核设置为默认启动内核,即修改上面文件中default=1

    (11)系统重启后,可以使用命令查看perfctr模块是否安装上,
    # modprobe perfctr 加载模块
    lsmod 显示模块
    rmmod perfctr移除模块

    若perfctr模块安装成功后,你将看到perfctr模块,并且你可以在 /lib/modules/2.6.19-zkl-perfctr/kernel/drivers/perfctr中看到perfctr模块perfctr.ko

 

    (12)编译安装perfctr,

#cd /opt/papi-3.6.0/src/perfctr-2.6.x
#make
#mknod /dev/perfctr c 10 108  <可能提示已存在文件,删除再建即可>
#chmod 644 /dev/perfctr
#make PREFIX=/usr/local install

      至此,安装全部完成,perfctr相关文件安装再/usr/local下的bin、include、lib下

 

    (13)测试

测试perfctr-2.6.x下面的例子,出现结果,证明安装perfctr安装成功

[root@gc04vm13 perfctr-2.6.x]# examples/global/global

PerfCtr Info:
abi_version  0x05010501
driver_version  2.6.32 DEBUG
cpu_type  5 (?)
cpu_features  0x7 (rdpmc,rdtsc,pcint)
cpu_khz   2259879
tsc_to_cpu_mult  1
cpu_nrctrs  0
cpus   [0], total: 1
cpus_forbidden  [], total: 0
cpu type 5 (?) not supported 

      不支持,这是因为以上步骤我是在VMware虚拟机中完成的,换成物理机就没问题,正常情况下是运行后每隔5秒刷现一次

 

 

 

 

     涉及的命令: cp -r papi-3.6.0 /opt/ cp linux-2.6.20.tar.gz /usr/src/kernels cd /usr/src/kernels tar zxvf linux-2.6.20.tar.gz cd linux-2.6.20 #make clean <当前内核未编译过时不需要执行该命令> #make mrproper <当前内核未编译时不需要执行该命令> /opt/papi-3.6.0/src/perfctr-2.6.x/update-kernel cp 当前内核目录/.config . <复制当前内核下的.config文件到当前目录> make menuconfig 做如下选择: (1)Processor type and features选项下的Performance-monitoring counters support,即要支持硬件计数器 (2)搜索 APIC 选项,查看是否已经选上y,没有则选上 (也可以在退出 menuconfig 后使用 grep APIC .config 查询APIC相关选项是否是y) 退出 menuconfig,保存。 make modules make modules_install make bzImage make install 完毕后选择新内核重新启动 新内核启动后 modprobe perfctr lsmod | grep perfctr cd /opt/papi-3.6.0/src/perfctr-2.6.x/ make examples/perfex -i examples/global/global 检测perfctr是否能正常运行,若出现错误,重启系统 mknod /dev/perfctr c 10 108 chmod 644 /dev/perfctr make PREFIX=/usr/local install 将perfctr的头文件、库、可执行命令安装到/usr/local下

你可能感兴趣的:(虚拟机,centos,Module,features,makefile,linux内核)