1.系统centos6.5,内核2.6.31.6,补丁patch-2.6.31.6-rt19.bz2,以下方式获得:
wget https://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.31.6.tar.bz2 wget https://www.kernel.org/pub/linux/kernel/projects/rt/2.6.31/patch-2.6.31.6-rt19.bz2
2.解压内核文件并打补丁
tar xjvf linux-2.6.31.6.tar.bz2 cd linux-2.6.31.6 bzcat ../patch-2.6.31.6-rt19.bz2 | patch -p1
3.配置内核
make menuconfig
内核配置时主要修改以下几处:
(1)选择“Processor type and features -> High Resolution Timer Support"
(2)选择“Processor type and features -> Preemption Mode (Complete Preemption (Real-Time)) -> Complete Preemption (Real-Time)"
(3)不选 "Device Drivers -> Staging drivers"
参考:https://rt.wiki.kernel.org/index.php/RT_PREEMPT_HOWTO
4.编译
make
执行上述命令时遇到如下问题:
(1)“syscall_trace_enter”和“syscall_trace_leave”
/usr/src/linux-2.6.31.6/arch/x86/include/asm/ptrace.h:146:13: note: previous declaration of 'syscall_trace_leave' was here make[2]: *** [arch/x86/kernel/ptrace.o] Error 1 make[1]: *** [arch/x86/kernel] Error 2 make: *** [arch/x86] Error 2
解决方法如下:
将“/usr/src/linux-2.6.31.6/arch/x86/kernel/ptrace.c”和“/usr/src/linux-2.6.31.6/arch/x86/include/asm/ptrace.h”两文件中关于“syscall_trace_enter(struct pt_regs *)”和“syscall_trace_leave(struct pt_regs *)”函数的定义
统一起来,修改ptrace.h文件中两函数的定义如下:
extern asmregparm long syscall_trace_enter(struct pt_regs *); extern asmregparm void syscall_trace_leave(struct pt_regs *);
(2)解决(1)后执行“make”,又出现如下错误:
gcc: error: elf_i386: No such file or directory gcc: error: unrecognized command line option ‘-m’ make[2]: *** [arch/x86/vdso/vdso32-int80.so.dbg] Error 1 make[1]: *** [arch/x86/vdso] Error 2 make: *** [arch/x86] Error 2
应该是gcc版本问题,
gcc -v
显示
gcc version 4.8.0 (GCC)
而
/usr/bin/gcc -v
显示
gcc version 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC)
通过执行
find / -name gcc
发现系统装了两个版本的gcc,默认执行4.8版本,而此版本gcc与2.6.31内核不兼容,出现上述问题,解决方法是将当前默认版本的gcc改为4.4.7版本(暂时)
mv /usr/local/bin/gcc /usr/local/bin/gcc4.8.0 ln -s /usr/bin/gcc /usr/local/bin/gcc
注:将/usr/bin/gcc链接为/usr/local/bin/gcc,这样在系统执行gcc(即/usr/local/bin/gcc)时会自动链接到/usr/bin/gcc
5.继续编译,可以顺利执行
make -j2
双核一起执行编译,加快速度
6.编译完成后,执行
make modules_install
此时/lib/modules目录下应该有/2.6.31.6-rt19这一目录,然后执行
mkinitrd /boot/initrd-2.6.31.6-rt19.img 2.6.31.6-rt19 --force
可在/boot目录下生成initrd-2.6.31.6-rt19.img及自动更新/boot/grub/grub.conf文件,可通过修改后者调整不同内核的启动顺序。
7.重启!
8.进入系统后找不到eth0.。。。并且系统中没有e1000e(Intel 82579LM 网卡的驱动)模块。
参考:http://www.cnblogs.com/QuLory/archive/2012/09/27/2706429.html