或者
$ sudo cp ../linux-headers-2.6.32-21-generic/.config ./.config
如果当前运行内核打开了CONFIG_IKCONFIG_PROC参数,则可以
$zcat /proc/config.gz > .config
$make oldconfig
编译内核
2.6版本后前两步不需要,直接make即可
$make prepare
$make scripts
$make
3)安装模块
$make modules这一步不需要
$make module_install
执行结束之后,会在/lib/modules下生成新的目录/lib/modules/2.6.32.44+drm33.19
四、生成镜像文件
1)生成内核镜像文件
$make bzImage
执行完成后将在arch/i386/boot/目录下生成bzImage镜像文件,使用下面命令安装到系统的/boot目录下:
$sudo make install
sh /usr/src/linux-source-2.6.32/arch/x86/boot/install.sh 2.6.32.44+drm33.19 arch/x86/boot/bzImage System.map "/boot"
命令完成后在/boot目录下,将多了vmlinuz-2.6.32.44+drm33.19和System.map-2.6.32.44+drm33.19两个文件
或者直接拷贝
$sudo cp arch/i386/boot/bzImage /boot/vmlinuz-2.6.32.44+drm33.19
2)生成要载入ramdisk的映像文件
如果linux系统安装在scsi磁盘上,这步是必须的,否则可以跳过。我的linux是装在vmware上的,用的是虚拟的scsi磁盘,所以必须要这一步。输入命令:
$mkinitramfs -o /boot/initrd.img-linux2.6.32.44+drm33.19 2.6.32.44+drm33.19
第二个参数是版本号,必须和/lib/modules/目录下新内核对应的模块的文件夹名字一致,即2.6.32.44+drm33.19 。
五、使用新编译的内核
Ubuntu采用Grub引导,要使用新内核,必须配置grub。
1) 更改grub配置,显示启动菜单
$su – root
$gedit /etc/default/grub &
注释GRUB_HIDDEN_TIMEOUT=0语句,及改成#GRUB_HIDDEN_TIMEOUT=0后保存
2)更新启动配置文件
$update-grub
执行命令后,该命令自动搜索/boot文件夹,将相应的镜像加入/boot/grub/grub.cfg启动菜单,并根据/etc/default/grub内容更新配置文件。更新后,将增加如下内容:
menuentry 'Ubuntu, with Linux 2.6.32.44+drm33.19' –class ubuntu –class gnu-linux –class gnu –class os {
recordfail
insmod ext2
set root='(hd0,5)'
search –no-floppy –fs-uuid –set 4aaa411a-c1ab-4c9e-94bf-770717be6d9a
linux /vmlinuz-2.6.32.44+drm33.19 root=/dev/sda8 ro quiet splash
}
menuentry 'Ubuntu, with Linux 2.6.32.44+drm33.19 (recovery mode)' –class ubuntu –class gnu-linux –class gnu –class os {
recordfail
insmod ext2
set root='(hd0,5)'
search –no-floppy –fs-uuid –set 4aaa411a-c1ab-4c9e-94bf-770717be6d9a
echo 'Loading Linux 2.6.32.44+drm33.19 …'
linux /vmlinuz-2.6.32.44+drm33.19 root=/dev/sda8 ro single
echo 'Loading initial ramdisk …'
}
手工更改配置文件
因为是SCSI,须手工加入启动时需要的ramdisk的映像文件, initrd开头部分:
menuentry 'Ubuntu, with Linux 2.6.32.44+drm33.19' –class ubuntu –class gnu-linux –class gnu –class os {
recordfail
insmod ext2
set root='(hd0,5)'
search –no-floppy –fs-uuid –set 4aaa411a-c1ab-4c9e-94bf-770717be6d9a
linux /vmlinuz-2.6.32.44+drm33.19 root=/dev/sda8 ro quiet splash
initrd /initrd.img-linux2.6.32.44+drm33.19
}
menuentry 'Ubuntu, with Linux 2.6.32.44+drm33.19 (recovery mode)' –class ubuntu –class gnu-linux –class gnu –class os {
recordfail
insmod ext2
set root='(hd0,5)'
search –no-floppy –fs-uuid –set 4aaa411a-c1ab-4c9e-94bf-770717be6d9a
echo 'Loading Linux 2.6.32.44+drm33.19 …'
linux /vmlinuz-2.6.32.44+drm33.19 root=/dev/sda8 ro single
echo 'Loading initial ramdisk …'
initrd /initrd.img-linux2.6.32.44+drm33.19
}
修改完成并保存后,重新启动系统,应该出现让你选择内核的菜单。
六、准备Helloworld源代码和Makefile文件
$mkdir hello
$cd hello
$gedit Helloworld.c Makefile &
Helloworld.c内容:
#include
#include
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk(KERN_ALERT "Hello, worldn");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye, cruel worldn");
}
module_init(hello_init);
module_exit(hello_exit);
Makefile内容:
#Makefile 2.6
ifneq ($(KERNELRELEASE),)
#kbuild syntax dependency relationship of files and target modules are listed here.
mymodule-objs:=helloworld.o
obj-m:=helloworld.o
else
PWD:=$(shell pwd)
#为正在运行的内核编译模块,使用下列配置
KVER:=$(shell uname -r)
#KDIR:=/lib/modules/$(KVER)/build
#或使用/usr/src/linux-headers-2.6.32-21-generic目录
#不是为正在运行的内核编译模块,使用下列配置
#KDIR:=/usr/src/linux-2.6.32.21/
KDIR:=/usr/src/linux-source-2.6.32/
all:
$(MAKE) -C $(KDIR) M=$(PWD)
clean:
@rm -rf .*.com *.o *.mod.c *.ko .tmp_versions modules.order Module.symvers
endif
保存文件后,编译通过。如果出现
#make
Makefile:10: ***遗漏分隔符 (您的意思是用 TAB 代替 8 个空格?)。停止。
或
#make
make:没有什么可以做的为 all'。