天天看點

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的第一張CD光牒的鏡像檔案或實體光驅的CD光牒。 (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中。

繼續閱讀