Linux2.6內核升級剪裁(幾年前的畢業設計之一)

 
21內核剪裁平臺
(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備份系統。
 
22 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王者之路上具有里程碑意義的時刻。
 
23 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。
  現已完成了內核的升級,下面將進行內核的剪裁。
 
24 通過條件編譯剪裁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引導選項的修改。

25 嵌入式Linux內核配置說明(見附錄1)
 
本章首先介紹了Linux2.6內核中一些適應於嵌入式系統的新特點,接着詳述了Linux2.6內核的升級過程及Linux內核的剪裁方法,最後給出了嵌入式Linux內核的詳細配置文檔。爲了方便閱讀,特將該文檔放在附錄1中。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章