1. 程式人生 > >Linux核心映象及根檔案系統製作

Linux核心映象及根檔案系統製作

一、系統開發平臺介紹

   本次試驗是基於九鼎創展公司嵌入式開發板x210v3, 核心處理器是ARM Cortex–A8架構的S5PV210,主頻1GHz。  PC機Linux版本:Ubuntu Kylin 14.04  核心版本:3.13

二、Linux核心配置和編譯

2.1 基本原理介紹

2.1.1目錄簡介

Linux目錄基於“檔案系統層次標準”(FHS),目錄為樹形結構。該標準定義了不同目錄的結構和功能。基本目錄如下:

arch:architecture的縮寫,包含與體系結構相關的核心程式碼,實驗中我們用到的是ARM體系結構;

drivers:裝置驅動程式,如block:部分塊裝置驅動程式,char:字元裝置驅動程式,其他的還有cdrom、pci、scsi、net、sound等;

fs:存放各種檔案系統的實現程式碼。每個子目錄對應一種檔案系統,如:

||devpts-/dev/pts虛擬檔案系統  ||ext2-第二擴充套件檔案系統

||fat-fat32檔案系統            ||isofs-iso9660光碟cd-rom上的檔案系統

include:含核心所需標頭檔案;

init:含核心初始化程式碼;

ipc:程序間通訊的實現程式碼;

kernel:Linux大多數關鍵的核心功能都是在這個目錄實現;

(排程程式,程序控制,模組化)

lib目錄:庫檔案程式碼;

Mm:用於實現記憶體管理中與體系結構無關的部分(與體系結構相關的部分在arch下);

Net:網路協議的實現程式碼。如:

||802-802無線通訊協議核心支援程式碼  ||ipv4-ip協議族V4版32未定址模式

||ipv6-ip協議族V6版

Scripts:含配置核心的指令碼檔案;

2.1.2 核心配置的基本結構

Linux核心的配置系統由三部分(或者四部分,區別在於分類方式)組成:

1)   Makefile:分佈在 Linux 核心原始碼中的 Makefile,定義 Linux 核心的編譯規則,在頂層及各子目錄下都有。頂層 Makefile 有兩個主要的任務:產生 vmlinux 檔案和核心模組(module); 另一個檔案Rules.make 為規則檔案,定義了所有 Makefile 共用的編譯規則。

2)   配置檔案(config.in):給使用者提供配置選擇的功能。檔案中有許多的配置變數等式,用來說明使用者配置的結果。例如 CONFIG_MODULES=y 表明使用者選擇了 Linux 核心的模組功能。

3)   配置工具:包括配置命令直譯器(對配置指令碼中使用的配置命令進行解釋)和配置使用者介面(提供基於字元介面、基於 Ncurses 圖形介面以及基於 Xwindows 圖形介面的使用者配置介面,各自對應於 Make config、Make menuconfig 和 make xconfig)。本次實驗使用的是make menuconfig

2.2 核心配置過程

1.利用tar 指令解壓核心並進入解壓出的核心資料夾,試驗中使用的核心是已經移植好的與開發板配套的核心;

2.ExportARCH=arm  ;選擇處理器構架為arm平臺,執行完該指令之後Makefile  將使用以arm平臺為基礎的程式碼

3.Makeclean  ;清除之前編譯的殘留成分

4.makemenuconfig 進入配置的選單介面

為保證作業系統正常啟動,需要配置一下幾個部分:

1)general setup——>(核心編譯配置的基本方法)

cross-compiler tool prefix 選項中設定交叉編譯器的路徑及字首;

Initial RAM filesystem and RAMdisk(initramfs/initrd)  support 用於核心啟動時裝載ramdisk作為它的根檔案系統;

由於ramdisk使用的是gzip壓縮方式,故還應選擇 support initial ramdisks compressed using gzip ;

2)system type ——>(系統選型)

ARM system type 一項中應選擇與開發板配套的 (samsungS5PV210/S5PC110);

3)device drivers——>(裝置驅動)

應支援塊裝置驅動:block devices——>RAMblock device support;

此外,選擇預設的ramdisk 的大小為8192kbytes(8M);

3)File systems ——>(檔案系統)

由於ramdisk使用的ext2檔案系統,故應選擇支援ext2檔案系統(屬於磁碟檔案系統)、另外在網路檔案系統中應選中NFS,保證NFS的客戶端支援,後面的開發中將要使用到。

配置完成後儲存並退出,配置的資訊會儲存在 .config檔案中。另外也可以將已配置好的config配置檔案內容直接複製到當前的.config檔案當中;之前的配置自動儲存與config.old檔案內,必要時可以進行恢復。

5、make 對核心進行編譯,生成zImage檔案,儲存在核心目錄下的 arch/arm/boot/zImage中。

注:也可以使用make –j4指令編譯核心。這裡的-j4指的是4核同時編譯,可以加快編譯速度,減少等待時間。

至此第一個實驗已經完成,生成了實驗所需要的核心映象檔案zImage。

Ø 核心映象檔案的對作業系統的作用

    核心映象檔案zImage是核心的linux核心vmlinux經過壓縮後得到,它有點類似於windows系統中的ISO檔案,其中包含了可執行的二進位制指令(核心),除錯資訊,符號表等內容,為可執行的二進位制核心映象,可以說是整個作業系統的核心部件。同時,zImage可以燒寫到Flash中,方便載入進入我們需要的嵌入式系統。

三、嵌入式檔案系統的構建

3.1  Linux常用檔案系統及其優缺點

1)  RomfS:只讀檔案系統,可以放在ROM空間,也可以在系統的RAM中

優點:相對簡單、佔用空間較少。

缺點:檔案系統Romfs為只讀檔案系統,禁止寫操作,因此係統同時需要虛擬盤(Ramdisk)支援臨時檔案資料檔案的儲存.

2)  Ext2fs/Ext3fs(以Ext2fs為例)

優點:支援4 TB 儲存、檔名稱最長1012 字元;可選擇邏輯塊;快速符號連結 

缺點:Ext2fs不適合flash裝置;是為象IDE裝置那樣的塊裝置設計的,邏輯塊大小必 須是512 byte、1KB、2KB等;沒有提供對基於扇區的擦除/寫操作的良好管理;如果在一個扇區中擦除單個位元組,必須將整個扇區複製到 RAM,然後擦除,再重寫入;在出現電源故障時,Ext2fs 是不能防止崩潰的;檔案系統不支援損耗平衡,縮短了flash的壽命

3)   JFFS/JFFS2:是為Flash設計的日誌檔案系統日誌檔案系統 

優點:提供了更好的崩潰、掉電安全保護;支援對flash的均勻磨損;在扇區級別上執行快閃記憶體擦除/寫/讀操作要 比Ext2檔案系統好;

缺點:檔案系統接近滿時,JFFS2 會大大放慢執行速度(垃圾收集);jffs/jffs2啟動的時候需要掃描日誌節點,不適合大容量的Nand flash;jffs的日誌通過jffs_node建立在RAM中,佔用 RAM空間:如對於128MB的Nand大概需要4MB的空間來維護節點!

3.2  以BusyBox為基礎構建適合的檔案系統

3.2.1 根目錄介紹

目錄名

存放的內容

/bin

必備的使用者命令,例如ls、cp等

/sbin

必備的系統管理員命令,例如ifconfig、reboot等

/dev

裝置檔案,例如mtdblock0、tty1等

/etc

系統配置檔案,包括啟動檔案,例如inittab等

/lib

必要的連結庫,例如C連結庫、核心模組

/home

普通使用者主目錄

/root

root使用者主目錄

/usr/bin

非必備的使用者程式,例如find、du等

/usr/sbin

非必備的管理員程式,例如chroot、inetd等

/usr/lib

庫檔案

/var

守護程式和工具程式所存放的可變,例如日誌檔案

/proc

用來提供核心與程序資訊的虛擬檔案系統,由核心自動生成目錄下的內容

/sys

用來提供核心與裝置資訊的虛擬檔案系統,由核心自動生成目錄下的內容

/mnt

檔案系統掛接點,用於臨時安裝檔案系統

/tmp

臨時性的檔案,重啟後將自動清除

3.2.2 實驗步驟

1、編譯BusyBox:

按照Make menuconfig——>make——>make install順序編譯BusyBox,編譯完之後的程式碼安裝在指定目錄_install目錄下,主要是生成/bin、/sbin、/usr/bin、/usr/sbin目錄,儲存常用命令的二進位制檔案。

2、做一個8M的ext2檔案系統

#ddif=/dev/zero of=ramdisk_img bs=8k count=1k ;建立一個8M的檔案

#/sbin/mke2fsramdisk_img     ;將該檔案格式化為一個ext2檔案系統

3、在/mnt目錄下建立一個名為ramdisk的目錄,將之前做的ramdisk_img檔案系統掛載到該目錄,有兩種方式:

   方式一:

#sudo mountramdisk_img /mnt/ramdisk/ -o loop  ;將ramdisk_img作為檔案系統掛載到指定目錄(需要超級使用者許可權)

方式二:

#more/etc/fstab   ;可不需要超級使用者許可權(缺點是隻限於當前目錄下的ramdisk檔案)

# mount/mnt/ramdisk/   ;注意不要出現重配置的問題

4、進入_install目錄,將裡面所有檔案檔案複製檔案到 /mnt/ramdisk中

#cp */mnt/ramdisk/ -ar

5、在根檔案系統中配置一些啟動的選項

(1)ramdisk目錄中建立proc、sys、dev、etc、lib目錄,各目錄功能前面已經做了簡要介紹

(2)在etc目錄內裡面建立inittab檔案,作為啟動指令碼的內容;建立rc檔案,包含一些系統啟動的命令;建立motd檔案,裡面的內容將最終列印在終端上;之後建立init.d目錄,並利用ln指令做符號連結,該檔案作為inittab啟動指令碼

#vi rc

#mkdir init.d

#ln –fs ../rc rcS  ;連結

#sudo chmod +xrc  ;給rc加上可執行的屬性

(3)ramdisk目錄中建立lib目錄,在交叉編譯庫路徑下找到 ld-2.10.1.so,libc-2.10.1.so,libm-2.10.1.so三個動態庫檔案及相應的動態連結庫載入器,通過ln指令實現動態庫的連結

(4)進入dev 目錄,通過編寫mkdev.sh在目錄內快速建立一些裝置檔案

#shmkdev.sh   ;快速建立裝置檔案

6、回到radisk_img的目錄中解除安裝ramdisk檔案系統,實現系統更新:

#umonut/mnt/ramdisk

   以上步驟成功製作了一個ramdisk檔案系統映像,可壓縮節省FLASH佔用空間。

三、嵌入式系統開發

通過前面兩個實驗,已經做了Linux核心映象zImage及根檔案系統ramdisk_img.gz,下面的實驗通過之前這兩個檔案熟悉整個嵌入式系統的開發過程.

3.1 基本原理簡介

原理內容如果詳細介紹篇幅過多,這裡只做簡單的說明:

1)  Bootloader:為PC機引導載入程式的一部分,主要作用是將核心映像從硬碟讀到RAM中,跳轉到相應地址執行作業系統,目前參考書中比較常見的作為引導嵌入式作業系統的Bootloader以U-Boot居多。

2)  minicom:為一款串列埠通訊軟體,用於實現串列埠通訊。第一次使用軟體時需要根據實際情況進行串列埠的設定,由於前面同學基本已經做好,故無需多少改動。

3)  Tftp傳輸協議:基於UDP協議的簡單檔案傳輸協議,以目標板作為客戶機。

4)  NFS:Net File System,網路檔案系統,通過NFS使用者和程式可以像訪問本地檔案一樣訪問遠端系統上的檔案。前面在做核心映象時已支援該網路檔案系統。

   3.2實驗內容

1)  將之前製作的核心映象及根檔案系統複製到實驗室的tftpboot資料夾內,分別命名為wzs_zImage及ramdisk_wzs.gz;

2)  進入minicom中,開啟嵌入式開發平臺的電源,在boot時進行干預,進行一些配置:

x210# setenv ipaddr 192.168.207.122    ;本機(即嵌入式開發平臺)地址

x210# setenv serverip 192.168.207.22   ;伺服器地址

x210# setenv ramdisk root=/dev/ram rw initrd=0x40000000,8M

x210# setenv bootargs console=ttySAC2,115200 $ramdisk   ;指示掛載ramdisk作為根檔案系統

x210# tftp 0xc0008000 wzs_zImage 

x210# tftp 0x40000000 ramdisk_wzs.gz  ;將核心映象和檔案系統分別掛載到相應記憶體地址

x210# bootm 0xc0008000    ;系統開始載入核心

Ø  啟動。。。。。。

3)先配置網路,再使用mount命令將主機(開發板)的/mnt目錄掛到伺服器(電腦)的/exp目錄下:

#ifconfigeth0 192.168.207.122

#mount192.168.207.22:/exp /mnt -o nolock,proto=tcp

之後,嘗試簡單編寫了簡單的hello程式,通過不同的編譯器進行編譯分別實現了在主機和伺服器上的執行。

Ø  交叉編譯器的配置:

#exportPATH=$PATH/usr/local/arm-2009q3/bin/

#arm-none-linux-gnueabi-gcc-static -o hello hello.c

(僅適用於當前終端)

  3.3  嵌入式系統下軟體開發的一般流程(基於Linux)

一般是先在自己的宿主機上搭建好Linux系統環境,如準備好交叉編譯器等,接著就是像實驗三中的操作,配置好串列埠之後利用bootloader下載已經移植好的Linux作業系統,接著使用NFS服務把嵌入式系統某個目錄掛載宿主機目錄下,之後就可以較方便地在宿主機上實現嵌入式系統軟體的開發和下載。