首选在你的电脑上安装你喜欢的虚拟机软件,然后在虚拟机中安装一个你喜欢的Linux系统。我们推荐使用VirtualBox+Ubuntu作为试验环境,对于试验来说或,我们不需要XWindow。关于这两个软件的下载,安装过程,请利用google在网上参考相关介绍。 对于ubuntu用户,如果可以使用下面的命令来安装内核编译环境:
# aptitude install build-essential kernel-package libncurses5-dev
由于需要反复修改,编译内核,因此我们希望把内核配置为最小化的编译,也就是说需要在进行make menuconfig时,尽量的把不需要的特性删除了,这样既可以减小内核体积,又可以加快编译速度。然而对于一个新手来说最苦恼的事情就是:看不明白make menuconfig中的那一个个选项代表什么意思,在经历了无数次的修改,编译之后,内核还是不能正常启动,浪费了大量的时间,精力之后,仍然不明白到底是哪里选错了。因此学习的积极性遭受莫大的打击,最初的那一番热情被一次次的panic慢慢吞噬。
实际上,对于内核中许多配置选项,当你的知识积累到一定程度时,你一看就知道它代表什么,如果你的知识不够,就算解释了,你也是囫囵吞枣。比如,如果你不具备充分的TCP/IP的网络基本知识,是很难让你真正明白IP: tunneling等配置选项究竟代表什么。因此你首选要明白:“冰冻三尺,非一日之寒”。本文的目的是帮助你先明白一些最常用,最基本的内核配置选项,保证你能够顺利的配置,编译一个能够在VirtualBox中顺利启动的最小化试验内核,从而为你保住那一点学习的积极性,将来,随着你知识的增长,你将慢慢明白更多的配置选项。
首先,在内核编译中,你要明白,按照模块编译(module),和编译到内核之间的区别。如果选择编译进内核,那么相关选项对应的代码,会被编译到最终的内核文件bzImage中,如果编译成模块,那么这部分代码不会编译到bzImage中,而是被编译成独立的输出文件,在需要时,被加载到内核中运行,不需要时会从内存中移除。因此,编译成模块,可以减小内核文件的体积,也更灵活。你可以使用lsmod查看当前被加载的模块,使用insmod、rmmod按装或移除某个模块。如果全部选择编译到内核中,那么在测试这个内核时,我们只需要把bzImage拷贝到/boot目录,然后配置grub就可以了。如果编译成模块,还需要把模块正确的安装到/lib/modules目录下。因此,本文推荐在试用过程中,全部选择编译到内核中,除非要对某个模块进行试验。
内核最小化编译配置
General setup --->
Kernel .config support
Enable access to .config through /proc/config.gz
内核配置选项保存在.config文件中,如果选中这两个选项,会把当前的.config编译到内核中,这样在内核运行过程中,你可以通过/proc/config.gz来获取这个文件,这样就算你最初的配置丢失了,也能通过/proc/config.gz来了解当前内核的配置信息。 这里我们选择(Y).
General setup --->
() Initramfs source file(s)
你可以在这里选择一个RAM Disk(initrd)目录,在编译过程中,会把这个目录压缩了,然后编译到内核的数据段中,在内核启动过程中,会把这片数据解压缩,从而得到RAM Disk的根文件系统。通常,Grub会把内核文件bzImage和initrd同时加载到内存,然后内核在启动过程中使用这个initrd作为RAM Disk的根文件系统。该选项可以把initrd和内核文件bzImage合二为一,在某些不使用grub最为启动引导工具的嵌入式开发场合,非常有用。
这里,我们不做选择.(如果你还不明白Grub, initrd,那么没关系,你可以等以后明白了再来试用这个选项。)。
[*] Enable loadable module support --->
这个选项就是决定内核是否支持在运行过程中动态加载或者卸载内核模块的特性。 该选项和它的子选项全部保持默认。
Processor type and features --->
这个选项下面,可以配置CPU的特性,常用的子选项如下:
Processor type and features --->
[*] Symmetric multi-processing support
是否支持多处理器(SMP)或者多核处理器。 不选择这个选项. (在键盘上按N).
Processor type and features --->
[*] Paravirtualized guest support
内核虚拟化支持,如果你的内核要运行xen这样的虚拟机软件,需要选择这个选项。 不选择该选项. (在键盘上按N). 新手可以暂时不理会其它选项,把默认为M的选项全部取消(在键盘上按N).
Power management options --->
支持电源管理,可以保证在设备不使用的时候,关闭电源以节省能源,当CPU空闲的时候,降低主频等功能。 这里我们取消所有的选项。
Bus options (PCI etc.) --->
各种总线的支持。 这个选项中,我们只选择
[*] PCI support
其它的全部取消。
网络支持,包括TCP/IP,红外,无线等。
这里我们只需选择
Networking --->
[*] Networking support
Networking options --->
<*> Unix domain sockets
[*] TCP/IP networking
除此之外Networking选项下面的其它选项全部取消。 这下面是各种驱动程序,我们只需要做以下选择:
Device Drivers --->
[*] Block devices --->
<*> Loopback device support
< > ATA/ATAPI/MFM/RLL support ---> x x
SCSI device support --->
<*> SCSI disk support
<*> Serial ATA (prod) and Parallel ATA (experimental) drivers --->
这是VirtualBox虚拟的Intel南桥设备.
<*> Intel ESB, ICH, PIIX3, PIIX4 PATA/SATA support
网络设备
[*] Network device support --->
[*] Ethernet (10 or 100Mbit) --->
[*] EISA, VLB, PCI and on board controllers
<*> AMD PCnet32 PCI support
VirtualBox 提供的虚拟网卡设备是AMD PCnet32和Intel Epro 1000,默认为PCnet32.如果你选择的是E1000,可以在这里选择
[*] Ethernet (1000 Mbit) --->
<*> Intel(R) PRO/1000 Gigabit Ethernet support
输入设备:
Input device support --->
[*] Keyboards --->
<*> AT keyboard
Character devices --->
[*] Virtual terminal
[*] Support for console on virtual terminal
<*> /dev/nvram support
<*> Enhanced Real Time Clock Support
除此之外,你可以取消Device Drivers其它的任何选项。
Firmware Drivers --->
取消Firmware Drivers下面的任何选项。
文件系统:
File systems --->
选择全部EXT2和EXT3。
[ ] Instrumentation Support --->
取消Instrumentation Support 中的任何选项。
Kernel hacking --->
[*] Kernel debugging
[*] Compile the kernel with debug info
只选择这一项,保证编译出来的内核包含了用于调试的符号信息。
对于剩余的以下选项:
Security options --->
[ ] Cryptographic API --->
Library routines --->
你可以取消任何选项及其子选择。
现在你已经配置好了可以在VirtualBox中运行的最小化的内核,注意不能运行XWindow系统,不过对于内核试验来说,命令行就足够了。
Linux内核编译
在你的shell中,输入
make bzImage
可以看到,由于我们把不必要的选项全部去除了,因此编译过程非常的快。
cp arch/x86/boot/bzImage /tmp
然后,你可以到VirtualBox的系统中运行
scp user@IP:/tmp/bzImage /boot/test
这样就把/tmp/bzImage拷贝到VirtualBox中的系统中的/boot/test了。 如果没有安装sshd,你可以利用nc来把编译得到的bzImage传递到VirtualBox中。首先在host机器中运行:
# cat arch/x86/boot/bzImage | nc -l -p 8989 -q 0
然后到VirtualBox中的Guest机器中运行:
# nc 10.0.2.2 8989 > /boot/test
在VirtualBox中,默认使用10.0.2.2可以访问host主机,如果你修改了默认配置,请做相应的调整,8989可以是任意一个没被使用的端口号。
现在编辑VirtualBox中的/boot/grub/menu.lst,你拷贝一个现有的模板,修改成下面这个样子:
title My Test Kernel(Command Line)
root (hd0,5)
kernel /boot/test root=UUID=a333aaa5-51a5-4992-81c8-85e15c35b105 ro single
initrd /boot/initrd.img-2.6.24-19-generic
你只需要修改title和/boot/test这两项就可以了,其它的都不要动,注意kernel那一行后面一定要指定为single,否则是不能进入XWindow。然后重启VirtualBox中的系统,选择你自己编译好的内核,赶紧看看结果吧。以后你就可以通过这个方式来进行内核试验。
现在,你可以打开init/main.c,在start_kernel函数中,加入 printk("Hello kernel\n"); 然后编译... 启动你自己的内核后,在shell中输入: dmesg | grep Hello 赶紧试试去吧!!


