1 uboot的啓動流程linux
由uboot的啓動流程可知,最後階段將會傳來兩個關鍵的參數。一個是機器id,另外一個是tag參數地址。而內核的任務是根據機器id選擇/判斷是否支持該機器,若是支持,則調用機器相關的初始化函數->解析TAG參數->裝載驅動程序->掛接根文件系統->啓動應用程序git
2 移植kernel的過程函數
1 一. 內核啓動流程,據此配置內核(機器ID) 2 1.1 修改Makefile 3 1.2 選擇默認配置 : make s3c2410_defconfig 4 1.3 make uImage 5 6 步驟1: 7 在UBOOT裏: 8 set machid 16a // smdk2440 mach-smdk2440.c 9 或 10 set machid 7CF // mini2440 mach-mini2440.c 11 12 步驟2: 13 arch\arm\mach-s3c24xx\mach-smdk2440.c 14 s3c24xx_init_clocks(16934400); 15 改成 16 s3c24xx_init_clocks(12000000); 17 18 步驟3: 19 配置/編譯: make s3c2410_defconfig 或 make mini2440_defconfig 20 make uImage 21 22 步驟4: 23 在uboot裏:set bootargs console=ttySAC0,115200 ..... 24 25 26 27 28 uboot的默認MACH ID: 29 gd->bd->bi_arch_number = MACH_TYPE_SMDK2410; // 193 30 若是s = getenv("machid");成功,則使用它 31 不然使用默認的 32 33 set machid 16a // smdk2440 mach-smdk2440.c 34 set machid 7CF // mini2440 mach-mini2440.c 35 36 nfs 32000000 192.168.1.123:/work/nfs_root/uImage_new 37 bootm 32000000 38 39 二. 修改分區, 製做新的文件系統 40 41 42 nfs 30000000 192.168.1.123:/work/nfs_root/fs_mini_mdev.yaffs2 43 nand erase.part rootfs 44 nand write.yaffs 30000000 260000 889bc0 45 46 nfs 30000000 192.168.1.123:/work/nfs_root/fs_mini_mdev.jffs2 47 nand erase.part rootfs 48 nand write.jffs2 30000000 260000 $filesize 49 set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2 50 51 52 製做文件系統 53 1. 交叉編譯busybox 54 安裝:make install CONFIG_PREFIX=/work/nfs_root/fs_mini_mdev_new 55 56 2. 安裝庫 57 mkdir /work/nfs_root/fs_mini_mdev_new/lib 58 mkdir /work/nfs_root/fs_mini_mdev_new/usr/lib -p 59 60 cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib/*so* /work/nfs_root/fs_mini_mdev_new/lib -d 61 cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/usr/lib/*so* /work/nfs_root/fs_mini_mdev_new/usr/lib -d 62 63 3. 構建etc目錄 64 4. 構建dev目錄 65 5. 其餘空目錄 66 67 mkfs.jffs2 -n -s 2048 -e 128KiB -d fs_mini_mdev_new -o fs_mini_mdev_new.jffs2 68 69 燒寫: 70 nfs 30000000 192.168.1.123:/work/nfs_root/fs_mini_mdev_new.jffs2 71 nand erase.part rootfs 72 nand write.jffs2 30000000 260000 $filesize 73 set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2 74 nfs 32000000 192.168.1.123:/work/nfs_root/uImage_new 75 bootm 32000000 76 77 SIGILL illegal instruction 78 6. 從新配置內核支持EABI 79 set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2 80 nfs 32000000 192.168.1.123:/work/nfs_root/uImage_eabi 81 bootm 32000000 82 83 三. 移植YAFFS文件系統 84 1. 得到源碼 85 git clone git://www.aleph1.co.uk/yaffs2 86 87 2. 打補丁 88 89 cd yaffs-dir 90 ./patch-ker.sh c m linux-tree 好比 ./patch-ker.sh c m /work/system/linux-3.4.2 91 92 3. 配置內核支持YAFFS 93 94 4. 編譯、使用uImage 95 96 5. 製做、燒寫yaffs映象 97 mkyaffs2image fs_mini_mdev_new fs_mini_mdev_new.yaffs2 98 uboot: 99 nfs 30000000 192.168.1.123:/work/nfs_root/fs_mini_mdev_new.yaffs2 100 nand erase.part rootfs 101 nand write.yaffs 30000000 260000 $filesize 102 103 6. 啓動 104 set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 105 nfs 32000000 192.168.1.123:/work/nfs_root/uImage_yaffs 106 bootm 32000000 107 108 7. 沒成功,用替代法查找問題 109 7.1 UBOOT可能有問題:換上1.1.6的UBOOT 110 tftp 30000000 u-boot.bin 111 nand erase.part u-boot 112 nand write 30000000 u-boot 113 reset 114 nfs 30000000 192.168.1.123:/work/nfs_root/fs_mini_mdev_new.yaffs2 115 nand erase rootfs 116 nand write.yaffs 30000000 260000 $(filesize) 117 set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 118 nfs 32000000 192.168.1.123:/work/nfs_root/uImage_yaffs 119 bootm 32000000 120 121 發現1.1.6的UBOOT沒問題,因此就是咱們移植的新UBOOT有BUG: 122 drivers\mtd\nand\Nand_util.c 123 124 if (!need_skip && !(flags & WITH_DROP_FFS)) { 125 改成 126 if (!need_skip && !(flags & WITH_DROP_FFS) && !(flags & WITH_YAFFS_OOB)) { 127 128 129 7.2 YAFFS映象可能有問題 130 131 132 製做了u-boot_new.bin, uImage_new, fs_mini_mdev_new.yaffs 133 重燒整個系統: 134 使用jtag工具燒u-boot_new.bin 135 或使用uboot來更新本身: tftp 30000000 u-boot_new.bin; nand erase.part u-boot; nand write 30000000 u-boot 136 啓動uboot,用它來燒寫內核、FS 137 tftp 30000000 uImage_new; nand erase.part kernel; nand write 30000000 kernel 138 tftp 30000000 fs_mini_mdev_new.yaffs2; nand erase.part rootfs; nand write.yaffs 30000000 260000 $filesize 139 140 設置參數 141 set 'nand read 30000000 kernel;bootm 30000000' 142 set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 143 set machid 16a 144 save 145 146 147 使用內核補丁: 148 patch -p1 < ../linux-3.4.2_100ask.patch 149 cp config_ok .config 150 make uImage