arm linux 分区

arm linux启动是靠uboot来引导的,而u-boot的一个作用就是探测arm内存分区及大小。然后通过tags的形式传递给内核。

这就给了我们对内存分区进行修改或者说自定义的机会。主要有一下三种方法:

一,在u-boot源代码中,通过修改arm板文件的形式来定义内存分区。
分区方法

1)MTD层的分区

2)通过U-boot传递给内核的命令行中的mtdparts=...

3)其他可以让内核知道分区信息的任何办法,(内核默认的命令参数)

下面说到mtdparts,及它的用法:

mtdparts 

mtdparts=fc000000.nor_flash:1920k(linux),128k(fdt),20M(ramdisk),4M(jffs2),382

72k(user),256k(env),384k(uboot)要想这个参数起作用,
内核中的mtd驱动必须要支持,即内核配置时需要选上

Device Drivers  --->

    Memory Technology Device (MTD) support  --->

    Command line partition table parsing

mtdparts的格式如下:

    mtdparts=<mtddef>[;<mtddef]

    <mtddef>  := <mtd-id>:<partdef>[,<partdef>]

    <partdef> := <size>[@offset][<name>][ro]

    <mtd-id>  := unique id used in mapping driver/device

    <size>    := standard linux memsize OR "-" to denote all remaining space

    <name>    := (NAME)

因此你在使用的时候需要按照下面的格式来设置:

    mtdparts=mtd-id:<size1>@<offset1>(<name1>),<size2>@<offset2>(<name2>)


这有几个需要注意的地方:

    a.mtd-id 必须要跟你当前平台的flash的mtd-id一致,不然整个mtdparts会失效 怎样获取到

当前平台的flash的mtd-id?在bootargs参数列表中,可以指定当前flash的mtd-id,指定 mtdid

s:nand0=gen_nand.1,前面的nand0则表示第一个flash

    b.size在设置的时候可以为实际的size(xxM,xxk,xx),也可以为'-'这表示剩余的所有空间。相

关信息可以查看drivers/mtd/cmdlinepart.c中的注释找到相关描述。

U-boot环境变量有两个,他们分别是: bootcmd 和bootargs。

至于在我们自己的at91sam9263ek板子上为了实现mtdparts分区命令的支持需要在U-boot

-2010.06/include/configs/at91sam9263ek.h中添加相关的宏定义:

#define CONFIG_CMD_MTDPARTS

#define CONFIG_MTD_DEVICE

#define CONFIG_MTD_PARTITIONS

加入MTD分区信息:

#define MTDIDS_DEFAULT "nand0=atmel_nand"

#define MTDPARTS_DEFAULT   "mtdparts=atmel_nand:15M@0(cramfs)," \

                           "15M(jffs2)," \

                           "30M(yaffs2)," \

                           "-(user)"
 

保存后退出,回到根目录,重新make

[root@localhost u-boot-2010.06]#make at91sam9263ek_dataflash_cs0_config

[root@localhost u-boot-2010.06]#make all
 
将重新编译的u-boot.bin烧到dataflash中,使用mtdparts查看分区:

U-Boot> mtdparts

device nand0 <atmel_nand>, # parts = 4

 #: name               size           offset         mask_flags

 0: cramfs             0x00f00000     0x00000000     0

 1: jffs2              0x00f00000     0x00f00000     0

 2: yaffs2             0x01e00000     0x01e00000     0

 3: user               0x04400000     0x03c00000     0

active partition: nand0,0 - (cramfs) 0x00f00000 @ 0x00000000

defaults:

mtdids : nand0=atmel_nand

mtdparts: mtdparts=atmel_nand:15M@0(cramfs),15M(jffs2),30M(yaffs2),-(user)
 
重新设置分区:

U-Boot> setenv mtdparts mtdparts=atmel_nand:30M@0(a),30M(b),-(c)

U-Boot> save

Saving Environment to dataflash...

U-Boot> mtdparts

device nand0 <atmel_nand>, # parts = 3

 #: name               size           offset         mask_flags

 0: a                  0x01e00000     0x00000000     0

 1: b                  0x01e00000     0x01e00000     0

 2: c                  0x04400000     0x03c00000     0

active partition: nand0,0 - (a) 0x01e00000 @ 0x00000000

defaults:

mtdids : nand0=atmel_nand

mtdparts: mtdparts=atmel_nand:15M@0(cramfs),15M(jffs2),30M(yaffs2),-(user)

可以看到,我们可以手动设置分区了。最后还要恢复默认。

U-Boot>mtdparts default
 

二,在u-boot启动后,通过参数mem=xxM的方式告诉内核分区信息。不仅有内存大小,还可以包括分区大小及各个分区的起始位置信息。

 

对于目前的U-boot而言,是的.而且, 设置了mtdparts变量之后,你可以在nand read/write/erase命令中直接使用分区的名字而不必指定分区的偏移位置.

set bootargs noinitrd console=ttySAC0 root=/dev/mtdblock3 rootfstype=jffs2  mtdparts=nand_flash:128k(u-boot)ro,64k(u-boot envs),3m(kernel),30m(root.jffs2),30m(root.yaffs) 

 

事实上,bootargs中的"root=/dev/mtdblockx"只是告诉内核,root fs从第x个(x=0,1,2...)MTD分区挂载,mtdblock0对应第一个分区,mtdblock1对应第二个分区,以此类推.至于这个分区对应MTD device(NAND Flash)的哪一段范围,取决于内核读到的MTD分区信息,这个分区信息可以通过:

1) 写死在MTD层的NAND Controller驱动或者内核其他部分代码里

2) 通过U-boot传递给内核的命令行中的mtdparts=...部分解析得出,解析的规则同u-boot中mtdparts变量的赋值规则

3) 其他可以让内核知道分区信息的任何办法

 

1). 假设文件系统是ramdisk,且直接就在内存中,bootargs的设置应该如下: setenv bootargs ‘initrd=0x32000000,0xa00000 root=/dev/ram0 console=ttySAC0 mem=64M init=/linuxrc’

2). 假设文件系统是ramdisk,且在flash中,bootargs的设置应该如下: setenv bootargs ‘mem=32M console=ttyS0,115200 root=/dev/ram rw init=/linuxrc’ 注意这种情况下你应该要在bootm命令中指定ramdisk在flash中的地址,如bootm kernel_addr ramdisk_addr (fdt_addr)

3). 假设文件系统是jffs2类型的,且在flash中,bootargs的设置应该如下 setenv bootargs ‘mem=32M console=ttyS0,115200 noinitrd root=/dev/mtdblock2 rw rootfstype=jffs2 init=/linuxrc’

4). 假设文件系统是基于nfs的,bootargs的设置应该如下 setenv bootargs ‘noinitrd mem=64M console=ttySAC0 root=/dev/nfs nfsroot=192.168.0.3:/nfs

ip=192.168.0.5:192.168.0.3:192.168.0.3:255.255.255.0::eth0:off’ 或者 setenv bootargs ‘noinitrd mem=64M console=ttySAC0 root=/dev/nfs nfsroot=192.168.0.3:/nfs ip=192.168.0.5’


三,在内核源代码中,自定义分区信息。

修改linux-2.6.26.2/arch/arm/plat-s3c24xx/common-smdk.c的smdk_default_nand_part结构数组值,用清单56的内容替代清单55的内容。
static struct mtd_partition smdk_default_nand_part[] = {
       [0] = {
              .name     = "Boot Agent",
              .size = SZ_16K,
              .offset     = 0,
       },
       [1] = {
              .name     = "S3C2410 flash partition 1",
              .offset = 0,
              .size = SZ_2M,
       },
       [2] = {
              .name     = "S3C2410 flash partition 2",
              .offset = SZ_4M,
              .size = SZ_4M,
       },
       [3] = {
              .name     = "S3C2410 flash partition 3",
              .offset     = SZ_8M,
              .size = SZ_2M,
       },
       [4] = {
              .name     = "S3C2410 flash partition 4",
              .offset = SZ_1M * 10,
              .size = SZ_4M,
       },
       [5] = {
              .name     = "S3C2410 flash partition 5",
              .offset     = SZ_1M * 14,
              .size = SZ_1M * 10,
       },
       [6] = {
              .name     = "S3C2410 flash partition 6",
              .offset     = SZ_1M * 24,
              .size = SZ_1M * 24,
       },
       [7] = {
              .name     = "S3C2410 flash partition 7",
              .offset = SZ_1M * 48,
              .size = SZ_16M,
       }
};

--------------------------------------------------------------------------------

清单56 修改后smdk_default_nand_part结构数组值

--------------------------------------------------------------------------------

static struct mtd_partition smdk_default_nand_part[] = {
       [0] = {
             
                    name: "bootloader", 
                    size:    0x00100000,   
                    offset: 0x0,  
       },
       [1] = {
             
                    name: "kernel",
                    size:    0x00300000,
                    offset: 0x00100000,
       },
       [2] = {
             
                    name: "rootfs",
                    size:    0x03C00000,
                    offset: 0x00400000,
       }noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0,115200  
};

--------------------------------------------------------------------------------

6.3.2.      建立Nand Flash芯片支持
修改linux-2.6.26.2/arch/arm/plat-s3c24xx/common-smdk.c的smdk_nand_info结构的值,用清单58的内容替代清单57的内容。
清单57 修改前smdk_nand_info结构数组值
static struct s3c2410_platform_nand smdk_nand_info = {
       .tacls              = 20,
       .twrph0          = 60,
       .twrph1          = 20,
       .nr_sets   = ARRAY_SIZE(smdk_nand_sets),
       .sets        = smdk_nand_sets,
};
清单58 修改后smdk_nand_info结构数组值

--------------------------------------------------------------------------------

static struct s3c2410_platform_nand smdk_nand_info = {
       .tacls              = 0,
       .twrph0          = 30,
       .twrph1          = 0,
       .nr_sets   = ARRAY_SIZE(smdk_nand_sets),
       .sets        = smdk_nand_sets,
};


转载:http://blog.sina.com.cn/s/blog_af9acfc601016j9a.html

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值