Linux內核移植筆記 | 03 - 移植Linux 3.4.2 內核到JZ2440(使用busybox製作根文件系統)

製作好的文件系統項目開源地址:https://github.com/Mculover666/rootfs-jz2440

1. 編譯安裝busybox

系統環境:

  • ubuntu 18.04 64bit
  • arm-linux-gcc 4.4.3

1.1. 下載

官網下載挺快的:https://busybox.net/

此處使用1.20.2版本,在下載頁面的最下面。

下載完成之後解壓出來:

tar -jxf busybox-1.20.2.tar.bz2

經過編譯測試:

  • 1.20.2版本編譯通過
  • 1.27.2版本編譯失敗
  • 1.30.1版本編譯失敗

1.2. 配置編譯

busybox編譯之前需要設置編譯工具鏈:

cd busybox-1.20.2/
make menuconfig

進入配置項 Busybox Settings:

進入 Build Options :

找到Cross compiler prefix (交叉編譯器前綴)並修改爲arm-linux-

退出並保存,配置完成。

1.3. 編譯

make


編譯成功之後,開始使用busybox製作根文件系統。

2. 製作根文件系統

2.1. 安裝busybox

首先新建一個安裝目錄 fs_mini_mdev_test 用於安裝busybox,然後使用 CONFIG_PREFIX 環境變量指定該目錄進行安裝:

make install CONFIG_PREFIX=/home/ubuntu/busybox/fs_mini_mdev_test


安裝完成之後,在安裝目錄中就有了基本命令的目錄,如圖:

2.2. 安裝庫

2.2.1. 尋找編譯器庫

首先找到交叉編輯器所在位置:

echo $PATH


然後進入到該目錄:

cd /usr/arm-linux-toolchains4.4.3/bin
cd ..


尋找交叉編譯器所使用的庫文件:

find -name lib


找到了這5個庫,接着來sys-root這兩個庫裏都有哪些文件:

  • ./arm-none-linux-gnueabi/sys-root/usr/lib

  • ./arm-none-linux-gnueabi/sys-root/lib

2.2.2. 複製庫文件

拷貝 sys-root/lib 庫文件:

cd ~ 
mkdir /home/ubuntu/busybox/fs_mini_mdev_test/lib
cp -d /usr/arm-linux-toolchains4.4.3/arm-none-linux-gnueabi/sys-root/lib/*so* /home/ubuntu/busybox/fs_mini_mdev_test/lib/ 

接着再拷貝sys-root/usr/lib 庫裏的文件:

cd ~
mkdir /home/ubuntu/busybox/fs_mini_mdev_test/usr/lib 
cp -d /usr/arm-linux-toolchains4.4.3/arm-none-linux-gnueabi/sys-root/usr/lib/*so* /home/ubuntu/busybox/fs_mini_mdev_test/usr/lib/

2.3. 構建etc目錄

etc目錄下的內容取決於要運行的程序,本教程中只創建三個文件:

  • etc/inittab
  • etc/init.d/rcS
  • etc/fsttab

其中,init進程將根據inittab文件來創建其它子進程,比如調用腳本文件配置ip地址、掛接其它文件系統等,最後啓動shell。

  • ① 創建etc/inittab文件

仿照Busybox中example下的inittab文件內容,在fs_mini_mdev_test/目錄下,創建etc目錄,再進入目錄創建一個inittab文件,編輯以下內容:

# /etc/inittab
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
  • ② 創建etc/init.d/rcS文件

在etc目錄下創建該文件,這是一個腳本文件,可以在裏面添加需要自動執行的命令,編輯以下內容:

#!/bin/sh
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

再加上可執行權限,否則啓動時會提示沒有權限:

sudo chmod +x init.d/rcS

暫時不支持網卡,不配置ip。

  • ③ 創建etc/fstab文件

該文件中的內容表示執行mount -a 命令後要掛載的文件系統,內容如下:

#device mount-point     type    options dump    fsck    order
proc    /proc   proc    defaults        0       0
tmpfs   /tmp    tmpfs   defaults        0       0
sysfs   /sys    sysfs   defaults        0       0
tmpfs   /dev    tmpfs   defaults        0       0

2.4. 構建dev目錄

init 進程要用到兩個設備文件,建立:

cd fs_mini_mdev_test/
mkdir dev
cd dev
sudo mknod console c 5 1
sudo mknod null c 1 3

2.5. 創建其它目錄

其它目錄可以是空目錄,創建命令如下:

cd fs_mini_mdev_test/
mkdir proc mnt tmp sys root

3. 製作jffs2映像文件

接下來需要將製作好的根文件系統目錄 fs_mini_mdev_test 製作爲一個文件系統映像,因爲Linux內核目前還沒有配置支持yaffs2,所以使用jffs2來測試。

3.1. 安裝mtd-utils工具

sudo apt-get install mtd-utils

3.2. 製作jffs2文件系統

首先確保在文件目錄的上一級:

執行製作命令:

mkfs.jffs2 -n -s 2048 -e 128KiB -d fs_mini_mdev_test -o fs_mini_mdev_test.jffs2

這些參數的意思爲:

  • -n:不要在每個擦除塊上都加上清除標誌;
  • -s 2048:指明一頁大小爲2048字節;
  • -e 128KiB:指明一個擦除扇區大小爲128KB;
  • -d fs_mini_mdev_test:指定要打包的根文件系統目錄;
  • -o fs_mini_mdev_test.jffs2:指明輸出的映像文件名稱;

製作完成:

3.3. 燒寫測試

參考教程:uboot研讀筆記 | 10 - 移植uboot 2012.04到JZ2440(燒寫Linux內核、燒寫yaffs2文件系統)

將該文件系統映像下載到windows主機中,存放到TFTP服務器目錄,然後在開發板中使用uboot燒錄nand flash中:

tftp 30000000 fs_mini_mdev_test.jffs2
nand erase.part filesystem
nand write.jffs2 30000000 260000 678c24


然後設置環境變量:

set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2
saveenv


重啓開發板,測試是否可以掛載成功:

reset

3.4. 解決問題

這個問題是因爲編譯器編譯時使用了eabi接口(Embedded Application Binary Interface,嵌入式應用二進制接口),但是內核中沒有開啓配置,所以內核提示這是非法指令。

解決方案就是:在內核中配置支持該接口

進入內核目錄:

make menuconfig

進入 Kernel Features :

選中圖中這一項即可:

然後退出,保存設置,重新編譯內核:

make uImage

編譯成功後,內核大小爲2361KB,超過劃分的2MB分區,所以不能燒寫到nand flash中,直接使用tftp下載到內存中運行,後續文章中裁剪內核<2MB之後才能燒寫到內核中!

重新燒寫內核,啓動進行測試:

tftp 30000000 uImage
bootm 30000000

啓動之後,可以看到Linux內核啓動成功,根文件系統掛載成功,成功進入Linux命令行:

接收更多精彩文章及資源推送,歡迎訂閱我的微信公衆號:『mculover666』

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章