为了学习内核代码,打算在虚拟机上学习代码,所以先把内核进行重新编译一次。对比了virtualbox和vmware,发现virtualbox虽然比较简单方便,但是还是商业化的vmware功能比较强大。记录一下遇到的问题:
安装vmware8.0.1,但是为了安装redhat9,所以设置了6.0的硬件,并且硬盘需要使用ide接口的,否则为了让redhat9这老古董去支持scsi太麻烦了,所以还是少折腾了。
网卡还是出问题了,解决方法:
以root权限,编辑 /etc/sysconfig/network-scripts/ifcfg-eth<n> 和
/etc/sysconfig/networking/devices/ifcfg-eth<n>
其中<n>是数字,比如eth0,
在每个文件中添加:
check_link_down ()
{
return 1;
}
从官方下载了2.4.0的内核版本,因为能够和正在看的linux内核源代码情景分析同步,放的虚拟机编译,失败。。。。。。预料之中。
出现4点报错:
1.xtime报重复包含,/usr/src/linux-2.4/include/linux/sched.h 和/usr/src/linux-2.4/include/asm/system.h,从网上找到解决办法
vim include/linux/sched.h
找到extern struct timeval xtime;
修改为extern volatile struct timeval xtime;
2.boot makefile -oformat不对 改成--oformat
3.driver/pci 还是makefile不对 对比2.4.20版本修改
4.所有的工作重新开始,在内核配置时要选中SCSI support——>SCSI low-level drivers——>BusLogic SCSI support,将其选为模块加载的方式,然后保存退出,然后接着往后进行内核的编译和模块的编译。
解决完这些问题,终于可以编译了,步骤如下:
make mrproper 把原来编译产生的垃圾删除
配置内核可以根据需要与爱好使用下面命令中的一个:
#make config (基于文本的最为传统的配置界面)
#make menuconfig (基于文本选单的配置界面)
#make xconfig (基于图形窗口模式的配置界面)
#make oldconfig (如果只想在原来内核配置的基础上修改一些小地方,会省去不少麻烦)
#make dep (确保关键文件在正确的位置) 2.5.*-2.6.0都不需要了。其实2.4.*某些内核也不需要了。
#make clean (确保所有有关文件都处于最新版本状态)
#make zImage (编译压缩形式的内核)
在需要内核支持较多的外设和功能时,内核可能变得很大,此时可以编译大内核:
#make bzImage
编译的时间与机器的硬件条件及内核的配置等因素有关,所获得的内核的位置在/usr/src/linux/arch/i386/boot目录下,当然这里假设用户的CPU是x86型的。
#make modules (编译选择的模块)
#make modules_install (将编译后的模块转移到系统标准位置)
# make install
编译完后查看grub的menu.lst,多出了一个选项,reboot选到新的内核,好吧,又失望了,这次是内核初始化里面的一个函数报不能为空,估计是旧版本内核没有这个指针导致执行初始化程序时取不到指针,哎,内核定位以后再慢慢搞,看来还是的先用redhat9自带的内核版本来用,版本差距不大,后面再去分析吧。