Linux2.6内核升级剪裁(几年前的毕业设计之一)

 
2.1内核剪裁平台
(1) 安装WindowXP或Windows2000或Windwos2003为主系统。
(2)安装VMware WorkStation4.0.1。最好不要装在C盘。最好专门准备一个空间足够大(至少5G)用来安装RedHat9.0虚拟操作系统、系统备份文件和文档。
(3)用VMware创建一个硬件平台。
   系统:linux.。
      内存:平台安装的时候,系统默认使用128MB(装好系统后可改为64MB)的内存。如果低于128M内存的话,redhat9.0安装过程中,会提示提前使用虚拟内存,安装过程会变得很慢。装好过后,为了让主系统windows流畅运行,且由于文本界面的linux所耗用内存较少,可以把内存减至64M。
   硬盘:SCSI(2.0GB)。系统是模拟SCSI硬盘对U盘进行访问,要将系统移植到U盘上,必须在内核编译时选上SCSI硬盘。
   光驱:指向RedHat9.0的第一张光盘的镜像文件或物理光驱的光盘。
(4)安装RedHat9.0。选择服务器版+内核开发+编程开发。
(5)设置虚拟机的共享文件夹。具体步骤如下:

  Edit virtual machine settings Options Shared Folders 设置相应的文件夹。

   共享文件夹用于虚拟机和主机之间的文件共享。
(6)安装vmware-tools
将虚拟机的光驱指向VMware安装文件中的linux.iso镜像文件,进入RedHat9.0.

#mount /mnt/cdrom

#cd /usr/src/

#tar zxvf /mn t/cdrom/vmware-linux-tools.tar.gz

#cd vmwrae-tools-distrib

#./vmware-install.pl
然后一路回车即可。
安装完vmware-tools即可使用共享文件夹。
      /mnt/hgfs/yourShareFolder 即是与windows之间的共享文件夹。将RedHat所需的相应软件放入windows中的对应文件夹,就可以在/mnt/hgfs/yourShareFolder目录中看到相应的软件。现在将Kernel2.6.0、modules-init-tools、busybox、mkintrd等软件放入对应的windows文件夹中。
(8)利用虚拟机中的Snapshot备份系统。
 
2.2 Linux2.6内核的特点
众所周知,Linux在嵌入式系统中的应用已经非常普遍。为了进一步促进这方面的应用,在Linux 2.6中,引入了很多非常有利于嵌入式应用的功能。这些新功能包括实时性能的增强、更方便的移植性、对大容量内存的支持、支持微控制器和I/O系统的改进等。
(1)响应时间的改进

嵌入式系统通常需要稳定的时间限制。虽然Linux 2.6还不是一个真正的实时操作系统,但说到其改进后的响应能力更加适合于这一领域的需求。
   
(2)抢占式内核

和其它大多数通用操作系统一样,当一个进程被系统调用并处于运行状态时,以前版本的Linux是不允许进程进行调度的。在很多时候这会导致一些更重要的任务在等待系统调用完成的过程中被耽搁。 现在,内核在一定程度上使用了可抢占的模式。因此,在一些时效性比较强的事件中,Linux 2.6要比2.4具有更好的响应能力(虽然它实际上并不是一个真正的RTOS)。
(3)高效的调度程序

在2.6版本中,进程调度经过重新编写,去掉了以前版本中效率不高的算法。

(4)新的同步措施
Linux 2.6 内核支持所谓的FUSM(Fast User-Space Mutex)。这个新功能会检查用户的空间,查看是否会有等待的情况出现,并且只有在线程需要等待时才进行系统调用。而当等待不需要时,就会避免不必要的系统调用以节约时间。该功能也使用优先级调度,以便在出现竞争时决定哪一个线程可以被执行。
(5)共享内存的改进

嵌入式系统有时也是一个有很多处理器的设备,一般都是共享内存的。均衡多进程的设计是所有的处理器都有对内存有均等使用权,而限制使用内存的决定性因素是进程的效率。Linux 2.6为多程序提供了一种新方式:NUMA(Non Uniform Memory Access)。这种方式减少了内存竞争造成的瓶颈,因而提高了吞吐量。

(6)POSIX线程、信号和计时器
POSIX 标准描述的是一套用于创建和管理POSIX线程的功能。在2.6内核中,它得到了很大的改进。与POSIX线程一起,2.6把POSIX信号和POSIX高精度计时器作为了主流内核的一个组成部分。POSIX信号比以前Linux版本中使用的Unix模式的信号有了很大的改进。
(7)支持通用设计

嵌入式世界里的硬件设计通常都要经过定制,以满足特定的应用程序。在2.6内核中,就引入了一个名为子框架的概念。在新的定义中,各组件被清晰地分开,并且可以独立进行更改或替换,而不会对其它的组件或软件包造成影响,或者影响非常小。

(8)设备、总线和I/O

Linux 2.6使用的是USB 2.0,它要比一般的USB快40倍。

(9)对64位处理器的支持
在一些嵌入式系统中,计算机要提供非常多的资源,比如很大的内存和高吞吐量的多处理器。使用2.6内核,对于那些需要大量内存的嵌入式Linux开发人员就可以选择64位的处理器。Intel安腾64位处理器在以前的Linux版本中就已经被支持,而在新版本中,更是包含了对AMD64体系结构和 PPC64的支持。
(10)支持微控制器
现在主流的Linux 2.6内核中,也提供了对微处理控制器的支持。以前,大多数情况下Linux都需要一个包含内存管理的全功能微处理器。然而,在嵌入式市场领域,更简单的微控制器更适于低价和简单的应用。2.6内核支持一些没有内存管理单元的微控制器。
(11)32位处理器上的大容量内存

有时,嵌入式系统可能需要使用通用的Intel架构处理器,但是却需要超出一般32位地址空间所能访问的内存。对此,Intel引入了一个名为PAE(物理地址扩展)的概念,这使得32位的处理器可以访问达64GB的内存。Linux 2.6对PAE的支持使得它尤其适于那些需要快速处理大量数据的应用程序之中。

Linux 价格低、功能丰富和开放的特性,使其成为了嵌入式世界里发展最快的操作系统。可以预见,Linux在嵌入式领域里将成为真正的王者,而2.6版本的推出,则是Linux王者之路上具有里程碑意义的时刻。
 
2.3 Linux内核升级
(1) module-init-tools的升级
因为2.6内核模块装入器有所改变,所以我们需要编译modutils。否则在make modules时,会有许多“unresolved symbol”的错误,我用的是0.9.14的版本。module-init-tools的升级步骤如下:

#cd /usr/src/

#tar jxvf /mnt/hgfs/yourShareFolder/module-init-tools-0.9.14-prel.tar.bz2

#cd module-init-tools-0.9.14

#./configure --prefix=/   //如不加”--prefix=/”

//make moveold”时将会、出错

#make

#make moveold

#make install

 
(2)内核升级
先将内核解压缩到/usr/src目录下:

#cd /usr/src/

#tar jxvf /mnt/hgfs/yourShareFolder/linux-2.6.0.tar.bz2

#cd linux-2.6.0

 
再对内核进行相应的配置:

#make menuconfig

如果用的是Ext3文件系统,需要在定制内核配置文件时把对Ext3、Ext2文件的支持直接编译进内核。否则,系统无法挂载文件系统,并出现如下错误提示:

kernel panic : no init found ,try passing init = option to kernel......

或者是:

kernel panic:VFS:Unable to mount root fs on unknown-block(0,0)

因为U盘空间有限,Ext2文件系统已能满足系统要求,而且Ext3文件系统的内核模块较大,为减少内核,所以使用Ext2文件系统。只需要在定制内核配置文件时把对Ext2文件的支持直接编译进内核,不要选择对Ext3文件系统的支持(即不要编入内核,也不要选为模块)。否则也会出现类似上面的错误。
因为选的是SCSI硬盘,故应把

Device Drivers

<*>SCSI device support

<*>SCSI disk support

SCSI low-level drivers

<*>BusLogic SCSI support

等SCSI的驱动模块编入内核,否则内核无法识别硬盘。
 
最后对内核进行编译,Linux2.6的编译相比以前版本的内核编译,简化了不少,具体步骤如下:

#make bzImage

#make modules && make modules_install

#cp drivers/scsi/BusLogic.ko /lib/modules/2.6.0/kernel/derivers/scsi

#make install

make install会自动将相关文件安装到/boot目录下,如bzImage 、vmlinux、System.map,同时生成initrd文件,并在grub.conf中增加相应启动项,所以不需要手工修改grub。但在生成initrd时需要BusLogic.ko模块,而编译内核时已把BusLogic.ko编入内核,故2.6.0模块目录中没有它,所以在执行make install之前,要先拷贝BusLogic.ko模块到对应目录下。否则make install执行时会出错,并且无法生成initrd文件,导致系统无法正常启动。

#reboot
 

(3) /etc/rc.sysinit脚本的修改

上步完成后,启动系统,grub中已出现了Linux2.6引导选项,将系统在Linux2.6内核下启动,会发现在启动过程中出现很多错误提示,而且iptables防火墙服务无法启动,这还需要修改rc.sysinit启动脚本。
①文件(/etc/rc.d/rc.sysinit)可能有缺陷,因为/proc/ksyms文件在新内核(kernel2.6.0)中已经没有了,造成模块无法加载,iptables network, loopback interface 不能启动。打开rc.sysinit文件:
#vi /etc/rc.d/rc.sysinit
找到:

if ! LC_ALL=C grep -iq nomodules /proc/cmdline 2>/dev/null && [ -f /proc/ksyms ]; then

USEMODULES=y

fi
替换成:

if ! LC_ALL=C grep -iq nomodules /proc/cmdline 2>/dev/null; then

USEMODULES=y

fi
②将脚本中的
# Start up swapping.

action $"Activating swap partitions: " swapon -a –e

 
# Now turn on swap in case we swap to files.
#swapon -a
#action $"Enabling swap space: " /bin/true
去掉或注释掉,因系统中已没有交换区了。
③将脚本中的

# Mount all other filesystems (except for NFS and /proc, which is already

# mounted). Contrary to standard usage,

# filesystems are NOT unmounted in single user mode.

action $"Mounting local filesystems: " mount -a -t nonfs,smbfs,ncpfs -O no_netdev

去掉或注释掉,因内核已已不动持其他文件系统了。
④将文件中与USB相关的都注释掉,因USB模块已编入内核或在initrd文件中提前加载,不需要在rc.sysinit启动时加载USB模块。
⑤在脚本中加入

modprobe  pcnet32

ifconfig eth0 25.20.188.137 

以在系统启动加载网卡驱动,并激活网卡。其中pcnet32
为虚拟机的网卡驱动,当系统被移植到其他平台时,应更
换相应的网卡驱动。在U盘上启动时用,将pcnet32替换
为8139too,因为我PC机上物理网卡的驱动为8139too。
  现已完成了内核的升级,下面将进行内核的剪裁。
 
2.4 通过条件编译剪裁Linux内核
Linux 系统采用的条件编译系统是方便了系统管理员对内核的剪裁行为的。事实上,Linux内核要考虑到的硬件平台极为广泛,CPU就是从最早支持的I386系列(包括Intel386、486、Pentium、Ppro、P2、P3,对某些如Pentium的浮点运算错误都有专门处理)到Alpha、Sparc、MIPS、PowerPC、Motorola68xxx各个系列,各种的存储设备板卡外设更是都有。其中如板卡外设之类的驱动程序,由于通用字符或块设备接口和动态加载模块技术的应用,根本不会涉及本质改变。而如CPU芯片体系的不同,则会极大地影响着内核的设计和代码的细节。Linux的一套代码基可以编译产生不同体系平台的代码,当然是靠广泛分布于的条件编译设置和一些方便编译的脚本。
make config( 图形化的有make menuconfig、make xconfig)产生.config文件,写include/linux/autoconfig.h文件,并在每一个c源文件中加有<linux/confg.h>,使define的宏CONFIG_XXX起全局性的作用。
make bzImage 这一步方是正式的编译连接。一般是连接kernel.ko、mm.ko、fs.ko,生成vmlinux,为内核的未经压缩的部分。然后,除去符号及多余段,lbjcopy o binary R .note R .comment S /
commpressed/vmlinux compressed/vmlinux.out
compressed/vmlinux 再经gzip压缩。
arch/i386/boot/tools/build.c 描述了如何bootsect、setup、压缩的vmlinux三者组成了最后可引导的bzImage.

还有make modules、make modules_install处理module(多为驱动程序)。再经make install完成内核和模块的安装以及对grub引导选项的修改。

2.5 嵌入式Linux内核配置说明(见附录1)
 
本章首先介绍了Linux2.6内核中一些适应于嵌入式系统的新特点,接着详述了Linux2.6内核的升级过程及Linux内核的剪裁方法,最后给出了嵌入式Linux内核的详细配置文档。为了方便阅读,特将该文档放在附录1中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值