一步步製作根檔案系統 (一)

2021-07-22 23:08:04 字數 4391 閱讀 3359

開發環境:ubuntu 12.04

開發板:mini2440  256m nandflash   64m sdram

yaffs製作工具:mkyaffsimage

yaffs2製作工具:mkyaffs2image(適合64m)、mkyaffs2image-128(適合128m以上)

寫之前的羅嗦

不管是想要製作yaffs檔案,還是yaffs2,本文章都適合,只是最後使用不同的工具生成罷了。現在,開始吧!

主要參考書籍

《嵌入式linux應用程式開發完全手冊》

《國嵌核心驅動高階教材》

檔案系統簡介

理論上說乙個嵌入式裝置如果核心能執行起來,且不需要使用者程序的話(估計這種情況很少),是不需要檔案系統的。檔案系統簡單的說就是一種目錄結構,由於linux作業系統的裝置在系統中是以檔案的形式存在(這個很關鍵奧!和win7的不同之處就在於linux的everything is a file!),將這些檔案分類管理以及提供和核心互動的介面,就形成了一定的目錄結構也就是檔案系統。檔案系統是為使用者反映系統的一種形式,為使用者提供乙個檢測控制系統的介面。

而根檔案系統,就是一種特殊的檔案系統。那麼根檔案系統和普通的檔案系統有什麼區別呢?借用書上的話說就是,根檔案系統就是核心啟動時掛載的第乙個(第乙個的意思就是不止乙個吧,你看,區別出來了啊)檔案系統。由於根檔案系統是啟動時掛載的第乙個檔案系統,那麼根檔案系統就要包括linux啟動時所必須的目錄和關鍵性的檔案,例如linux 啟動時都需要有使用者程序 init 對應的檔案,在linux掛載分割槽時一定要會找 /etc/fstab這個掛載檔案等,根檔案系統中還包括了許多的應用程式,如 /bin目錄下的命令等。任何linux啟動時所必須的檔案的檔案系統都可以稱為根檔案系統。

linux支援多種檔案系統,如包括 ext2、ext3、vfat、jffs、ramfs、yaffs 和nfs等,為了對各類檔案系統進行統一管理,linux引入了虛擬檔案系統 vfs(可別小看這個vfs,它可是解決了linux啟動時的「雞生蛋,蛋生雞」的問題呢),為各類檔案系統提供乙個統一的操作介面和應用程式介面。下圖為linux檔案系統層次關係圖

yaffs 檔案系統

yaffs(yet another flash file system)檔案系統是專門為nand flash設計的檔案系統,與jffs/jffs2檔案系統有些類似,不同之處是 jffs/jffs2 檔案系統是專門為nor flash的應用場合設計的,而nor flash和nand flash本質上有較大的區別(壞塊、備用區、容量),所以儘管 jffs/jffs2檔案系統也能用與nand flash,但對於nand flash來說,通常不是最優方案(效能較低,啟動速度稍慢)。而yaffs利用 nandflash提供的每個頁面16位元組或64位元組的spare區(oob備用區)空間來存放ecc和檔案系統的組織資訊,能夠實現錯誤檢測和壞塊處理。這樣的設計充分考慮了nandflash以頁面為訪問單元的特點,將檔案組織成固定大小的資料段,能夠提高檔案系統的載入速度。

yaffs目前有yaffs、yaffs2兩個版本,一般來說,yaffs對小頁面(512b+16b/頁)的nandflash(68m)有很好的支援,yaffs2對更大的頁面(2k+64b/頁)的nandflash(128m、256m或者更大)支援更好。不得不說說這個yaffs和yaffs2,前幾天學習yaffs製作的時候,我一直以為它們兩個的區別蠻大的(確實有區別),但是後來才發現基本的製作過程是一樣的,不一樣的只是最後生成這兩個版本的工具不一樣!!!!yafffs由mkyaffsimage生成,而yaffs2由mkyaffs2image生成!

busybox簡介

busybox是乙個遵循 gplv2協議(這是依照書上打的,我可不知道這什麼協議)的開源專案。有人將busybox比喻成linux工具的瑞士軍刀,簡單的說就是linux的乙個大的工具集,包括了linux中的大部分命令和工具。busybox中各種命令與相應的 gnu工具相比,所能提供的選項較少,但是能夠滿足一般應用。因此,busybox主要是為各種小型裝置或者嵌入式系統提供。你看,下圖就是利用busybox安裝在根檔案系統內的bin目錄下的命令。

嵌入式根目錄下的bin,sbin和usr目錄中的命令以及啟動程式linuxrc通常就是通過busybox產生的。busybox產生的。busybox會根據配置的不同自動生成一些檔案,但是有些根檔案系統下的檔案還是需要使用者自己建立。

linux 根檔案系統目錄結構

為了在安裝軟體時能夠預知檔案、目錄的位置,為了讓使用者方便地找到不同型別的檔案,在構造檔案系統時,建議遵循fhs標準(file hierarchy standard,檔案系統層次標準)。它定義了檔案系統中目錄、檔案分類存放的原則,定義了系統執行時所需的最小檔案、目錄的集合,並列舉了不遵循這些原則的例外情況及其原因。fhs並不是乙個強制的標準,但是大多的linux、unix發行版本都遵循fhs。

linux根檔案系統中一般有如圖2所示的幾個目錄,如下圖

下面依次講述這幾個目錄的作用(很可能你會看煩,但是我保證,它真的需要你靜下心去理解,可以在製作的過程中再返回來看)

1、/bin 目錄

該目錄下存放所有使用者(包括系統管理員和一般使用者)都可以使用的、基本的命令。

/bin 目錄下常用的命令有:cat、chgrp、chmod、cp、ls、sh、kill、mount、umount、mkdir等。

2、/sbin目錄

該目錄下存放系統命令,即只有管理員能夠使用的命令、系統命令還可以存放在/usr/sbin、/usr/local/sbin目錄下。/sbin 目錄中存放的是基本的系統命令,它們用於啟動系統、修復系統等,與/bin目錄相似,在掛接其他檔案系統之前就可以使用 /sbin。

/sbin目錄下常用的命令有:shutdown、reboot、fdisk、fsck等。

不是急迫需要使用的命令存放在/usr/sbin目錄下。本地安裝的(locally-installed)的系統命令存放在/usr/local/sbin目錄下。

3、/dev 目錄

該目錄下存放的是裝置檔案。裝置檔案是linux中特有的檔案型別,在linux系統下,以檔案的方式訪問各種外設,即通過讀寫某個裝置檔案操作某個具體硬體。比如通過「/dev/ttysac0」檔案可以操作串列埠0,通過「/dev/mtdblock1」可以訪問mtd裝置(nand flash、nor flash等)的第2個分割槽。在接下來利用uboot啟動的時候要設定入口引數   setenv bootargs "noinitrd root=/dev/mtdblock3 rootfsyle=yaffs2 rw console=ttysac0,115200 init=/linuxrc mem=64m",其中的就是mtdblock3,有的人可能會問為什麼是mtdblock3,而不是mtdblock2呢?這和你的nand flash分割槽有關,咱們在核心移植的時候將nandflash分成了4個區,如下

其中的root分割槽就是用來存放yaffs檔案系統的,對應的為/dev/mtdblock3!

裝置檔案有兩種:字元裝置和塊裝置。裝置檔案可以使用mknod命令建立,詳細的就不講述了。

/dev 的建立有3中方法:

① 手動建立

在製作根檔案系統的時候,就在/dev 目錄下使用mknod命令建立好要使用的裝置檔案,比如ttysac0等。系統掛接根檔案系統後,就可以使用/dev目錄下的裝置檔案了。但是這種方法只能使用已經建立好的裝置檔案,萬一我以後再插上優盤的時候,優盤這樣的裝置檔案豈不是不能用了?佛說:不好....不好....

② 使用devfs檔案系統。韋老師的書上說已經過時,我直接略過了。

③ udev

udev 是個使用者程式(u是指user space,dev是指device),它能夠根據系統中硬體裝置的狀態更新裝置檔案,包括裝置檔案的建立、刪除等。使用udev機制也不需要在/dev 目錄下建立裝置節點,它需要一些使用者程式的支援,並且核心要支援sysfs檔案系統。它的操作相對複雜,但是靈活性很高。

在 busybox中有乙個mdev命令(注意,是命令奧),它是udev命令的簡化版本。適合於嵌入式的應用埸合。其具有使用簡單的特點。它的作用,就是在系統啟動和熱插拔或動態載入驅動程式時,自動產生驅動程式所需的節點檔案。在以busybox為基礎構建嵌入式linux的根檔案系統時,使用它是最優的選擇。我接下來的建立根檔案系統會用這種方法。

下一節:

一步步學ROS

最近因為看svo的 裡面用到catkin決定要好好看ros,年前學會基本操作。啟動節點 rosrun package name executable name 檢視節點 rosnode list 注 rosout 節點是乙個特殊的節點,通過 roscore 自動啟動 檢視特定節點的資訊 rosnod...

windows Thrift c 一步步搭建

1.thrift 原始碼路徑 2.libevent原始碼路徑 3.boost路徑 安裝 conan install boost 1.68.0 conan stable 4.openssl路徑 安裝 conan install openssl 1.1.1a conan stable conan安裝bo...

一步步啟動linux

可以一步一步啟動linux.在ubantu剛一啟動時,按c健即進入grub 提示符狀態,在此狀態下輸入 我用的是ubuntu 13 grub linux vmlinuz grub ls boot grub initrd boot initrd.img 3.11.0 15 generic grub b...