CF卡上的Linux啓動過程分析

CF卡上的Linux啓動過程分析

   一個嵌入式linux操作系統可以簡單的抽象爲,引導程序bootloader、內核vmlinuz、文件系統filesystem。

    Bootloader是系統加電後運行的第一段代碼,一般它只在啓動系統時非常短的時間按內運行。對於linux系統來說,這是至關重要的一步。在系統中,整個bootloader由系統中的bios和u盤中MBR(主引導扇區)的一段代碼來共同完成引導任務。這裏我們採用grub引導方式。系統先將BIOS檢測到的MBR內容讀取到RAM中,然後將系統控制權交給grub,最後由grub負責把要引導的操作系統的內核鏡像讀取到系統RAM中,然後跳轉到內核的入口點。

vmlinuz是Linux 內核的鏡像文件,可以被引導程序加載,從而啓動Linux系統。  

    initrd的全稱是boot loader initialized RAM disk,它是系統啓動時所使用的根文件系統映像文件,這個文件系統中包含幾個驅動模塊,都是系統啓動時所必須加載的,另外當我們需要加載其它的模塊時,也可以放在其中。


一、引導程序Grub


   機器加電啓動後,BIOS開始檢測系統參數,如內存的大小,日期和時間,磁盤設備以及這些磁盤設備用來引導的順序,通常情況下,BIOS都是被配置成首先檢查軟驅或者光驅,然後再嘗試從硬盤引導。如果在這些可移動的設備中,沒有找到可引導的介質,那麼BIOS通常是轉向第一塊硬盤最初的幾個扇區,尋找用於裝載操作系統的指令。裝載操作系統的這個程序就是boot loader。    

linux裏面的bootloader通常是lilo或者grub,從Red Hat Linux 7.2起,GRUB取代LILO成爲了默認的啓動裝載程序。那麼啓動的時候grub是如何被載入的呢?

grub有幾個重要的文件,stage1,stage2,有時候還需要stage1.5。這些文件

一般都在/boot/grub文件夾下面。grub被載入通常包括以下幾個步驟:

1、裝載基本的引導裝載程序(stage1)  

stage1很小,只有512字節,

stage1通常位於主引導扇區裏面,它的主要功能就是裝載第二引導程序(stage2)。這主要是因爲在主引導扇區中沒有足夠的空間用於其它東西, grub中stage2文件的大小是103.9K。

2. 裝載第二引導裝載程序(stage2)  

   這第二引導裝載程序實際上是引出更高級的功能,以允許用戶裝載入一個特定的操作系統。在GRUB中,這步是讓用戶顯示一個菜單或是輸入命令。

   上面還提到了stage1.5這個文件,它的作用是什麼呢?在/boot/grub目錄下可以看到有fat_stage_1.5  e2fs_stage_1.5 xfs_stage_1.5等等,很容易猜想stage1.5和文件系統有關係,有時候基本引導裝載程序(stage1)不能識別stage2所在的文件系統分區,那麼這時候就需要stage1.5來連接stage1和stage2了.因此對於不同的文件系統就會有不同的是stage1.5。但是對於我們做的grub好像stage1.5並不是很重要,因爲我試過了,在沒有stage1.5的情況下, 我把stage1安裝在格式化爲ext3的CF卡中,能夠正常引導,並不需要e2fs_stage_1.5或者fat_stage_1.5。    

   我們的具體做法是把整個CF卡格式化爲一個分區,文件系統爲ext3格式,然後把stage1、stage2、grub.conf這幾個啓動的時候必須的文件拷貝到CF卡的指定目錄下,然後進入grub使用一些命令將其安裝到CF卡上。


二、內核配置


Linux內核所控制的東西非常廣,從文件系統格式、程序開放、電源管理到用戶的安全性等一大堆的項目,甚至連網絡帶寬的分配都在其中,由此可知內核的重要性。但是針對我們現在做的系統,在內核配置中我們主要對下面這些選項感興趣

1、 Loadable module support  對模塊的支持,這裏面有三項:   Enable loadable module support:除非你準備把所有需要的內容都編譯到內核裏面,否則該項應該是必選的。

 Set version information on all module symbols:表示該模塊不跟內核一起發佈,通常不選。

 Kernel module loader:該選項表示內核可以實現模塊加載的功能。Kernel程序可以在需要的時候自動調用模塊,而在不用該功能的時候自動卸載該模塊

2、Processor type and features  

在它的下面,同樣有很多的選項,但我們只關心Processor family:根據我

們自己的情況選擇CPU類型。在我們的故障診斷儀上,經過試驗證明選擇386、486或586/K5/5x86/6x86/6x86MK都可以,但是選擇Pentium-3/Celeron或者Pentium-4不行。

3、General setup

 這裏是對最普通的一些屬性進行設置。這部分內容非常多,一般使用缺省設置就可以了。但是必須選上,因爲裏面有PCI總線支持,電源管理模式等的支持。

4、Block devices

在它的選項下,我們一定要選的是: RAM disk support:。  

(65536)default ramdisk size Initial ramdisk(initrd)support

因爲我們做的就是ram disk,所以我們必須把這些都選上,內核不支持的話在內核啓動完後是不能加載根文件系統的。其中的65536K是我們在內存中開闢的根文件系統空間。這裏就是64M,我們可以根據我們的需要進行調整。

5、Character devices

一些字符設備的支持,例如鼠標,虛擬終端的支持等,使用缺省的就可以了。 6、Filesystem

在這裏主要是要把ext3文件支持,/proc文件系統支持選上,一般默認即可。因爲我們在後面做出的文件系統鏡像是ext3格式的,所以內核必須對此文件格式支持。/proc文件系統是linux提供給用戶和系統進行交互的通道,也要選上。

另外second extended fs support是標準的linux文件系統,建議編譯進內核。其它的文件系統類型我們可以根據自己的愛好進行選擇。

7、Console drivers

 因爲我們還沒有桌面系統,我們選擇的是VGA text console, 如果沒有選擇這項的話,開機運行到下載內核時就停止了。

另外對於IDE的支持,我們在不選的情況下系統是可以正常啓動和工作的。但是我們的系統只是工作在內存中,我們即使把要運行的程序放在其中,關機後什麼都沒有保留。所以我們要在系統啓動起來後重新把CF卡掛載到系統中,然後把程序運行的結果都保存在CF卡上,這樣即使關機CF卡上也已經保存了我們程序的運行結果。所以我們在系統中必須加上對IDE的支持。同理,假如我們的系統要支持USB設備時,我們應該在配置選項中選擇支持USB和SCSI。也就是添加上usb的驅動。這裏選擇SCSI的原因是隻有支持SCSI時在USB的配置選項中才會出現USB Mass storage support。


三、文件系統


我們的文件系統是通過busybox工具做出來的,busybox集成了linux常用的命令和工具。這些命令和工具我們都可以根據自己的情況進行選擇。另外我們還可以選擇是靜態編譯還是動態編譯。這些選擇都是通過配置界面進行的。它的配置界面和內核配置界面類似,配置方法也是一樣的。使用的命令也是make menuconfig。我們做的時候選擇了靜態編譯的方法,也就是我們在編譯程序的時候,需要在參數中指定爲靜態編譯。例如在編譯hello.c程序時我們的命令是

#gcc –o hello –static hello.c

如果我們不用-static,那麼我們在執行程序時就會出現錯誤。因爲我們的文件系統中沒有加上相應的庫。當然我們也可以選擇動態編譯,然後在文件系統中把相應的庫文件添加進去。

最終我們的文件系統是做成了ram disk鏡像的形式。也就是initrd.img。


四、linux啓動過程


BIOS在開機上電後尋找引導程序grub,然後grub引導加載內核,當grub加載內核時,內核會先在內存中製造出一個rootfs當作臨時的空間供系統使用,接着kernel便會把我們做出來的文件系統鏡像當作一個系統將其掛載到rootfs上激活。當系統鏡像被激活後,它會找到並執行其中的linuxrc程序,linuxrc會按照其中的腳本文件/etc/initab執行,一直到系統啓動完畢並出現shell命令行。

下面將對這幾個過程依次說明:

1、grub引導內核。

在我們前面製作grub時我們拷貝了一個grub.conf文件,它就是grub的配置文件,它的作用就是用來找到內核和根文件系統。它的內容如下:

timeout=10

title Red Hat Linux        

root (hd0,0)

kernel   /boot/bzImage          

initrd   /boot/initrd.img

timeout就是啓動時的延時時間,title是啓動畫面上出現的操作系統名稱。

root (hd0,0)  

指示我們的系統在第一個硬盤的第一個分區上

kernel  /boot/bzImage  

指示我們的內核文件所在的目錄

initrd  /boot/initrd.img  

指示我們的文件系統鏡像所在的目錄

2、linuxrc程序的執行

   在前面我們說過,linuxrc程序按照腳本文件/etc/initab依次執行,根據這個腳本文件,在我們自己的系統中,它會首先執行/etc/init.d/rcS程序,該程序的內容如下:

#!bin/sh /bin/mount –a

  它的意思是加載/etc/fstab下的所有文件。/etc/fstab下的內容如下: proc

/proc proc defaults 0 0

 這裏首先說下fstab文件格式  下面是/etc/fatab文件的一個示例行:

 fs_spec  fs_file  fs_type  fs_options  fs_dump   fs_pass

/dev/hda1  /usb    ext3   defaults       0          0

簡單的說,第一項是我們要掛載的設備文件描述符,第二項是要掛載到哪個目錄下,第三項是我們設備的文件系統類型。後面三項對於我們來說一般是不變的。詳細的說明可以看下面的描述:

   例如在開機啓動時,我們要將我們的CF卡自動掛載到系統中去,我們就在fstab文件中增加如上實例中的內容。

   這樣我們的CF卡在開機啓動時就自動掛載到了系統中,但是自動運行我們自己的程序該怎麼辦呢?我們應該注意到在執行linuxrc程序時首先執行的是/etc/init.d/rcS中的內容,剛纔我們的掛載就是其中的一個小程序。所以我們完全可以在其中增加開機時我們需要執行的其它程序,比如說我們有一個可執行二進制文件hello,我們就可以在其中增加這個語句: ./usb/hello


   其中usb是我們CF卡的掛載目錄,我們的二進制可執行程序hello就位於這個目錄。

   到此爲止,我們的linux操作系統開機運行,自動加載CF卡,自動運行程序就完成了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章