您的位置:首页 > 运维架构 > Linux

CentOS 6.4 编译安装2.6.38.8内核

2013-09-15 12:24 555 查看
最近需要使用mmap()来对内存进行映射,访问PC机上物理内存,但是在CentOS 6.4下的内核版本是linux-2.6.28.10,不支持用户直接访问物理空间。

在新的内核中,有两个选项和mmap()映射内存/dev/mem有关:CONFIG_X86_PAT和CONFIG_STRICT_DEVMEM,内核中有这样一段话:
CONFIG_STRICT_DEVMEM:
If this option is disabled, you allow userspace (root) access to all
of memory, including kernel and userspace memory. Accidental
access to this is obviously disastrous, but specific access can
be used by people debugging the kernel. Note that with PAT support
enabled, even in this case there are restrictions on /dev/mem
use due to the cache aliasing requirements.
If this option is switched on, the /dev/mem file only allows
userspace access to PCI space and the BIOS code and data regions.
This is sufficient for dosemu and X and all common users of /dev/mem.

所以,如果要使用mmap映射/dev/mem文件的话,必须将这两个量取消。如果不取消CONFIG_X86_PAT,则/dev/mem不允许映射;如果不取消CONFIG_STRICT_DEVMEM,则内核空间不能映射,调用mmap()的时候会出现Invalid
Parameter错误。于是乎决定重新编译内核。

编译过程如下:
1. 到官方网站下载kernel,
2.6.38.8


# wget https://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.38.8.tar.bz2

2.将文件拷贝到/usr/src目录下,并解压得到linux-2.6.38.8

#cp -rf linux-2.6.38.8.tar.bz2 /usr/src
#tar -xjvf linux-2.6.38.8.tar.bz2

3.进入该目录开始,编辑Makefile文件,修改“EXTRAVERSION = .8.i386”

.8.i386 是内核的扩展名称,最后生成内核的名称为:2.6.38.8.i386,这个名字可以任意定

4.配置内核

#make menuconfig

内核有两个地方需要关闭:

a、CONFIG_X86_PAT

这个选项位于“Processor type and features”区域,名称是“x86 PAT support”。

b、CONFIG_STRICT_MEMDEV

这个选项位于“Kernel hacking”区域,名称是“Filter access to /dev/mem”。

在新版本内核中,例如我使用的2.6.38.8,必须在“General setup”中,打开“Configure standard kernelfeatures (expert users)”选项,在“Processor type and features”才能够配置“x86
PAT support”选项,否则,默认是y。

5. 编译内核

#make

6. 编译内核模块

#make modules

7. 安装内核模块

#make modules_install

这时,在/lib/modules下会产生一个目录为,名称为内核版本+EXTRAVERSION。我的是:2.6.38.8.i386

8. 拷贝bzImage文件到/boot目录

#cp /usr/src/linux-2.6.28.10/arch/i386/boot/bzImage /boot/vmlinuz-2.6.38.8.i386

注意:内核类型根据自己需求选择,我选择arch/i386下的bzImage文件

9. 拷贝System.map文件到/boot目录

cp System.map /boot/System.map-2.6.38.8.i386

10. 创建.img文件

mkinitrd /boot/initrd-2.6.38.8.i386.img 2.6.38.8.i386

其中第二个参数2.6.38.8.i386 与/lib/modules目录名称一致

11. 添加grub文件条目

#vim /boot/grub/grub.conf

添加如下几行:

title CentOS (2.6.38.8.i386)

root (hd0,0)

kernel /vmlinuz-2.6.38.8.i386 root=/dev/VolGroup00/LogVol00 rhgb quie t

initrd /initrd-2.6.38.8.i386.img

其中/dev/VolGroup00/LogVol00根据自己情况配置,我使用的双硬盘,建立在LVM基础上

12. 重新启动

一定要保证kernel和initrd指定的文件名称无误,否则就要要跑到机房去重启机器了~

#reboot

重启之后通过一下命令查看内核版本:

#uname -r

若显示2.6.38.8.i386 则新内核启动成功
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: