Chinaunix首页 | 论坛 | 博客
  • 博客访问: 185552
  • 博文数量: 40
  • 博客积分: 2576
  • 博客等级: 少校
  • 技术积分: 494
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-14 17:19
文章分类

全部博文(40)

文章存档

2011年(21)

2010年(19)

我的朋友

分类: LINUX

2010-12-28 16:28:57

题记
    最近想研究一下驱动研发,找了一本电子版的Oreilly.linux.device.drivers.3rd.edition.2005.CHM,第三 版针对的内核是2.6的,可我虚拟机里面的系统内核是2.4的,以前原来升级过内核, 不过不知道什么原因,目前进不了2.6的内核了.所以下决心重头再来过一遍^_^. 关于内核升级的好文章网上数不胜数, 我写下这篇文章的目的一是为了和大家分享经验,二是为了便于自己以后查阅.

一、2.6内核有哪些特点?
       首先我推荐你看一下《Linux 2.6内核的出色世界》, 这篇文章比较周详的介绍了2.6内核新的特性, 我们关注最多的可能是以下几个方面:
1.       内核是抢占式的, 这将显著地提高交互式和多媒体应用程式的性能。
2.       添加了sysfs文件系统, 他集成下面3种文件系统的信息:针对进程信息的proc文件系统、针对设备的devfs文件系统及针对伪终端的devpts文件系统。该文件系统(安装在 /sys目录)是核心看到的设备树的一个直观反映。
3.       为了差别以 .o 为扩展名的常规对象文件,内核模块目前使用的扩展名是 .ko。
二、安装前的准备--升级一些必要的工具.
到底哪些工具需要升级呢? 我们首先得看看Documentation/Changes这个文件,里面比较周详的介绍了安装此内核需要工具的版本号, 我是按照里面的需求一一升级的,当然对于你用不到的设备比如pcmcia就没必要升级了.
这里我说一下module-init-tools和mkinitrd的升级.
1.       的升级module-init-tools
module-init-tools提供一组工具用于加载和卸载内核模块, 包括depmod, insmod,modprobe,rmmod,lsmod ,etc. 我下载的版本是3.1, 解压之后查看里面的README文件进行安装, 一般采用如下步骤:
#./configure --prefix=/
#make moveold
#make
#make install
每一步都在README里面有说明.
新的工具采用/etc/modprobe.conf设置文件. 因此我们需要把/etc/modules.conf转换成/etc/modprobe.conf, 只需要在解压目录下输入
./generate-modprobe.conf /etc/modprobe.conf 即可.
2.      mkinitrd的升级
这个在Changes文件里面并没有提及,不过如果不升级的话安装内核(make install)的时候会提示:
No module BusLogic found for kernel 2.6.8, aborting.
    mkinitrd failed
    make[1]: *** [install] Error 1
        make: *** [install] Error 2
由于mkinitrd的依赖关系,还需要下载lvm2.device-mapper这两个包
我采用的版本号是:
mkinitrd-4.1.18-2.i386.rpm
device-mapper-1.00.19-2.i386.rpm
lvm2-2.00.25-1.01.i386.rpm
这里给大家提供一个非常棒的rpm包下载链接:

注意,并不是版本越高越好哦,版本越高依赖关系越多,越麻烦,所以够用就行了^_^.
、制定内核
       2.6内核的最新版本是2.6.18,我到

下载下来之后,安装到/usr/src目录下,然后编译,令我奇怪的是从下午1点左右一直编译到4点多还没结束,最后发现尽然一直在一个死循环里面,什么事情都没完成,我ft,得到一个教训:最新的不一定最适合!所以就换了以前用过的2.6.8的内核。
        关于内核的制定我不想说太多,一来觉得罗嗦,网上资料太多,二来也是自己懒的去细说,不过我还是要说以下几点:
1.  内核设置哪些选项该选,哪些不必选,完全取决于你的硬件设置和你使用的目的,就拿我来说,是在Vmware里面玩 得,Vmware的硬盘选择的是SCSI,他的驱动是BusLogic,网卡驱动是AMD Pcnet32,所以其他的SCSI驱动和网卡驱动一律杀除,再来说USB设备,我想大多数人都没有USB鼠标和USB硬盘,所以只要选择一般的USB支 持就行了,更有什么红外,蓝牙之类的,都不必选上。我把sound支持去掉了,graphics只支持framebuffer,因为我不必这些东西。
2.  为了体验2.6内核新的特性,关于"Processor type and features"选项, 一定要选上"Preemptible Kernel";关于文件系统, 选上常用的那几种就能了. 如果要体验sysfs的话, 要选上对sysfs的支持.另外关于"Loadable Module support"选项, 一定要选上"Module unloading"和
"Automatic kernel module loading"这两个选项,不然的话你不能rmmod了哦。
制定好内核后
make
make modules_install
make install

2.6内核安装比2.4的方便 ,make这 一步完成了make bzImage和make modules两个过程.

如果没有错误的话, 相信你的grub设置文件已被修改过了吧(不要告诉我你用的lilo),在/boot目录下多了vmlinuz-2.6.8和initrd-2.6.8.img,System.map-2.6.8
这几个文件, vmlinuz-2.6.8就是arch/i386/boot目录下的bzImage, initrd-2.6.8.img是由make install生成的(mkinitrd).

reboot看看能不能启动2.6的内核.
修改相应文件使其适应2.6内核
      我是按这篇文章里面提到的修改的
      
http://blog.csdn.net/yiminglinux/archive/2006/04/09/656058.aspx
      
1. 支持Hotplug
   需要改一个最重要的文件/etc/rc.sysconfig 这是个ln 连接。正真的文件在/etc/rc.d/里.当然, 首先要在内核设置时设置了HOTPLUG的支持. 然后,由于/proc/ksyms改名为/proc/kallsyms,所以必需修改启动脚/etc/rc.sysinit.
为了兼容原有的linux-2.4.x系统, 能加上下面几行:
#
# ----- KERNEL 2.6.x support ------
# This is for compatibility between kernel-2.4.x and
kernel-2.6.x
#
UNAME=`uname -r`
KERNELVER=${UNAME:0:3}
if [ "$KERNELVER" = "2.6" ]; then
#
# This is kernel-2.6.x
#
KSYMS=/proc/kallsyms
else
#
# This is kernel-2.4.x
#
KSYMS=/proc/ksyms
fi
然后, 把rc.sysinit文件中所有出现/proc/ksyms的地方都换成"$KSYMS"变量引用.
用Vi打开rc.sysinit 在命令模式下输入:s/\/proc\/ksyms/\$KSYMS/g 即可.

2.体验sysfs
   首先, 创建目录/sys:
# mkdir /sys
然后, 按照下列步骤修改启动脚本/etc/rc.sysinit文件:
找到行: mount -f /proc", 在下面增加:
if [ "$KERNELVER" = "2.6" ]; then
mount -f /sys
fi
找到行
"Mounting local filesystems: " mount -a -t nonfs,smbfs,ncpfs -O no_netdev
在其下面增加下列几行:
#
# Mount /sys for kernel-2.6.x
#
if [ "$KERNELVER" = "2.6" ]; then
action $"Mounting sysfs filesystem: " mount -n -t sysfs /sys /sys
fi

接下来, 在/etc/fstab文件中, 加入这样一行:
none /sys sysfs defaults 0 0
启动的时候挂载sysfs文件系统.

最后, 修改/etc/init.d/halt脚本中的halt_get_remaining函数:
将:
awk ’$2 ~ /^\/$|^\/proc|^\/dev/{next}
改为:
awk ’$2 ~ /^\/$|^\/proc|^\/sys|^\/dev/{next}
3. 支持USB设备
linux-2.6.x的USB驱动模块的名字已改动了, 所以由此引起的问题多多......,
对应于USB-2.0的host控制器的内核模块名字仍然是ehci-hcd,
对应USB-1.1的host控制器的内核模块名字已从usb-ohci改为ochi-hcd,
对应于通用USB host控制器的内核模块名字已从usb-uhci该为uhci-hcd.

然而不幸的是, 在安装module-init-tools程式包时生成的/etc/modprobe.conf设置文件却仍然使用usb-ohci这个名字. 例如:

alias usb-controller usb-ohci
alias usb-controller1 ehci-hcd

因此, 要把他改为:

alias usb-controller ohci-hcd
alias usb-controller1 ehci-hcd

支持USB键盘的模块名字也从keybdev变为usbkbd, 支持USB鼠标的模块名字也从mousedev改为usbmouse.
由于我用不到usb鼠标和usb键盘,所以干脆在/etc/rc.sysinit里面注释这两行:
action $"Initializing USB keyboard: " modprobe kenbdev 2> /dev/null
action $"Initializing USB mouse: " modprobe mousedev 2> /dev/null
当然如果你由usb鼠标和usb键盘的话,把模块名改了就能了.

最后把/etc/rc.sysinit中的needusbstorage部分从:

needusbstorage=
if [ $usb = "1" ]; then
needusbstorage=`LC_ALL=C grep -e "^I.*Cls=08" /proc/bus/usb/devices 2>/dev/null`
LC_ALL=C grep ’hid’ /proc/bus/usb/drivers || action $"Initializing USB HID interface: " modprobe hid 2> /dev/null
fi
改为
needusbstorage=
if [ $usb = "1" ]; then
if [ "$KERNELVER" = "2.6" ]; then
needusbstorage=`LC_ALL=C grep -e "^I.*Cls=08" /sys/bus/usb/devices 2>/dev/null`
LC_ALL=C grep ’hid’ /sys/bus/usb/drivers || action $"Initializing USB HID interface: " modprobe hid 2> /dev/null
else
needusbstorage=`LC_ALL=C grep -e "^I.*Cls=08" /proc/bus/usb/devices 2>/dev/null`
LC_ALL=C grep ’hid’ /proc/bus/usb/drivers || action $"Initializing USB HID interface: " modprobe hid 2> /dev/null
fi
fi
4.Vmware tools
修改/usr/bin/vmware-config-tools.pl文件,把里面的/proc/ksyms改为/proc/kallsyms,然后重新运行vmware-config-tools.pl,按照提示往下运行即可.
注意网卡要想工作,需要vmxnet模块的支持,这个是由vmware-config-tools.pl生成的.
FAQ
       1. 进入2.6内核之后,安装rpm包提示
          rpmdb: unable to join the environment
error: db4 error(11) from dbenv->open: Resource temporarily unavailable
error: cannot open Packages index using db3 - Resource temporarily unavailabl
error: cannot open Packages database in /var/lib/rpm
no packages   
解决办法1:
能升级RPM,比较麻烦.
解决方法2:
export  LD_ASSUME_KERNEL=2.2.5 ,网上都说这个有用,可是我这样之后提示:
error while loading shared libraries: libc.so.6:cann’t open shared object file:No such file or directory
解决方法3:
修改/usr/lib/rpm/macros
在里面寻找
代码:
%__dbi_cdb create cdb mpool mp_mmapsize=16Mb mp_size=1Mb
修改成
代码:
%__dbi_cdb create cdb mpool mp_mmapsize=16Mb mp_size=1Mb private

我通过方法3解决的.^_^
欢迎大家和我交流(mutecat@126.com)
阅读(1689) | 评论(0) | 转发(0) |
0

上一篇:linux udev

下一篇:locale

给主人留下些什么吧!~~