TI Davinci DM6446開發攻略——根文件系統的裁剪和移植 分類: DSP 2013-07-22 16:30 339人閱讀 評論(0) 收藏

1、補充文件系統知識
Linux根文件系統是 存放tool軟件、lib文件、script(腳本)、配置文件、其餘特殊文件、本身開發的應用程序的地方。嵌入式linux的根文件系統rootfs就像windows操做系統的C、D盤這種概念機制,FLASH對應硬盤。但linux是掛載點的概念,根文件系統是一個總體,組織到一個樹狀的目錄結構中。這種文件組織遵照文件系統科學分類標準FHS,一種國際標準。運行、維護系統所必須的各類
在開發、測試階段,基本上都是使用NFS(網絡文件系統),NFS文件系統是在你的開發主機HOST裏,不是在你的板子裏。製做嵌入式產品根文件系統,就是要把NFS指向的文件系統文件夾裏全部的內容,經過其餘少數幾種的Linux文件系統打包生產一個2進制鏡像文件,而後以某種方式燒寫到FLASH芯片內。開發階段,特別是應用程序開發、動態加載的驅動模塊開發,使用NFS,能夠省去麻煩的根文件系統鏡像文件的下載和燒寫過程,即可以在本身板子上運行這些開發的程序和模塊。
 
Linux支持超過50種文件系統,可是隻有少數幾種在嵌入式OS中經常使用,見下圖。linux嵌入式產品的根文件系統是須要燒寫到Flash芯片裏。
 

Cramfs文件系統:(Compressed ROM File System)是個簡單,壓縮的,只讀的文件系統。除了能夠用於MTD下只讀而且極少更新img的NOR/NAND,IDE的CF,FTL/NFTL的NOR/NAND,可做爲RAM disk的IMG存儲。因爲簡單,Cramfs有一些限制,例如最大支持16M(?256M),沒有當前(.)和父(..)目錄,頁大小固定爲4096,gid(8位)最大爲255,全部的連接文件計數都是1等等。在cramfs文件系統中,每一頁(4KB)被單獨壓縮,能夠隨機頁訪問,其壓縮比高達2:1,爲嵌入式系統節省大量的Flash存儲空間,使系統可經過更低容量的FLASH存儲相同的文件,從而下降系統成本。Cramfs文件系統以壓縮方式存儲,在運行時解壓縮,因此不支持應用程序以XIP方式運行,全部的應用程序要求被拷到RAM裏去運行,但這並不表明比Ramfs需求的RAM空間要大一點,由於Cramfs是採用分頁壓縮的方式存放檔案,在讀取檔案時,不會一會兒就耗用過多的內存空間,只針對目前實際讀取的部分分配內存,尚沒有讀取的部分不分配內存空間,當咱們讀取的檔案不在內存時,Cramfs文件系統自動計算壓縮後的資料所存的位置,再即時解壓縮到RAM中。另外,它的速度快,效率高,其只讀的特色有利於保護文件系統免受破壞,提升了系統的可靠性。因爲以上特性,Cramfs在嵌入式系統中應用普遍。可是它的只讀屬性同時又是它的一大缺陷,使得用戶沒法對其內容對進擴充。
製做Cramfs根文件系統命令以下:
#mkcramfs [-h] [-e edition] [-i file] [-n name] dirname outfile
mkcramfs的各個參數解釋以下:
 -h:顯示幫助信息
-e edition:設置生成的文件系統中的版本號
-i file:將一個文件映像插入這個文件系統之中(只能在Linux2.4.0之後的內核版本中使用)
-n name:設定cramfs文件系統的名字
dirname:指明須要被壓縮的整個目錄樹
outfile:最終輸出的文件
cramfsck的命令格式:
cramfsck [-hv] [-x dir] file
cramfsck的各個參數解釋以下:
-h:顯示幫助信息
-x dir:釋放文件到dir所指出的目錄中
-v:輸出信息更加詳細
file:但願測試的目標文件
例子: #mkcramfs rootfs rootfs.cramfs生成rootfs.cramfs文件系統鏡像.其中rootfs是你調試的根文件系統的文件夾,rootfs.cramfs是生產鏡像文件的名字。
Squashfs文件系統:是壓縮的只讀的fs,保留了Cramfs不少優勢,去掉它的限制。壓縮比更高。是一個不錯的文件系統。命令爲:#mksquashfs [source] [dest]
JFFS2文件系統:可寫、保留數據、壓縮、掉電保護,提供wear leveling,適合板載NOR、NAND和Doc。JFFS2提供垃圾回收機制,一般能夠很好地工做。可是當文件系統接近極限或者要求更新一個很是大的文件,垃圾回收的時間會很長,將會延遲文件系統的操做,這會對沒有考慮到這種狀況的某些實時要求的軟件帶來負面的影響。當空間滿的時候,嘗試更新或者階段文件內容會被提示文件系統已滿並失敗,即便看起來不要求添加存儲block,這是由於日誌結構文件系統,須要在log中增長log。在使用的時候,咱們應保證存儲空間的充足,上面的應用可以容忍時延(避免快滿時候垃圾回收的消耗影響)。 JFFS2用途很廣,可是對於如今容量巨大的閃存不適合,新的UBI文件系統出現。JFFS2的不可擴展性是最大的問題,做爲JFFS2的升級,JFFS3支持大容量的閃存。JFFS2使用MTD工具:
#mkfs.jffs2 –r ottfs/ –o images/rootfs-jffs2.img –e 128kiB 其中 128是指擦寫block的大小,若是超過實際閃存的大小,會引發文件系統的崩潰,若是過小,block內有部分存儲空間沒能利用。
#sumtool –i rootfs-jffs2.img –o rootfs-jffs2-summed.img –e 128KiB 增減 erase block的summary node。
 
YAFFS2文件系統:是可寫,下電保護的文件系統,普遍引用於Linux和RTOSeS。和JFFS2相比,它減小一些功能,所以速度更快、佔用內存資源更少。YAFFS2自帶NAND芯片的驅動,是專門爲NAND閃存設計的。之前的YAFFS只支持512-BYTE/Page的NAND,而YAFFS2不但兼容512-BYTE/Page,還支持目前流行的2048-BYTE/Page大容量NAND FLASH。YAFFS2文件系統的鏡像工具是mkyaffs2img。隨便在GOOGLE上輸入mkyaffs2img就能夠找到滿屏幕的製做方法,這裏不用介紹。
 
RAMFS文件系統:
討論RAMFS,就不得不討論RAM disk,在RAM中,而做爲一個block設備,內核能夠同時支持多個RAM disk。一般用於保存磁盤文件系統中壓縮的img。這在嵌入式操做系統的初始化中使用,kernel能夠從存儲設備中提取initial RAM disk(initrd)img做爲的他的根文件系統。一開始,kernel根據boot的參數是否表面intrid,若是是,他將從特定的存貯介質提取文件系統的img並放入RAM disk,同時mount爲根文件系統。initrd的機制是以最簡單的方式提供一個帶根文件系統的內核在RAM中。對於新的系統,推薦使用Initramfs機制。
Tmpfs文件系統:也是RAM disk的一種,可使用物理內存,是一個存放在虛擬memory的文件系統,不提供永久保存,適合於存儲臨時的數據,例如/tmp,用於Linux的page cache和dentry chache。
RAM disk的特色就是速度快,由於在RAM運行的。缺點就是每次從新啓動系統時,前面的工做就沒法保存。建立RAM Disk使用的命令式mke2fs。
有關嵌入式經常使用的文件系統詳細介紹和製做命令、方法,你們能夠在網上搜索獲得。
 
2、 TI davinci 根文件系統 target 介紹
在mv_pro_5.0.0/montavista/pro/devkit/arm/v5t_le目錄下,有個target的文件夾,這個就是TI EVM的根文件系統了。Target裏的內容,見下圖,本人是單獨COPY出來到本身工做目錄下,這點在《開發環境篇》有介紹。TI在這個target文件系統包裏放置不少開發工具,其實就是一個開發應用程序的環境,你進到usr目錄下就明白這點,裏邊包括交叉編譯命令、不少頭文件和應用程序的源代碼、usr/lib裏的lib文件,等等。其實這些東西確定是不能所有燒到本身的板子裏的。單單這個usr裏相關的文件大小就達1G!!!由於TI EVM東西多,複雜,因此咱們裁減的時候,最好作好備份。固然,有些朋友是本身手動從新制做根文件系統,再借助「Busybox」這個大名鼎鼎的嵌入式linux瑞士軍刀,一個精簡的文件系統就出來了。本人在S3C2440、2410的板子上玩過,挺不錯的,很是精簡。本文暫且不討論這種方法。
 

3、 TI davinci 根文件系統 target 的裁減
進入本身工做的target文件夾裏,見上圖:
bin文件夾:裏邊主要是一些linux shell命令,全部用戶均可以使用的、基本的命令,都是很基本的東西,暫時不用動它,保留。
boot文件夾:是存放編譯內核的一些相關文件,好比uImage等,這些東西不必放到板子上的文件系統裏,刪除掉。
dev文件夾:存放很是多的設備節點,若是你對這些節點不是很熟悉,分不清哪些是你係統用到的,哪些是不用的,能夠保留,整個dev只有16~17k的大小。固然節點太多也很差。
 etc文件夾:存放不少啓動的腳本文件、系統配置文件,這是下面移植要討論的重點。整個文件夾有6~7M,像samba、apt這種在普通嵌入式產品不經常使用的東西能夠刪除掉。若是產品不是帶LCD圖像界面的產品,X11( X Window 系統版本 11,簡稱 X11,是一個對網絡透明的客戶/服務器架構的圖形顯示系統。它支持應用程序在你的屏幕上繪製象素,線條,文字,圖象等等。 X11 還包括一些其它的輔助的函數庫,使得它能夠容易地繪製用戶界面,例如:按鈕,文本輸入區等等)這個能夠刪除掉,單這個文件夾就有2.85M。
 home文件夾:空的文件夾,系統運行會用到,普通用戶的主目錄,必定要保留。
 lib文件夾:不少工具和應用程序使用的庫文件,不是高高手,最好不要刪掉裏邊的文件。
 media文件夾:空的文件夾,保留。
 mnt文件夾:空文件夾,之後使用U盤和SD卡時,會掛到該目錄,因此保留。
 opt文件夾:空文件夾,本身開發的一些應用程序能夠放到這裏,好比TI evm的一些應用程序就放在/opt/dvsdk/dm6446/,存放encode,decode,encodedecode的應用程序,等等。
 proc文件夾:空的文件夾,系統運行會用到,proc文件系統的掛載點,保留。
 root文件夾:空的文件夾,系統運行會用到,root用戶的主目錄,必定要保留。
 sbin文件夾:存放不少工具和基本的系統命令,它們用於啓動系統、修復系統,在嵌入式產品裏,能夠把不經常使用的mkfs.xx的文件所有去掉。其餘有不少工具和命令,要根據你本身的產品,不用到的都刪掉,裁減sbin建議再單獨備份一下sbin,經過NFS,一邊刪除,一邊測試,保證刪除掉後你的產品還很好地工做。這是一種笨辦法,畢竟要所有理解裏邊的每一個命令和工具的做用也須要不少時間。建議這個文件夾最好不要動太多手腳。
 srv文件夾:空的文件夾,保留。
 sys文件夾:空的文件夾,系統運行會用到,好比sysfs,保留。
 tmp文件夾:空的文件夾,系統運行會用到,存放臨時文件,保留。
 usr文件夾:上面提到,這個文件有不少在產品出廠不用到的東西,armv5tl-montavista-linux-gnueabi文件夾直接刪除掉;bin文件夾裏的arm_v5t_le-XXXXX和armv5tl-montavista-linux-gnueabi-XXX也去掉吧;include、local、share、src、X11R6文件夾所有去掉;Usr/lib/tcng/test幹掉;而後根據本身產品的,像perl五、python2.四、X11等等,不用到就搞定它們。笨辦法就是使用NFS和板子共同測試,這樣下來usr就小多了。
var文件夾:存放可變的數據,var/cache/cracklib裏的文件很大,不知在TI EVM有什麼用,本人不用;var\lib\rpm裏的文件本人也不用;var/www/html/manual是在開發html的時候用到,本人不用。這幾個都是var裏耗空間的文件夾。另外,在使用NFS調試的時候,var/log下的文件會保存每次內核啓動的打印信息,測試多了,debug,kern.log,messages等文件也加大,因此製做時要注意這些文件的裁減。
    按照上面的動做下來,一個能夠用的根文件系統也出來了,但還不是簡潔高效的,有些東西還得根據本身的板子要支持的功能選擇性保留和裁減。有些工具、命令、應用程序開始沒用到,可是後來升級產品會用到,因此,裁減要有針對性和規劃性。特別是有些產品使用小於等於64M NAND的嵌入式產品,要作的工做就更多,這裏僅供學習和參考。
 
4、 TI davinci 根文件系統 target 的移植
1 、系統的分區:
在linux-2.6.18移植的博客文章介紹了FLASH的分區,這裏就不用重複了,通常分區是: Bootloader(UBL+U-BOOT)+參數 爲mtdblock0,kernel爲mtdblock1,根文件系統rootfs爲mtdblock2。也有這樣分的:Bootloader(UBL+U-BOOT) 爲mtdblock0,參數爲mtdblock1,kernel爲mtdblock2,根文件系統爲mtdblock3。Bootloader要從FLASH 加載根文件系統,好比jffs2的根文件系統,u-boot的bootargs應該是:mem=118M console=ttyS0,115200n8 rootfstype=jffs2 root=/dev/mtdblock2 noinitrd rw ip=off或者是其餘類型的文件系統。同時,u-boot對根文件系統的燒寫要支持,由於jffs2,cramfs,yaffs2等每種文件系統的燒寫格式都不同,燒寫的地址必定要和內核的FLASH分區地址一一對應。(補充:在DVSDK2.0中,U-BOOT的參數mem=118M,再也不是120M,由於TI DVSDK2.0 CODEC ENGINE要求分配給cmem的大小是10M)。
2 、內核選擇支持對應的文件系統
   經過make menuconfig的配置界面,你的板子要支持什麼樣的文件系統,是cramfs,Squashfs,jffs2還yaffs2,則要對對MTD等相關選項進行選擇,見linux-2.6.18移植的博客。
    3、對根文件系統權限操做
Target下每一個目錄的權限不是所有同樣的,根據本身的文件系統的類型,好比yaffs2,tmp、var等目錄可使用chmod –R 777 tmp , chmod –R 777 var命令設置,文件夾域的設置使用chown的命令。爲何要這樣強調呢?也許不少人調試DAVINCI 板子會碰到:Starting OpenBSD Secure Shell server: sshd/var/empty/sshd must be owned by root and not group or world-writable. failed (255: ).這個就是根文件系統權限和域得設置有問題。
4 etc 目錄下的移植
   A、拷貝你的LINUX開發主機etc目錄下的passwd、group、shadow文件到etc目錄下。這樣目標板就使用和你LINUX主機同樣的登陸帳號和密碼了。若是passwd、group、shadow被破壞了,如何都進不去板子的shell命令行,並且你的產品沒有嚴重網絡安全要求,這裏還有一個絕招:把target/etc 下的securetty文件改個名字,不用securetty就能夠了,這樣輸入帳號直接回車就能夠了。
 
   B、etc目錄下新建一個目錄sysconfig,並新建文件HOSTNAME,內容爲「你公司名字或你喜歡的名字」。同時在etc/init.d/下RcS文件最後面加入:/bin/hostname –F /etc/sysconfig/HOSTNAME,在profile最後面加入:
USER="`id -un`" (注意 ` 是鍵盤 1 旁邊的 `
LOGNAME=$USER
PS1='[\u@\h \W]# '   (注意 是鍵盤 ; 旁邊的 linux 文件下顯示不同)
PATH=$PATH
HOSTNAME=`/bin/hostname`  (注意 ` 是鍵盤 1 旁邊的 `
export USER LOGNAME PS1 PATH
這樣在板子上進入shell的命令行時,會顯示「[root@你定義的名字~]#」的格式。
 
   C、etc/fstab文件修改:目前這個本人直接使用TI的,可是本身的產品有時會定義
sysfs               /sys         sysfs       noauto                          0 0
tmpfs              /dev/shm tmpfs      noauto                                 0 0
目前沒有驗證,若是哪一個網友對這方面熟悉,能夠在博客上討論。
 
   D、流程介紹
      根文件系統掛接到VFS(linux虛擬文件系統,一種軟件接口機制,原理這裏不描述)成功後,會根據腳本和配置一步一步運行。咱們能夠經過如下流程去熟悉:
先看inittab
      次看init.d/rcS
而後etc/rc.d/rcS.d,rcS.x等文件,開機是啓動/etc/rc.d/rcS.d/下的腳本,而後是/etc/rc.d/rc3.d/下的腳本。只需把用戶的程序編譯稱shell腳本,放在rc3.d下面就能夠了。
      S開頭的腳本基本上是系統運行初始化要作的工做,K開頭就是關機要作的工做。
     客戶若是要在開機運行本身的某些應用程序,也能夠修改etc/init.d/rcS,在
for i in /etc/rc.d/rcS.d/S??*
do
           # Ignore dangling symlinks for now.
           [ ! -f "$i" ] && continue
           case "$i" in
                 *.sh)
                      # Source shell script for speed.
                      (
                          trap - INT QUIT TSTP
                          set start
                          . $i
                      )
                      ;;
               *)
                     # No sh extension, so fork subprocess.
                     $i start
                     ;;
            esac
done
在這後面加本身的運行命令就能夠了。
 
   E、製做根文件系統映像文件
      就是使用mkcramfs、mkyaffs2image這些命令對整個修改的target文件進行鏡像打包了,格式上面已經介紹了。
 
5、點評
以上是本人的經驗之談,確定有描述不足的地方,但願網友能在博客裏指出來,你們一塊兒學習。到目前爲止,有關DM6446開發攻略的主架構的文章,基本上接近尾聲,最後1篇,有關本身開發的GPIO驅動移植的文章,近期也會出來。之後要寫也是某個環節的補充。其實寫這些文章,就是但願有這方面的開發高手過來點評一下,指出不足和錯誤的地方。畢竟本人在這方面還有不少東西要學習。

版權聲明:本文爲博主原創文章,未經博主容許不得轉載。html

相關文章
相關標籤/搜索