從ramdisk根文件系統啟動Linux成功
這幾天參考國嵌的實驗手冊和網上的資料完成了u-boot定制、內核定制、ramdisk根文件系統的制作,并成功。趁熱打鐵,總結一下。本文引用了很多網絡上的文章,就不一一注明了。感謝各大俠的幫助,如有雷同,望見諒。
開發環境:紅帽企業版5
交叉編譯工具鏈:arm-linux-gcc4.3.2
嵌入式Linux內核版本:友善之臂的mini2440開發板光盤自帶的內核linux-2.6.32.2
開發板:mini2440-64MNand Flash
Bootloader:u-boot-1.20
具體步驟如下:
1.U-BOOT定制
因為內容較多,改天再總結一篇吧,在這先不多說
2.解壓內核源碼樹
具體步驟參照友善之臂mini2440開發板用戶手冊,具體不詳述了。
3.修改內核配置選項
make menuconfig,打開配置菜單,修改兩個配置項,分別是:
a):General setup-->選擇 Initial RAM filesystem and RAM disk...... 項
b):DeviceDrivers-->Block devices-->選擇 RAM block devicesupport 項
修改(4920)Default RAM disk size kbytes選項為(8192)Default RAM disk size kbytes
特別要注意的一點是,ramdisk是一種內存虛擬磁盤技術,實質上并不是一種文件系統,它使用的文件系統時ext2文件系統。所以一定要在make menuconfig的時候進入File systems菜單,選上<*>Second extended fs support。以提供內核對ext2文件系統的支持。
然后保存配置退出。
這樣就為內核添加好了ramdisk啟動功能和ramdisk的驅動支持了。
4.修改內核啟動參數
方法有二:
a):修改.config的第310行,修改"CONFIG_CMDLINE"的定義
修改為CONFIG_CMDLINE="initrd=0x32000000,0x200000root=/dev/ram rw console=ttySAC0 mem=64M" 保存。
意思為從ramdisk啟動,ramdisk壓縮文件起始地址在內存地址0x32000000處,文件大小為0x200000。
此參數也可以在makemenuconfig ARCH=arm時進入Boot options菜單,然后在Default kernel command string里修改。效果是一樣的。
b):或者不修改.config的的第310行CMDLINE定義,而是用u-boot的bootargs環境變量來傳遞啟動參數。
同樣也是修改該環境變量為bootargs=initrd=0x31000000,0x200000root=/dev/ram rw init=/linuxrc console=ttySAC0 mem=64M
并saveenv保存u-boot環境變量
以上a),b)的效果是一樣的。(注:我只試了a,b未試)
5.編譯內核
注意:好像友善之臂把內核源碼目錄里的uImage目標給注釋了,直接makeuImage會提示沒有uImage的目標。zImage 是ARMLinux常用的一種壓縮映像文件,uImage是U-boot專用的映像文件,它是在zImage之前加上一個長度為0x40的“頭”,說明這個映像文 件的類型、加載位置、生成時間、大小等信息。換句話說,如果直接從uImage的0x40位置開始執行,zImage和uImage沒有任何區別。另外,Linux2.4內核不支持uImage,Linux2.6內核加入了很多對嵌入式系統的支持,但是uImage的生成也需要設置。
在這里,我直接把u-boot根目錄下/tools中的mkimage工具拷貝到主機的/usr/bin目錄下,就可以直接在內核根目錄下執行
#make uImageARCH=arm CROSS_COMPILE=arm-linux-
等待一會,內核編譯完成。
6.制作ramdisk根文件系統(實際上是建立根文件系統)
該過程是制作ramdisk根文件系統的核心步驟,方法如下:
a)創建根文件系統目錄:
#cd轉入到你的工作目錄。
#mkdir rootfs
#cd rootfs
#mkdir bin dev etclib proc sbin sys usr mnt tmp var
#mkdir usr/binusr/lib usr/sbin lib/modules
b)創建最基本的設備文件:
#cd dev
#mknod -m 666console c 5 1
#mknod -m 666 nullc 1 3
#cd ..
c)安裝/etc配置文件:
我是用的國嵌提供的etc配置文件,未作修改,直接解壓到根文件系統里。
操作如下:
#tar etc.tar.gz -C/xxx/rootwhj
xxx表示你要制作的根目錄所在路徑。
d)編譯內核模塊:
進入Linux內核源碼根目錄
#make modulesARCH=arm CROSS_COMPILE=arm-linux-
e)安裝內核模塊:
#makemodules_install ARCH=arm INSTALL_MOD_PATH=/xxx/rootwhj//嵌入式中的內核模塊都要在文件系統中
xxx表示你要制作的rootfs所在的目錄。
f)配置busybox
進入busybox目錄執行#make menuconfig
進入BusyboxSettings -> build Options ->選中"Build busyboxas a static binary“,即靜態鏈接,免去拷貝大量的庫文件。
InstallationOptions -> 選中"Don't use /usr",以免busybox不慎被安裝到宿主機系統的相應目錄下,破壞宿主機系統。
BusyboxInstallation Prefix (/xxx/rootwhj),修改該選項表明編譯后的busybox將安裝到該位置。
g)編譯、安裝busybox
#make ARCH=arm CROSS_COMPILE=arm-linux-
幾分鐘編譯完成后
#make install
安裝到BusyboxInstallation Prefix (/xxx/rootwhj)設定的目錄里。當前為我要制作的根文件系統目錄(/xxx/rootwhj)。
//完成根文件系統的創建
h)制作ramdisk根文件系統鏡像
方法如下:
上http://genext2fs.sourceforge.net/下載可以簡單方便的制作ramdisk文件系統的工具genext2fs,這樣就不用像網上大多數說的那樣繁瑣的制作ramdisk映像了,當前最新版本為genext2fs-1.4.1.tar.gz 。
編譯生成該工具genext2fs,并將其放入宿主機的/sbin/目錄下以方便使用。
跳轉到要制作的rootfs的上一級目錄
#genext2fs -b 8192-d rootfs ramdisk
-b是指制作的ramdisk大小為8MB
-d是指要制作成ramdisk的根文件系統目錄
最后的ramdisk是制作出來的ramdisk的名字,當然可以改名了。
#gzip -9 -f ramdisk
將該ramdisk以最優方式壓縮為ramdisk.gz
RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成