S3C2440移植linux3.4.2內核之修改分區以及製作根文件系統

上一節S3C2440移植linux3.4.2內核之內核框架介紹及簡單修改我們簡單配置了內核,這節來根據繼續修改內核。

啓動內核

  內核啓動的打印信息如下圖所示
在這裏插入圖片描述

  可以看到內核有8個分區,而我們的uboot只有4個分區。

0x00000000-0x00040000 : "bootloader"            //存放uboot
0x00040000-0x00060000 : "params"                //存放環境變量
0x00060000-0x00260000 : "kernel"                //存放內核
0x00260000-0x10000000 : "rootfs"                  //存放文件系統

  所以接下來我們來修改內核分區

修改內核分區

  在si裏搜索上圖出現的”S3C2410 flash partition”字段,找到位於common-smdk.c中,裏面有個數組smdk_default_nand_part[],內容如下所示:
在這裏插入圖片描述
  修改smdk_default_nand_part[]數組(位於arch/arm/mach-s3c24xx/common-smdk.c)
修改爲:

static struct mtd_partition smdk_default_nand_part[] = {
         [0] = {
                   .name         = "bootloader",            //0x00000000-0x00040000  
                   .size  = SZ_256K,                      
                   .offset         = 0,
         },

         [1] = {
                   .name         = "params",                 //0x00040000-0x00060000
                   .offset = MTDPART_OFS_APPEND, 
                   .size  = SZ_128K,
         },

         [2] = {
                   .name         = "kernel",                  //0x00060000-0x00260000
                   .offset = MTDPART_OFS_APPEND,
                   .size  = SZ_2M,
         },

         [3] = {
                   .name         = "rootfs",                 //0x00260000-0x10000000
                   .offset         = MTDPART_OFS_APPEND,
                   .size  = MTDPART_SIZ_FULL,
         }
};

  上面部分宏的定義,如下所示:
  MTDPART_OFS_RETAIN: 填在offset裏,表示先後保留多少size空間大小
  MTDPART_OFS_NXTBLK: 填在offset裏,表示從下一個塊開始
  MTDPART_OFS_APPEND: 填在offset裏,表示該分區位置附加在上個分區結束的地址上
  MTDPART_SIZ_FULL: 填在size裏,表示剩下的內存size都歸於該分區
若需要mini2440的機器ID,則還需要修改mini2440單板對應的mach-mini2440.c
  因爲該單板的mtd分區也不對,將裏面的mini2440_default_nand_part[]內容改爲和上面一樣,拷貝文件到ubuntu重新編譯下載內核
在這裏插入圖片描述

燒寫yaffs2文件系統

  燒寫 /work/nfs_root fs_mini_mdev.yaffs2文件系統

nfs 30000000 192.168.1.30:/work/nfs_root/fs_mini_mdev.yaffs2
nand erase.part rootfs
nand write.yaffs 30000000 260000  889bc0

  啓動文件系統

set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=yaffs2 
nfs 32000000 192.168.1.30:/work/nfs_root/uImage_new
bootm 32000000

在這裏插入圖片描述
  打印信息表示不支持該內核不支持yaffs文件系統,然後嘗試使用ext3 ext2 cramfs vfat msdos iso9660等來掛載

燒寫jffs2文件系統

   在.config中搜索JFFS2,發現支持JFFS2文件系統
在這裏插入圖片描述
  下載文件系統

nfs 30000000 192.168.1.30:/work/nfs_root/fs_mini_mdev.jffs2
nand erase.part rootfs
nand write.jffs2 30000000 260000  $filesize
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2

  啓動後如圖所示
在這裏插入圖片描述
  表示jffs2已掛載,但是找不到init程序,因爲這個文件系統的glibc庫是交叉編譯3.4版本的,由於3.4內核的交叉編譯是4.3版本,所以不支持,接下來我們便重新制作文件系統

構造根文件系統

詳細步驟可參考構建根文件系統

安裝busybox

  首先編譯安裝busybox(參考以前的busybox安裝章節)進入

https://busybox.net/下載busybox 1.20.0
tar -xjf busybox-1.20.0.tar.bz2
cd busybox-1.20.0
make menuconfig          //設置交叉編譯前綴
進入Busybox Settings --->Build Options --->() Cross Compiler prefix
在彈出的對話框裏面寫入:arm-linux-
make          //編譯
mkdir   /work/nfs_root/fs_mini_mdev_new            //創建要安裝的文件系統目錄      
make install CONFIG_PREFIX=/work/nfs_root/fs_mini_mdev_new   //指定安裝位置

  安裝完成後有了各種目錄
在這裏插入圖片描述

安裝glibc庫

  輸入$PATH找到交叉編譯位於/work/tools/arm-linux-gcc-4.3.2/usr/local/arm/4.3.2位置,
  通過find -name lib,找到有以下幾個lib
在這裏插入圖片描述
  由於ARM9屬於ARMv4T架構,所以拷貝上面第三個第四個lib到fs_mini_mdev_new裏

mkdir /work/nfs_root/fs_mini_mdev_new/lib
mkdir /work/nfs_root/fs_mini_mdev_new/usr/lib -p  
cp arm-none-linux-gnueabi/libc/armv4t/usr/lib/*.so* /work/nfs_root/fs_mini_mdev_new/usr/lib -d           /* -d:保持鏈接 */
cp arm-none-linux-gnueabi/libc/armv4t/lib/*.so* /work/nfs_root/fs_mini_mdev_new/lib -d

構造etc目錄

cp 原來的etc  fs_mini_mdev_new  -rf

構造其它文件/目錄

  1)創建終端文件(dev/console和dev/null)

sudo mknod –m 660  dev/console c 5 1
sudo mknod –m 660 dev/null c 1 3 

  2)創建其它目錄

mkdir mnt tmp root proc  sys root

製作jffs2映像文件

  由於mkfs.jffs2工具之前已經安裝好了,所以直接使用mkfs.jffs2命令:

cd /work/nfs_root/                 //返回到上個目錄
mkfs.jffs2 -n  -s 2048  -e 128KiB  -d fs_mini_mdev_new  -o fs_mini_mdev_new.jffs2
//-n:表示每塊不添加清除標記,-s:NAND的每頁爲2k,-e: NAND的每塊爲128kb
//-d fs_mini_mdev_new:表示要製作的根文件系統文件
//-o fs_mini_mdev_new.jffs2:表示生成的映像文件

  燒寫jffs2,啓動內核

nfs 30000000 192.168.2.106:/work/nfs_root/fs_mini_mdev_new.jffs2
nand erase.part rootfs
nand write.jffs2 30000000 260000  $filesize
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2
nfs 32000000 192.168.2.106:/work/nfs_root/uImage_new
bootm 32000000

  啓動內核
  打印如下圖所示:
在這裏插入圖片描述

配置EABI

  進入si,搜索exitcode,找到0x00000004對應的宏定義是SIGILL,表示非法指令,是因爲arm-linux-gcc-4.3.2是使用的EABI接口,內核由於未配置,所以出現非法
  配置內核支持EABI
  輸入make menuconfig,搜索EABI,找到位於:

kernel feature->

[*] Use the ARM EABI to compile the kernel         
make uImage

  重新編譯燒寫內核就沒問題了。
  下一節S3C2440移植linux3.4.2內核之支持YAFFS文件系統我們將修改內核支持yaffs文件系統。

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