主题 : Linux 2.6.29.4 for FriendlyARM内核分区表所在位置 复制链接 | 浏览器收藏 | 打印
奔跑的蜗牛……
级别: 侠客
UID: 11357
精华: 4
发帖: 69
金钱: 565 两
威望: 125 点
综合积分: 218 分
注册时间: 2009-12-04
最后登录: 2013-04-05
楼主  发表于: 2010-04-24 12:29

 Linux 2.6.29.4 for FriendlyARM内核分区表所在位置

让老的Linux 2.6.29.4内核支持最新的supervivi-128M-0945启动。
Linux 2.6.29.4 for FriendlyARM内核分区表所在位置。



用新的supervivi-128M-0945烧写老的Linux 2.6.29.4的内核是无法正常启动的。
会出现kernel panic(内核恐慌),启动日志上会显示无法找到rootfs(根文件系统)分区,无法正常打开。


这主要是因为老的内核分区表是将NAND分了四个区:
分别是0-320K,320K-2368K,2368K-1G这三个分区和0-1G的整个NAND分区(据友善之臂官方解释是,这样分区会方便操作整个NAND FLASH,例如备份和恢复整块NAND FLASH)
Linux 2.6.29.4的内核分区表所在位置为linux-2.6.29/arch/arm/plat-s3c24xx/common-friendly-arm.c文件中。



当初查找这个分区表所在文件的位置时费了不小劲。其实最简单的方法就是用Source Insight来分析源码,查找static struct mtd_partition在哪里实现了即可。当然在Linux中可以使用WINE工具来使用Source Insight。也可以使用以下方法查找。
查找方法:
grep "static struct mtd_partition" ./ -rn


用此方法查找的时候最好把不用的架构例如MIPS,AVR等都统统删掉,不然你查找到的内容将非常多,查找有用信息将比较困难。



当然如果直接知道linux-2.6.29的内核分区表在某个文件名包含friendly字符的文件里的时候,也可以使用以下命令直接查找这个文件:
[root@localhost linux-2.6.29]# find ./ -name "*friendly*"
./arch/arm/plat-s3c24xx/include/plat/common-friendly-arm.h
./arch/arm/plat-s3c24xx/common-friendly-arm.c
然后依次查看两个文件,搜索 mtd_partition 结构体。


因为最新的supervivi-128M-0945将NAND分了五个区。
分别为0-256K,256K-384K,384K-5504K,5504K-1G这三个分区和0-1G的整个NAND分区
修改原来的分区表修改为以下内容(加粗部分是要修改的,特别要注意):
static struct mtd_partition friendly_arm_default_nand_part[] = {
        [0] = {
                .name   = "supervivi",
                .size   = 0x00040000,
                .offset = 0,
        },
        [1] = {
                .name   = "boot_parameters",
                .size   = 0x00020000,
                .offset = 0x00040000,
        },

        [2] = {
                .name   = "kernel",
                .offset = 0x00060000,
                .size   = 0x00500000,

        },
       [3] = {
                .name   = "root_fs",
                .offset = 0x00560000,
                .size   = 1024 * 1024 * 1024, //64U * 1024 * 1024 - 0x00560000,
        },
       [4] = {
                .name   = "nand",
                .offset = 0x00000000,
                .size   = 1024 * 1024 * 1024, //64U * 1024 * 1024 - 0x00260000,
        }
};


注:原始的demo板smdk2410的内核分区表在common-smdk.c文件里。
所在位置是:linux-2.6.29/arch/arm/plat-s3c24xx/common-smdk.c
[ 此帖被cs2003happy在2010-05-31 18:38重新编辑 ]
Continue Study of Embedded Linux Development and Application

奔跑的蜗牛……