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服務把嵌入式系統某個目錄掛載宿主機目錄下,之後就可以較方便地在宿主機上實現嵌入式系統軟體的開發和下載。