安装完成Ubuntu 7.10后执行 “uname -r” 显示的版本是 Linux-headers-2.6.22-14-generic。 用 "ls -l" 查看 /usr/src/显示的有两个文件目录:Linux-headers-2.6.22-14-generic和Linux-headers-2.6.22-14。用Ubuntu的源更新和配置(我用的是上交和欧洲官方的源,当然还有中文的官方源)以后内核会升级到Linux-headers-2.6.22-15-generic。/usr/src/下会增加两个文件目录:Linux-headers-2.6.22-15-generic 和Linux-headers-2.6.22-15。
这个时候写按照《Linux设备驱动程序(第三版)》写Hello驱动怎么也编译不过去,需要建立内核树。其实2.4版本和2.6版本下驱动的编译命令(Makefile文件)是不同的,生成的驱动文件后缀名也不一样,2.4为 .o ,2.6为 .ko。干脆编译内核使用比较高一点的稳定的版本,选择了2.6.24版本的内核。
1. 安装准备:
包有:libncurses5-dev(menuconfig需要的)和essential
sudo apt-get install build-essential bin86 kernel-package
sudo apt-get install libqt3-headers libqt3-mt-dev
sudo apt-get install make
sudo apt-get install gcc
到新立得里把所有以ncurses开头的软件包全部装上。另外,查看系统是否有这样的两个命令,用tab键
mkinitramfs mkisofs
2. 下载linux-2.6.24内核
到www.kernel.org 上下载linux-2.6.24.tar.bz2的内核放到 /usr/src/。
sudo -s -H到超级用户模式。
cd /usr/src进入目录。
tar jxvf linux-2.6.24.tar.bz2解压文件。
cd /usr/src/linux-2.6.24
3. 配置内核
先运行以下命令,复制当前内核的配置文件。
cp /boot/config-`Linux-headers-2.6.22-15-generic` ./.config
sudo make menuconfig
选择 "Load an Alternate Configuration File",再选择你刚才拷贝过来的.config文件作为配置文件。然后确定。当结束后,你选择退出时,会提示问你 "Do you wish to save your new kernel configuration?"选择yes即可。
4. 开始编译
这部的时候出现了空间的问题,编译将会产生1.8G的空间在 /usr/src下,复制到/lib/modules下下的内核模块也有500M。空间一定要够!
make
make bzImage //编译内核,将保存到/usr/src/linux-2.6.24.4/arch/i386/boot/下
make modules //编译模块
make modules_install //安装模块
这个时候内核树已经建立,编写hello驱动程序成功。
//hello.c
#include
#include
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk(KERN_ALERT "Hello, world\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT"Goodbye, cruel world\n");
}
module_init(hello_init);
module_exit(hello_exit);
//Makefile 文件
obj-m := hello.o
KERNELDIR := /lib/modules/2.6.24/build
PWD := $(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
如果以上你都完成了在 make 时出现错误,Makefile格式错误,解决办法就是 你把如 $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install 移动到行首 然后按Tab 键自动对齐,然后在 make 。Makefile一般出现Tab和空格的问题,用Tab键分割。
如果你不想使用新的内核,用它来作编译逻辑也可以,使用新的内核就得编译完成,包括加载到grub里面。
5. 编译完成
sudo mkinitramfs -o /boot/initrd-2.6.24.img 2.6.24
此时可能提示找不到这样的一个文件夹“/lib/firmware/2.6.24”,你需要手工创建一个这样的文件夹。
mkdir /lib/firmware/2.6.24
make install //安装内核安装完后/boot下将增加以下几个文件(用ls -l *24*查看)
-rw-r--r-- 1 root root 85203 2008- 22:24 config-2.6.24
-rw-r--r-- 1 root root 37968871 2008- 08:31 initrd-2.6.24.img
-rw-r--r-- 1 root root 4014080 2008- 22:24 initrd.img-2.6.24
-rw-r--r-- 1 root root 932315 2008- 22:24 System.map-2.6.24
-rw-r--r-- 1 root root 1858864 2008- 22:24 vmlinuz-2.6.24
给/boot/grub/menu.lst中添加一个新的启动项,如我的menu.lst增加了如下一段文字
title Ubuntu, kernel 2.6.24
root (hd0,0)
kernel /boot/vmlinuz-2.6.24 root=UUID=d7e2cf74-ebf5-4c78-ac2c-9f85a9809eae ro
initrd /boot/initrd-2.6.24.img
从新启动就可以用新的内核了。


wangyu 于 2008-08-23 22:26:43发表:
曾经升级过一次,失败