1. 程式人生 > >移植核心學習筆記2-----修改分割槽及製作根檔案系統

移植核心學習筆記2-----修改分割槽及製作根檔案系統

1、製作分割槽

(1)分析

在上節實驗中出現以下問題:無法掛載根檔案系統


在以前u-boot燒寫檔案系統時是燒寫到某個地方,以前的分割槽是下面那樣劃分的,劃分為4個分割槽,但是上面有8個分割槽


分割槽修改參考(分割槽是在程式碼裡面寫死的,u-boot怎麼設定不會影響核心)

(2)實驗

下載並啟動核心,分割槽已改變,是不是分割槽上滅有燒寫檔案系統。 


(3)燒寫檔案系統

下載



擦除

燒寫


下載核心並啟動



還是出現錯誤,因為不支援yaffs檔案系統


(4)看核心支援的檔案系統

檢視vi .config


搜尋不出yaffs,但是有jffs2


(5)燒寫jffs2檔案系統

實際上下載檔案的時候,會把大小存在一個所謂的環境變數裡面,可以通過$filesize或$(filesize)這樣引用。

下載


擦除、燒寫


(6)設定啟動引數(在啟動引數中指明核心在哪裡掛載根檔案系統)

並下載核心


用bootm 3200,0000啟動

掛載上去了,但還是發現找不著init檔案


2、FHS(Filesystem Hierarchy Standard)標準介紹

當我們在linux下輸入ls  / 的時候,見到的目錄結構以及這些目錄下的內容都大同小異,這是因為所有的linux發行版在對根檔案系統佈局上都遵循FHS標準的建議規定。

該標準規定了根目錄下各個子目錄的名稱及其存放的內容:

目錄名 存放的內容
/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、製作根檔案系統

構造檔案系統

核心啟動後,掛載根檔案系統,最終啟動應用程式。有那麼多的應用程式,到底啟動哪一個,核心只會啟動第一個應用程式,第一個應用程式就會根據配置檔案去決定啟動哪一家的公司的哪一個應用程式。

製作根檔案系統就是要建立以上的目錄,並在其中建立完整目錄內容。其過程大體包括:

  • 編譯/安裝busybox,生成/bin、/sbin、/usr/bin、/usr/sbin目錄
  • 利用交叉編譯工具鏈,構建/lib目錄
  • 手工構建/etc目錄
  • 手工構建最簡化的/dev目錄
  • 建立其它空目錄
  • 配置系統自動生成/proc目錄
  • 利用udev構建完整的/dev目錄
  • 製作根檔案系統的jffs2映像檔案

(1)編譯/安裝busybox,生成/bin、/sbin、/usr/bin、/usr/sbin目錄

(編譯核心用哪一個編譯器,就用這個編譯器去編譯應用程式)

這些目錄下儲存的主要是常用命令的二進位制檔案。

2、tar xjvf busybox-1.20.0.tar.bz2解包

3、修改Makefile檔案

175 ARCH            ?= arm
176 CROSS_COMPILE   ?= arm-linux-

4、make menuconfig配置busybox

我們要交叉編譯,需要指定編譯器




編譯選項交叉編譯字首


5、編譯busybox

make

6、安裝busybox

在nfs_root中建立目錄:mkdir fs_mini_mdev_new


(2)安裝glibc庫

看環境變數,我們的交叉編譯工具鏈在哪裡


進工具鏈中查詢相關的庫,thumb2是thumb指令集用到的庫,我們用到的是

這兩個庫。


在根檔案系統下建立一個lib目錄


把交叉編譯工具鏈下的動態連結庫檔案拷貝到跟檔案系統下的lib目錄,-d是連結檔案在拷貝後仍是連結檔案,否則是拷貝實際的檔案。


在根檔案系統下建立一個usr\lib目錄,不加-p要先建立目錄usr,後建立目錄lib.-p可以一次性建立把交叉編譯工具鏈下的動態連結庫檔案拷貝到跟檔案系統下的usr\lib目錄


(3)構造etc目錄

把之前的根檔案系統的etc目錄下的內容拷貝過來並修改


我們核心啟動的第一個程序就會開啟inittab,根據檔案指示去做某些事情

會執行指令碼/etc/init.d/rcS,執行完指令碼後,啟動shell,這個shell從串列埠0的裝置名,console中得到輸入


看指令碼/etc/init.d/rcS,mount -a是根據fstab檔案的內容來掛接各種根檔案系統


fstab檔案的內容


###############################################
###############################################

第一列:裝置名或者裝置卷標名,(/dev/sda10 或者 LABEL=/)
第二列:裝置掛載目錄        (例如上面的“/”或者“/mnt/D/”)
第三列:裝置檔案系統          (例如上面的“ext3”或者“vfat”)
第四列:掛載引數     (看幫助man mount)
對於已經掛載好的裝置,例如上面的/dev/sda2,現在要改變掛載引數,這時可以不用解除安裝該裝置,而可以使用下面的命令(沒有掛載的裝置,remount 這個引數無效)
#mount /mnt/D/ -o remount,ro (改defaults為ro)
為了安全起見,可以指明其他掛載引數,例如:
noexec(不允許可執行檔案可執行,但千萬不要把根分割槽掛為noexec,那就無法使用系統了,連mount 命令都無法使用了,這時只有重新做系統了!
nodev(不允許掛載裝置檔案)
nosuid,nosgid(不允許有suid和sgid屬性)
nouser(不允許普通使用者掛載)

第五列:指明是否要備份,(0為不備份,1為要備份,一般根分割槽要備份)

第六列:指明自檢順序。 (0為不自檢,1或者2為要自檢,如果是根分割槽要設為1,其他分割槽只能是2)如果想開機就自動掛載(mount)上,可以在/etc/fstab上新增如下幾行:
/dev/hda5 /mnt/d vfat exec,dev,suid,rw,umask=0,iocharset=gb2312,codepage=936 0 0
同時也解決了中文檔名的亂碼問題,我的fstab檔案如下,僅供參考:


###############################################
###############################################

(4)構造dev目錄

我們上電後執行,裡面會根據inittab這個檔案來決定執行指令碼/etc/init.d/rcS,這個指令碼會執行mdev -s建立dev目錄下的內容,但是在mdev -s執行前,dev目錄下需要有東西。建立兩個裝置節點。下面的目錄需要修改一下,在fs_mini_mdev_new目錄下的dev目錄下建立兩個裝置節點。


(5)建立其他目錄(掛載虛擬的檔案系統)


(6)製作映像檔案

-s 是扇區的大小,我們的nand flash的一個扇區是2048,-e是可擦除塊是128K,-d指明目錄是fs_mini_mdev_new,後面-o跟輸出檔案fs_mini_mdev_new.jffs2


4、驗證製作的跟檔案系統

(1)重啟開發板、下載跟檔案系統,擦除nand flash,然後燒寫



(3)設定啟動引數、下載新核心、用bootm 32000000啟動


(4)看啟動資訊,掛接上去了,並找到了init程式,但是這個程式有點問題


(5)在核心中搜索exitcode,看exitcode=0x00000004是什麼意思。

在Exit.c的find_new_reaper函式中


看引數是什麼意思

find_new_reaper函式被forget_original_parent函式呼叫

forget_original_parent函式被exit_notify函式呼叫

exit_notify函式被do_exit函式呼叫


後面的code就是退出程式碼,搜尋do_exit函式,看有哪些退出程式碼

看巨集SIGKILL,這裡4代表非法指令的意思,可以在網上搜索巨集SIGKILL


(5)怎麼會有非法指令

看看我們編譯應用程式的時候用的是所謂的eabi介面,我們核心也要支援eabi接口才行,eabi是可執行層應用程式的二進位制介面,應用程式支援這個介面,是用編譯器arm-none-linux-gnueabi編譯出來的符合eabi介面的應用程式,那麼核心應該支援這種介面。


(6)配置核心(以支援eabi)

make menuconfig

搜尋eabi



重新編譯核心,下載、燒寫,啟動